2
0

feat: rebrand to GitCaddy Server

Major rebrand from Gitea to GitCaddy Server:

Binary & Package:
- Rename binary from gitea to gitcaddy-server
- Update Makefile EXECUTABLE variable
- Update Docker image name to gitcaddy/gitcaddy-server
- Update release artifact names

Environment Variables (backward compatible):
- Add GITCADDY__ prefix for config env vars
- Add GITCADDY_WORK_DIR and GITCADDY_CUSTOM
- Keep GITEA__ and GITEA_* as fallback for compatibility

UI Branding:
- Update footer to Powered by GitCaddy Server
- Add Based on Gitea attribution in footer
- Update Swagger API title and description
- Update webhook placeholders

Code References:
- Update cmd/main.go app name, usage, description
- Update error messages in setting.go
- Add based_on locale key

This rebrand maintains full backward compatibility with existing
Gitea installations while establishing GitCaddy Server identity.
This commit is contained in:
GitCaddy
2026-01-12 20:27:32 +00:00
parent 8bc2b852eb
commit b92948cb0a
14 changed files with 52 additions and 35 deletions

View File

@@ -127,7 +127,7 @@ jobs:
- name: Build test binary - name: Build test binary
run: | run: |
go build -tags="bindata sqlite sqlite_unlock_notify" -o gitea . go build -tags="bindata sqlite sqlite_unlock_notify" -o gitcaddy-server .
- name: Generate test config - name: Generate test config
run: | run: |
@@ -182,7 +182,7 @@ jobs:
RESPONSE=$(curl -sf -X POST \ RESPONSE=$(curl -sf -X POST \
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \ -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d '{"tag_name":"'"$TAG"'","name":"Gitea '"$TAG"'","body":"Official release of Gitea '"$TAG"'.","draft":false,"prerelease":false}' \ -d '{"tag_name":"'"$TAG"'","name":"Gitea '"$TAG"'","body":"Official release of GitCaddy Server '"$TAG"'.","draft":false,"prerelease":false}' \
"https://direct.git.marketally.com/api/v1/repos/${{ github.repository }}/releases" 2>&1) "https://direct.git.marketally.com/api/v1/repos/${{ github.repository }}/releases" 2>&1)
if echo "$RESPONSE" | grep -q '"id":[0-9]'; then if echo "$RESPONSE" | grep -q '"id":[0-9]'; then
@@ -258,7 +258,7 @@ jobs:
EXT=".exe" EXT=".exe"
fi fi
OUTPUT="gitea-${VERSION}-${GOOS}-${GOARCH}${EXT}" OUTPUT="gitcaddy-server-${VERSION}-${GOOS}-${GOARCH}${EXT}"
go build -v -trimpath -tags "${TAGS}" -ldflags "${LDFLAGS}" -o "dist/${OUTPUT}" . go build -v -trimpath -tags "${TAGS}" -ldflags "${LDFLAGS}" -o "dist/${OUTPUT}" .

View File

@@ -41,7 +41,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1
ACTIONLINT_PACKAGE ?= github.com/rhysd/actionlint/cmd/actionlint@v1.7.9 ACTIONLINT_PACKAGE ?= github.com/rhysd/actionlint/cmd/actionlint@v1.7.9
DOCKER_IMAGE ?= gitea/gitea DOCKER_IMAGE ?= gitcaddy/gitcaddy-server
DOCKER_TAG ?= latest DOCKER_TAG ?= latest
DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG) DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG)
@@ -70,10 +70,10 @@ else ifeq ($(patsubst Windows%,Windows,$(OS)),Windows)
endif endif
ifeq ($(IS_WINDOWS),yes) ifeq ($(IS_WINDOWS),yes)
GOFLAGS := -v -buildmode=exe GOFLAGS := -v -buildmode=exe
EXECUTABLE ?= gitea.exe EXECUTABLE ?= gitcaddy-server.exe
else else
GOFLAGS := -v GOFLAGS := -v
EXECUTABLE ?= gitea EXECUTABLE ?= gitcaddy-server
endif endif
ifeq ($(shell sed --version 2>/dev/null | grep -q GNU && echo gnu),gnu) ifeq ($(shell sed --version 2>/dev/null | grep -q GNU && echo gnu),gnu)

View File

@@ -264,7 +264,7 @@ Download from [Releases](https://git.marketally.com/gitcaddy/gitea/releases):
```bash ```bash
# Linux (amd64) # Linux (amd64)
curl -L -o gitcaddy https://git.marketally.com/gitcaddy/gitea/releases/latest/download/gitea-linux-amd64 curl -L -o gitcaddy-server https://git.marketally.com/gitcaddy/gitea/releases/latest/download/gitcaddy-server-linux-amd64
chmod +x gitcaddy chmod +x gitcaddy
./gitcaddy web ./gitcaddy web
``` ```
@@ -275,7 +275,7 @@ chmod +x gitcaddy
git clone https://git.marketally.com/gitcaddy/gitea.git git clone https://git.marketally.com/gitcaddy/gitea.git
cd gitea cd gitea
TAGS="bindata sqlite sqlite_unlock_notify" make build TAGS="bindata sqlite sqlite_unlock_notify" make build
./gitea web ./gitcaddy-server web
``` ```
### Docker ### Docker

View File

@@ -86,9 +86,9 @@ type AppVersion struct {
func NewMainApp(appVer AppVersion) *cli.Command { func NewMainApp(appVer AppVersion) *cli.Command {
app := &cli.Command{} app := &cli.Command{}
app.Name = "gitea" // must be lower-cased because it appears in the "USAGE" section like "gitea doctor [command [command options]]" app.Name = "gitcaddy-server" // must be lower-cased because it appears in the "USAGE" section like "gitea doctor [command [command options]]"
app.Usage = "A painless self-hosted Git service" app.Usage = "GitCaddy Server - A painless self-hosted Git service"
app.Description = `Gitea program contains "web" and other subcommands. If no subcommand is given, it starts the web server by default. Use "web" subcommand for more web server arguments, use other subcommands for other purposes.` app.Description = `GitCaddy Server contains "web" and other subcommands. If no subcommand is given, it starts the web server by default. Use "web" subcommand for more web server arguments, use other subcommands for other purposes. Based on Gitea - https://gitea.io`
app.Version = appVer.Version + appVer.Extra app.Version = appVer.Version + appVer.Extra
app.EnableShellCompletion = true app.EnableShellCompletion = true
app.Flags = []cli.Flag{ app.Flags = []cli.Flag{

View File

@@ -14,6 +14,9 @@ import (
) )
const ( const (
// EnvConfigKeyPrefixGitCaddy is the primary prefix for GitCaddy environment variables
EnvConfigKeyPrefixGitCaddy = "GITCADDY__"
// EnvConfigKeyPrefixGitea is the legacy prefix for backward compatibility
EnvConfigKeyPrefixGitea = "GITEA__" EnvConfigKeyPrefixGitea = "GITEA__"
EnvConfigKeySuffixFile = "__FILE" EnvConfigKeySuffixFile = "__FILE"
) )
@@ -24,7 +27,8 @@ var escapeRegex = regexp.MustCompile(escapeRegexpString)
func CollectEnvConfigKeys() (keys []string) { func CollectEnvConfigKeys() (keys []string) {
for _, env := range os.Environ() { for _, env := range os.Environ() {
if strings.HasPrefix(env, EnvConfigKeyPrefixGitea) { // Support both GITCADDY__ and GITEA__ prefixes
if strings.HasPrefix(env, EnvConfigKeyPrefixGitCaddy) || strings.HasPrefix(env, EnvConfigKeyPrefixGitea) {
k, _, _ := strings.Cut(env, "=") k, _, _ := strings.Cut(env, "=")
keys = append(keys, k) keys = append(keys, k)
} }
@@ -41,7 +45,7 @@ func ClearEnvConfigKeys() {
// decodeEnvSectionKey will decode a portable string encoded Section__Key pair // decodeEnvSectionKey will decode a portable string encoded Section__Key pair
// Portable strings are considered to be of the form [A-Z0-9_]* // Portable strings are considered to be of the form [A-Z0-9_]*
// We will encode a disallowed value as the UTF8 byte string preceded by _0X and // We will encode a disallowed value as the UTF8 byte string preceded by _0X and
// followed by _. E.g. _0X2C_ for a '-' and _0X2E_ for '.' // followed by _. E.g. _0X2C_ for a '-', and _0X2E_ for '.'.
// Section and Key are separated by a plain '__'. // Section and Key are separated by a plain '__'.
// The entire section can be encoded as a UTF8 byte string // The entire section can be encoded as a UTF8 byte string
func decodeEnvSectionKey(encoded string) (ok bool, section, key string) { func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
@@ -96,16 +100,22 @@ func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
} }
// decodeEnvironmentKey decode the environment key to section and key // decodeEnvironmentKey decode the environment key to section and key
// The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE // The environment key is in the form of GITCADDY__SECTION__KEY or GITEA__SECTION__KEY (legacy)
func decodeEnvironmentKey(prefixGitea, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) { // or GITCADDY__SECTION__KEY__FILE / GITEA__SECTION__KEY__FILE
if !strings.HasPrefix(envKey, prefixGitea) { func decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) {
var prefix string
if strings.HasPrefix(envKey, prefixGitCaddy) {
prefix = prefixGitCaddy
} else if strings.HasPrefix(envKey, prefixGitea) {
prefix = prefixGitea
} else {
return false, "", "", false return false, "", "", false
} }
if strings.HasSuffix(envKey, suffixFile) { if strings.HasSuffix(envKey, suffixFile) {
useFileValue = true useFileValue = true
envKey = envKey[:len(envKey)-len(suffixFile)] envKey = envKey[:len(envKey)-len(suffixFile)]
} }
ok, section, key = decodeEnvSectionKey(envKey[len(prefixGitea):]) ok, section, key = decodeEnvSectionKey(envKey[len(prefix):])
return ok, section, key, useFileValue return ok, section, key, useFileValue
} }
@@ -119,7 +129,7 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
// parse the environment variable to config section name and key name // parse the environment variable to config section name and key name
envKey := before envKey := before
envValue := after envValue := after
ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(EnvConfigKeyPrefixGitea, EnvConfigKeySuffixFile, envKey) ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(EnvConfigKeyPrefixGitCaddy, EnvConfigKeyPrefixGitea, EnvConfigKeySuffixFile, envKey)
if !ok { if !ok {
continue continue
} }
@@ -167,20 +177,25 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
return changed return changed
} }
// InitGiteaEnvVars initializes the environment variables for gitea // InitGitCaddyEnvVars initializes the environment variables for GitCaddy Server
func InitGiteaEnvVars() { func InitGitCaddyEnvVars() {
// Ideally Gitea should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want, // Ideally GitCaddy should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want,
// but the ideal behavior would be a breaking change, and it seems not bringing enough benefits to end users, // but the ideal behavior would be a breaking change, and it seems not bringing enough benefits to end users,
// so at the moment we could still keep "unsetting the unnecessary environments" // so at the moment we could still keep "unsetting the unnecessary environments"
// HOME is managed by Gitea, Gitea's git should use "HOME/.gitconfig". // HOME is managed by GitCaddy, GitCaddy's git should use "HOME/.gitconfig".
// But git would try "XDG_CONFIG_HOME/git/config" first if "HOME/.gitconfig" does not exist, // But git would try "XDG_CONFIG_HOME/git/config" first if "HOME/.gitconfig" does not exist,
// then our git.InitFull would still write to "XDG_CONFIG_HOME/git/config" if XDG_CONFIG_HOME is set. // then our git.InitFull would still write to "XDG_CONFIG_HOME/git/config" if XDG_CONFIG_HOME is set.
_ = os.Unsetenv("XDG_CONFIG_HOME") _ = os.Unsetenv("XDG_CONFIG_HOME")
} }
// InitGiteaEnvVars is an alias for InitGitCaddyEnvVars for backward compatibility
func InitGiteaEnvVars() {
InitGitCaddyEnvVars()
}
func InitGiteaEnvVarsForTesting() { func InitGiteaEnvVarsForTesting() {
InitGiteaEnvVars() InitGitCaddyEnvVars()
_ = os.Unsetenv("GIT_AUTHOR_NAME") _ = os.Unsetenv("GIT_AUTHOR_NAME")
_ = os.Unsetenv("GIT_AUTHOR_EMAIL") _ = os.Unsetenv("GIT_AUTHOR_EMAIL")
_ = os.Unsetenv("GIT_AUTHOR_DATE") _ = os.Unsetenv("GIT_AUTHOR_DATE")

View File

@@ -18,11 +18,11 @@ var (
// AppPath represents the path to the gitea binary // AppPath represents the path to the gitea binary
AppPath string AppPath string
// AppWorkPath is the "working directory" of Gitea. It maps to the: WORK_PATH in app.ini, "--work-path" flag, environment variable GITEA_WORK_DIR. // AppWorkPath is the "working directory" of GitCaddy. It maps to the: WORK_PATH in app.ini, "--work-path" flag, environment variable GITCADDY_WORK_DIR (or GITEA_WORK_DIR for backward compatibility).
// If that is not set it is the default set here by the linker or failing that the directory of AppPath. // If that is not set it is the default set here by the linker or failing that the directory of AppPath.
// It is used as the base path for several other paths. // It is used as the base path for several other paths.
AppWorkPath string AppWorkPath string
CustomPath string // Custom directory path. Env: GITEA_CUSTOM CustomPath string // Custom directory path. Env: GITCADDY_CUSTOM (or GITEA_CUSTOM for backward compatibility)
CustomConf string CustomConf string
appWorkPathBuiltin string appWorkPathBuiltin string

View File

@@ -96,7 +96,7 @@ func InitCfgProvider(file string) {
func MustInstalled() { func MustInstalled() {
if !InstallLock { if !InstallLock {
log.Fatal(`Unable to load config file for a installed Gitea instance, you should either use "--config" to set your config file (app.ini), or run "gitea web" command to install Gitea.`) log.Fatal(`Unable to load config file for a installed GitCaddy instance, you should either use "--config" to set your config file (app.ini), or run "gitcaddy-server web" command to install Gitea.`)
} }
} }
@@ -176,9 +176,9 @@ func loadRunModeFrom(rootCfg ConfigProvider) {
if os.Getuid() == 0 { if os.Getuid() == 0 {
if !unsafeAllowRunAsRoot { if !unsafeAllowRunAsRoot {
// Special thanks to VLC which inspired the wording of this messaging. // Special thanks to VLC which inspired the wording of this messaging.
log.Fatal("Gitea is not supposed to be run as root. Sorry. If you need to use privileged TCP ports please instead use setcap and the `cap_net_bind_service` permission") log.Fatal("GitCaddy Server is not supposed to be run as root. Sorry. If you need to use privileged TCP ports please instead use setcap and the `cap_net_bind_service` permission")
} }
log.Critical("You are running Gitea using the root user, and have purposely chosen to skip built-in protections around this. You have been warned against this.") log.Critical("You are running GitCaddy Server using the root user, and have purposely chosen to skip built-in protections around this. You have been warned against this.")
} }
} }

View File

@@ -13,6 +13,7 @@
"register": "Register", "register": "Register",
"version": "Version", "version": "Version",
"powered_by": "Powered by %s", "powered_by": "Powered by %s",
"based_on": "Based on",
"page": "Page", "page": "Page",
"template": "Template", "template": "Template",
"language": "Language", "language": "Language",

View File

@@ -1,7 +1,8 @@
<footer class="page-footer" role="group" aria-label="{{ctx.Locale.Tr "aria.footer"}}"> <footer class="page-footer" role="group" aria-label="{{ctx.Locale.Tr "aria.footer"}}">
<div class="left-links" role="contentinfo" aria-label="{{ctx.Locale.Tr "aria.footer.software"}}"> <div class="left-links" role="contentinfo" aria-label="{{ctx.Locale.Tr "aria.footer.software"}}">
{{if ShowFooterPoweredBy}} {{if ShowFooterPoweredBy}}
<a target="_blank" rel="noopener noreferrer" href="https://about.gitea.com">{{ctx.Locale.Tr "powered_by" "Gitea"}}</a> <span>{{ctx.Locale.Tr "powered_by" "GitCaddy Server"}}</span>
<span class="tw-text-secondary tw-text-12">{{ctx.Locale.Tr "based_on"}} <a target="_blank" rel="noopener noreferrer" href="https://about.gitea.com">Gitea</a></span>
{{end}} {{end}}
{{if (or .ShowFooterVersion .PageIsAdmin)}} {{if (or .ShowFooterVersion .PageIsAdmin)}}
{{ctx.Locale.Tr "version"}}: {{ctx.Locale.Tr "version"}}:

View File

@@ -7,7 +7,7 @@
</div> </div>
<div class="field"> <div class="field">
<label for="username">{{ctx.Locale.Tr "repo.settings.discord_username"}}</label> <label for="username">{{ctx.Locale.Tr "repo.settings.discord_username"}}</label>
<input id="username" name="username" value="{{.DiscordHook.Username}}" placeholder="Gitea"> <input id="username" name="username" value="{{.DiscordHook.Username}}" placeholder="GitCaddy">
</div> </div>
<div class="field"> <div class="field">
<label for="icon_url">{{ctx.Locale.Tr "repo.settings.discord_icon_url"}}</label> <label for="icon_url">{{ctx.Locale.Tr "repo.settings.discord_icon_url"}}</label>

View File

@@ -3,7 +3,7 @@
<form class="ui form" action="{{.BaseLink}}/packagist/{{or .Webhook.ID "new"}}" method="post"> <form class="ui form" action="{{.BaseLink}}/packagist/{{or .Webhook.ID "new"}}" method="post">
<div class="required field {{if .Err_Username}}error{{end}}"> <div class="required field {{if .Err_Username}}error{{end}}">
<label for="username">{{ctx.Locale.Tr "repo.settings.packagist_username"}}</label> <label for="username">{{ctx.Locale.Tr "repo.settings.packagist_username"}}</label>
<input id="username" name="username" value="{{.PackagistHook.Username}}" placeholder="Gitea" autofocus required> <input id="username" name="username" value="{{.PackagistHook.Username}}" placeholder="GitCaddy" autofocus required>
</div> </div>
<div class="required field {{if .Err_APIToken}}error{{end}}"> <div class="required field {{if .Err_APIToken}}error{{end}}">
<label for="api_token">{{ctx.Locale.Tr "repo.settings.packagist_api_token"}}</label> <label for="api_token">{{ctx.Locale.Tr "repo.settings.packagist_api_token"}}</label>

View File

@@ -12,7 +12,7 @@
<div class="field"> <div class="field">
<label for="username">{{ctx.Locale.Tr "repo.settings.slack_username"}}</label> <label for="username">{{ctx.Locale.Tr "repo.settings.slack_username"}}</label>
<input id="username" name="username" value="{{.SlackHook.Username}}" placeholder="Gitea"> <input id="username" name="username" value="{{.SlackHook.Username}}" placeholder="GitCaddy">
</div> </div>
<div class="field"> <div class="field">
<label for="icon_url">{{ctx.Locale.Tr "repo.settings.slack_icon_url"}}</label> <label for="icon_url">{{ctx.Locale.Tr "repo.settings.slack_icon_url"}}</label>

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>Gitea API</title> <title>GitCaddy API</title>
<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet"> <link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
</head> </head>
<body> <body>

View File

@@ -13,8 +13,8 @@
], ],
"swagger": "2.0", "swagger": "2.0",
"info": { "info": {
"description": "This documentation describes the Gitea API.", "description": "This documentation describes the GitCaddy Server API (based on Gitea).",
"title": "Gitea API", "title": "GitCaddy API",
"license": { "license": {
"name": "MIT", "name": "MIT",
"url": "http://opensource.org/licenses/MIT" "url": "http://opensource.org/licenses/MIT"