下面给出一套 **在 CentOS 上使用 Docker 快速部署 Git 服务器** 的完整思路与实操步骤。 你可以任选下面两种方案: | 方案 | 适合场景 | 资源占用 | 主要功能 | |------|----------|----------|----------| | **Gitea(轻量)** | 个人/小团队、需要 Web UI(代码浏览、Issue、PR)| < 1 GB RAM | 开箱即用的 Git 服务,界面友好,支持 LDAP/OAuth | | **GitLab CE(完整)** | 大团队、需要 CI/CD、Wiki、容器 Registry 等完整功能 | 至少 4 GB RAM(推荐 8 GB+)| 功能最全,但资源消耗大 | | **仅 SSH 裸仓库** | 只想通过 `git clone ssh://...` 访问、无 Web UI | 基本无额外资源 | 手动管理权限、最轻量 | 下面重点演示 **Gitea**(Docker Compose)+ **Nginx 反向代理 + Let’s Encrypt HTTPS** 的完整链路,兼顾易用性和安全。若你想直接跑 **GitLab**,请跳到章节 “2️⃣ 用 Docker 运行 GitLab CE”。 --- ## 1️⃣ 前期准备(CentOS 7/8) ```bash # 1. 安装 Docker(如果还没装) sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker && sudo systemctl enable docker # 2. 安装 Docker Compose(推荐 v2.x,最新版请自行替换) sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version # 看到版本号即成功 # 3. 防火墙 & SELinux(如果开启的话) sudo firewall-cmd --permanent --add-service=http --add-service=https sudo firewall-cmd --permanent --add-port=3000/tcp # Gitea Web sudo firewall-cmd --permanent --add-port=2222/tcp # Gitea SSH(容器内部 22 映射到 2222) sudo firewall-cmd --reload # SELinux(可选,若遇到卷挂载权限问题请先设为 permissive) sudo setenforce 0 # 测试阶段可直接关闭,生产环境请使用 chcon / semanage ``` > **提示**:如果机器内存 < 1 GB,请选 **仅 SSH 裸仓库**(后文的方案三),否则 Gitea 也能跑,但建议先把系统 Swap 开启: ```bash sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` --- ## 2️⃣ 使用 Docker Compose 部署 Gitea ### 2.1 创建项目目录 ```bash sudo mkdir -p /data/gitea && cd /data/gitea sudo chown -R $(id -u):$(id -g) /data/gitea # 让当前用户可写 ``` ### 2.2 编写 `docker-compose.yml` > **说明**:我们使用 **PostgreSQL** 作为 Gitea 的数据库(比 SQLite 更稳、适合长期运行)。如果只想单节点、磁盘空间有限,可以改用 SQLite(去掉 `db` 服务并把 `DB_TYPE` 改成 `sqlite3`),但建议使用 PostgreSQL。 ```yaml # /data/gitea/docker-compose.yml version: "3.8" services: gitea: image: gitea/gitea:1.21 # 使用最新的 LTS 版 container_name: gitea restart: always environment: - USER_UID=1000 - USER_GID=1000 # 下面三行是让 Gitea 知道它被放在什么端口(如果以后改 Nginx 反代,可保持不变) - HTTP_PORT=3000 - SSH_PORT=2222 - DOMAIN=git.example.com - ROOT_URL=https://git.example.com/ # 数据库配置 - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - GITEA__database__NAME=gitea - GITEA__database__USER=gitea - GITEA__database__PASSWD=mqFUjbWzf7utWA ports: - "3000:3000" - "2222:22" volumes: - ./gitea-data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro depends_on: - db networks: - gitea-net db: image: postgres:15-alpine restart: always environment: - POSTGRES_USER=gitea - POSTGRES_PASSWORD=mqFUjbWzf7utWA - POSTGRES_DB=gitea volumes: - postgres-data:/var/lib/postgresql/data networks: - gitea-net networks: gitea-net: driver: bridge volumes: gitea-data: postgres-data: ``` > **⚠️ 关键点** > 1. `USER_UID` / `USER_GID` 必须与宿主机上运行 Docker 进程的用户对应(通常是 `1000`),否则 Gitea 生成的仓库文件权限会报错。 > 2. `DOMAIN`、`ROOT_URL` 换成你自己的域名,后面 Nginx 反代时需要匹配。 > 3. `SSH_PORT=2222` 表示容器内部 SSH 监听在 22,而我们在 `ports` 里把它映射到宿主机的 **2222**(避免冲突本机 22 端口)。 > 4. **密码** 一定要改成强密码,最好使用 `openssl rand -base64 32` 生成随机字符串。 ### 2.3 启动并检查 ```bash cd /data/gitea docker-compose up -d # 后台启动 docker-compose logs -f gitea # 查看日志,出现 “HTTP Listen: :3000” 表示成功 ``` > **第一次访问**:打开浏览器,访问 `http://<服务器IP>:3000`,会看到 Gitea 的 **安装向导**(设置管理员账号、数据库、域名等),完成后即进入主页。 ### 2.4 (可选)配置 Systemd 监控 Docker Compose ```bash sudo tee /etc/systemd/system/gitea.service < **前置条件**:已拥有域名 `git.example.com`,并在 DNS 处把 `git.example.com` A 记录指向服务器 IP。 ### 3.1 安装 Nginx 与 Certbot ```bash sudo yum install -y epel-release sudo yum install -y nginx certbot python3-certbot-nginx ``` ### 3.2 创建 Nginx 配置 ```bash sudo tee /etc/nginx/conf.d/gitea.conf < **证书自动续期**:Certbot 已自带定时任务,可通过 `systemctl status certbot renew.timer` 检查;亦可手动测试:`sudo certbot renew --dry-run`。 ### 3.4 防火墙放行 80/443 ```bash sudo firewall-cmd --permanent --add-service=http --add-service=https sudo firewall-cmd --reload ``` ### 3.5 验证 HTTPS 在浏览器打开 `https://git.example.com`,应该能看到 Gitea 的登录页面,且浏览器地址栏显示绿色锁标。 --- ## 4️⃣ 基本运维 & 安全加固 | 项目 | 操作建议 | |------|----------| | **管理员账号** | 首次安装后立刻在 Gitea UI 创建管理员(不要使用默认的 `root` 或弱密码)。 | | **强制 HTTPS** | Gitea 配置 `DISABLE_HTTP_GIT` 为 `true`,确保 `git clone` 只能走 `ssh://` 或 `https://`。 | | **SSH 密钥** | 所有开发者在 Gitea 个人设置里上传公钥,克隆时使用 `git clone ssh://git@git.example.com:2222//.git`。 | | **邮件通知** | 在 `gitea-data/gitea/conf/app.ini`(或在 `docker-compose.yml` 中 `GITEA__mailer__` 环境变量)配置 SMTP,使密码重置、PR/Issue 事件能收到邮件。 | | **备份** | 定期把 `gitea-data`(仓库、数据库)tar.gz 备份到另一台机器。
示例:`tar czf /backup/gitea-$(date +%F).tar.gz -C /data/gitea gitea-data postgres-data` | | **升级 Gitea** |
docker-compose pull
docker-compose up -d
| | **日志查看** | `docker-compose logs -f --tail=200` | | **资源限制** | 若机器内存紧张,可在 `docker-compose.yml` 中为服务添加 `mem_limit`、`cpus` 参数。 | | **防火墙** | 只保留 **22**(宿主机 SSH) **2222**(Gitea SSH) **80/443**(Nginx) 端口,其他默认关闭。 | --- ## 5️⃣ 若想使用 GitLab CE(Docker) > **注意**:GitLab 官方镜像非常大(≥ 2 GB),首次启动需要 4‑8 GB RAM 才能正常运行。下面给出 **最小化** 配置示例,若机器资源不足请跳过此节。 ### 5.1 `docker-compose.yml`(GitLab CE) ```yaml version: "3.8" services: gitlab: image: gitlab/gitlab-ce:latest hostname: git.example.com restart: always environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://git.example.com' nginx['enable'] = true nginx['ssl_certificate'] = '/etc/gitlab/ssl/fullchain.pem' nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/privkey.pem' # 最小资源限制(建议在实际部署时把下面两行删除,以使用默认资源) unicorn['worker_processes'] = 2 sidekiq['concurrency'] = 2 ports: - "22:22" - "80:80" - "443:443" volumes: - gitlab-config:/etc/gitlab - gitlab-log:/var/log/gitlab - gitlab-data:/var/opt/gitlab shm_size: '256m' # 防止 GitLab 因为 /dev/shm 太小而崩溃 ``` > **启动**:`docker-compose up -d` > **首次登录**:访问 `https://git.example.com`,系统会自动生成 `root` 初始密码(可在 `gitlab-config/gitlab-secrets.json` 里查看或自行重置)。 > **资源限制**:GitLab 官方建议至少 4 GB RAM。若机器只有 2 GB,请改用 **GitLab EE 官方轻量版**(`gitlab/gitlab-ee:latest`)或直接选 Gitea。 --- ## 6️⃣ 仅用 SSH + 裸仓库(最轻量的“Git 服务器”) 如果不需要 Web UI,只想团队成员通过 `ssh` 拉取/推送代码,可直接在宿主机上创建裸仓库: ```bash # 1. 创建 git 用户(可选) sudo useradd -m -s /bin/bash git sudo mkdir -p /home/git/repos sudo chown -R git:git /home/git/repos # 2. 创建裸仓库 sudo -u git git init --bare /home/git/repos/myproject.git # 3. 配置 SSH(可选,使用密钥登录) # 将成员的公钥添加到 /home/git/.ssh/authorized_keys sudo mkdir -p /home/git/.ssh sudo tee /home/git/.ssh/authorized_keys < **优点**:几乎不占用额外资源,适合对 **安全** 有严格控制、且不需要 Issue、PR 等功能的团队。 > **缺点**:权限管理只能靠 SSH 密钥,缺乏可视化。 --- ## 7️⃣ 小结 | 方案 | 适用人群 | 关键端口 | 资源需求 | Web UI | |------|----------|----------|----------|--------| | **Gitea (Docker)** | 想快速拥有完整 Git 服务(仓库浏览、Issue、PR、CI)| 3000/2222 → Nginx 80/443 | 1 GB RAM+(推荐 2 GB)| ✅ | | **GitLab CE (Docker)** | 需要完整 DevOps 平台(CI/CD、容器 Registry、Wiki)| 22/80/443 | ≥ 4 GB RAM | ✅ | | **SSH + 裸仓库** | 极简团队、只做代码托管、无需 UI | 22 | 基本无 | ❌ | > **推荐**:如果是中小团队、机器配置一般(≤ 4 GB RAM),**Gitea** 是最佳平衡点;如果团队规模较大且需要 CI/CD、容器 Registry 等完整生态,**GitLab CE** 是不二之选;只想快速在内部共享代码且不想跑额外进程,**SSH + 裸仓库** 已足够。 祝你部署顺利 🚀!如果在实际操作中遇到 **端口冲突**、**权限报错** 或 **证书问题**,欢迎把错误日志贴出来,我可以帮你进一步排查。祝玩得开心 🎉. --- git启动了,Nginx我也配置了,但是用浏览器访问时,页面显示: > 400 Bad Request: malformed Host header 这个错误怎么解决 # 解决 Gitea 400 Bad Request: malformed Host header 这个错误通常是因为 **Host 请求头** 没有正确传递给 Gitea。修改 Nginx 配置即可: ## 解决方案 编辑 Nginx 配置文件: ```bash sudo vim /etc/nginx/conf.d/gitea.conf ``` 找到 `proxy_set_header Host` 那行,**改成这样**: ```nginx location / { proxy_pass http://127.0.0.1:3000; # 关键修改:用 $http_host 而不是 $host proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ``` 或者,如果你使用的是域名访问,也可以试试: ```nginx proxy_set_header Host git.example.com; ``` ## 然后重载 Nginx ```bash sudo nginx -t # 检查配置语法 sudo systemctl reload nginx ``` --- ## 如果还不行,检查 Gitea 的 ROOT_URL 确保 `docker-compose.yml` 中的域名配置正确: ```yaml environment: - ROOT_URL=https://git.example.com/ # 这里要和实际访问的域名一致 - DOMAIN=git.example.com ``` 修改后重启 Gitea: ```bash cd /data/gitea docker-compose down docker-compose up -d ``` --- ## 常见原因总结 | 原因 | 解决方法 | |------|----------| | Host header 丢失或错误 | `proxy_set_header Host $http_host;` | | ROOT_URL 与实际访问域名不匹配 | 保持一致 | | 使用了内网 IP 访问 | 改用域名或修改 `ROOT_URL` 为 IP 地址 | 重启后刷新浏览器缓存(Ctrl+Shift+R)再试试。 --- 我已经进入了页面,页面中有个`以用户名运行`,默认是git,说明为: > 输入 Gitea 运行的操作系统用户名。请注意,此用户必须具有对仓库根路径的访问权限。 git目录是`/data/gitea`, 仓库根目录是`/data/git/repositories` 我当前是用root创建启动的服务,我若想添加git这样的用户,应该怎么操作? # 创建 git 用户并配置权限 ## 步骤 1:创建 git 用户和用户组 ```bash # 创建 git 用户(如果不存在) sudo useradd -m -s /bin/bash git # 或者如果已经存在,确保其主目录正确 sudo mkdir -p /home/git sudo chown -R git:git /home/git ``` ## 步骤 2:创建仓库目录并授权 ```bash # 创建仓库根目录 sudo mkdir -p /data/git/repositories # 授权给 git 用户 sudo chown -R git:git /data/git/repositories # 同时确保 Gitea 数据目录也属于 git 用户(可选,因为数据目录在容器内映射) sudo chown -R git:git /data/gitea/gitea-data ``` ## 步骤 3:查看 git 用户的 UID 和 GID ```bash id git ``` 输出类似: ``` uid=1000(git) gid=1000(git) groups=1000(git) ``` 记录下 `uid` 和 `gid`(通常是 1000)。 ## 步骤 4:更新 docker-compose.yml 编辑 `/data/gitea/docker-compose.yml`: ```yaml environment: - USER_UID=1000 # 改成 git 的 uid - USER_GID=1000 # 改成 git 的 gid - ROOT_URL=https://git.example.com/ - DOMAIN=git.example.com ``` ## 步骤 5:重启 Gitea 服务 ```bash cd /data/gitea docker-compose down docker-compose up -d ``` --- ## 验证权限 ```bash # 检查目录权限 ls -la /data/git/ ``` 输出应该类似: ``` drwxr-xr-x git git /data/git/repositories ``` --- ## 填写 Gitea 安装向导 完成上述步骤后,在 Gitea 安装页面填写: | 字段 | 值 | |------|-----| | 域名 | `git.example.com` | | 仓库根路径 | `/data/git/repositories` | | 以用户名运行 | `git` | 然后继续完成安装即可。 --- 现在进入了首次登录界面,我应该注册,还是登录,登录用户名、密码是什么? # Gitea 首次登录说明 ## 情况判断 ### 如果是安装向导页面(Setup Wizard) 页面应该显示数据库配置、管理员设置等内容: - **选择"注册"或"安装"** → 这里会创建**第一个管理员账号** - **第一个注册的用户就是管理员** 填写示例: | 字段 | 建议值 | |------|--------| | 管理员用户名 | `admin` 或你的名字 | | 管理员密码 | 设置一个强密码 | | 确认密码 | 重复输入 | | 管理员邮箱 | `admin@example.com` | > ⚠️ **注意**:这个账号就是未来的管理员账号,请记住用户名和密码。 --- ### 如果已经是登录页面 说明安装向导已经完成,需要用管理员账号登录: 1. **关闭当前页面** 2. **重新访问** `https://git.example.com` 3. 如果又显示安装向导,按上面步骤配置第一个管理员 --- ### 如果安装向导已完成且无法重置 可以通过命令行创建管理员: ```bash cd /data/gitea # 停止服务 docker-compose down # 重新启动(带初始化参数) docker-compose up -d # 进入容器 docker exec -it gitea bash # 创建管理员用户 gitea admin user create \ --username admin \ --password 你的密码 \ --email admin@example.com \ --admin ``` --- ## 总结 | 场景 | 操作 | |------|------| | 首次显示安装向导 | 填写管理员信息 → 完成安装 → 自动登录 | | 已完成安装但没记住账号 | 重启容器或用命令行创建管理员 | 你现在看到的页面是**安装向导**还是**登录页面**? gitea admin user create \ --username wantsong \ --password NJq77PPXBYhrtZY \ --email w@wantsong.cc \ --admin docker exec -it gitea gitea admin user create \ --username wantsong \ --password NJq77PPXBYhrtZY \ --email w@wantsong.cc \ --admin --- 现在是登录页面了,安装向导页面没注意管理员的账号。 我在创建管理员用户的时候,报错: 2026/06/01 05:42:56 ...s/setting/setting.go:183:loadRunModeFrom() [F] 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 怎么解决? # 解决 Gitea 不允许 root 运行的问题 这是 Gitea 的安全限制,需要使用非 root 用户(如 `git`)运行。 ## 解决方案 ### 步骤 1:确保 git 用户存在 ```bash # 创建 git 用户(如果不存在) sudo useradd -m -s /bin/bash git # 创建目录并授权 sudo mkdir -p /data/git/repositories sudo chown -R git:git /data/git/repositories sudo chown -R git:git /data/gitea/gitea-data ``` ### 步骤 2:获取 git 用户的 UID 和 GID ```bash id git ``` 记住输出的 `uid` 和 `gid`(通常是 `1000`)。 ### 步骤 3:修改 docker-compose.yml 编辑 `/data/gitea/docker-compose.yml`,确保环境变量设置正确: ```yaml services: gitea: image: gitea/gitea:1.21 container_name: gitea restart: always environment: - USER_UID=1000 # 改成 git 的 uid - USER_GID=1000 # 改成 git 的 gid # ... 其他环境变量保持不变 user: "1000:1000" # 添加这行,指定容器以哪个用户运行 ``` ### 步骤 4:重启 Gitea 服务 ```bash cd /data/gitea # 停止并删除旧容器 docker-compose down # 重新启动(会创建新的容器) docker-compose up -d ``` ### 步骤 5:创建管理员用户 ```bash docker exec -it gitea gitea admin user create \ --username admin \ --password 你的密码 \ --email admin@example.com \ --admin ``` --- ## 验证 ```bash # 查看容器是否以 git 用户运行 docker exec -it gitea whoami ``` 输出应该是 `git` 而不是 `root`。 --- ## 常见问题 | 问题 | 解决方法 | |------|----------| | 之前创建的容器没更新 | 必须 `docker-compose down` 删除旧容器后再 `up` | | 权限不够 | `sudo chown -R git:git /data/gitea /data/git` | --- 我检查了下,git用户的id是`1005`,我添加了这行后,`user: "1005:1005"` 服务没法起来。 去掉这行,服务启动但是还是root用户 # 解决 Gitea 以 git 用户运行 ## 步骤 1:检查目录权限 ```bash # 确保目录属于 git 用户 sudo chown -R git:git /data/gitea sudo chown -R git:git /data/git # 检查权限 ls -la /data/ ``` ## 步骤 2:修改 docker-compose.yml ```bash sudo vim /data/gitea/docker-compose.yml ``` 修改 `environment` 部分,确保包含正确的 UID/GID: ```yaml services: gitea: image: gitea/gitea:1.21 container_name: gitea restart: always environment: - USER_UID=1005 # git 用户的 uid - USER_GID=1005 # git 用户的 gid # ... 其他环境变量 user: "1005:1005" # 添加这行 ``` ## 步骤 3:查看启动错误日志 ```bash cd /data/gitea docker-compose down docker-compose up -d docker-compose logs -f ``` 把错误信息贴出来,我帮你分析具体原因。 --- ## 可能的问题及解决 ### 问题 1:SELinux 阻止挂载 ```bash # 查看 SELinux 状态 getenforce # 如果是 Enforcing,临时关闭测试 sudo setenforce 0 # 或者给目录打标签 sudo chcon -R -t svirt_sandbox_file_t /data/gitea sudo chcon -R -t svirt_sandbox_file_t /data/git ``` ### 问题 2:目录权限不够 ```bash # 完全重置权限 sudo chown -R 1005:1005 /data/gitea sudo chown -R 1005:1005 /data/git # 给完全权限测试(后续再收紧) sudo chmod -R 777 /data/gitea/gitea-data sudo chmod -R 777 /data/git/repositories ``` ### 问题 3:使用 run 命令启动查看具体错误 ```bash cd /data/gitea docker-compose down docker-compose run --rm gitea ``` 把终端输出贴出来,我帮你定位问题。 # 卸载 Gitea ## 步骤 1:停止并删除容器 ```bash cd /data/gitea # 停止服务 docker-compose down # 删除容器(如果还存在) docker rm -f gitea docker rm -f gitea-db # 如果有单独的数据库容器 ``` ## 步骤 2:删除 Docker 镜像 ```bash # 查看 Gitea 相关镜像 docker images | grep gitea # 删除镜像 docker rmi gitea/gitea:1.21 # 替换为你的版本 docker rmi postgres:15-alpine # 如果使用 PostgreSQL ``` ## 步骤 3:删除数据目录(可选,谨慎操作) > ⚠️ 这会删除所有仓库和用户数据,**不可恢复** ```bash # 删除 Gitea 数据 sudo rm -rf /data/gitea # 删除仓库数据 sudo rm -rf /data/git # 删除 PostgreSQL 数据(如果使用) sudo rm -rf /var/lib/docker/volumes/gitea_postgres-data ``` ## 步骤 4:清理 systemd 服务(如果创建了) ```bash # 停止服务 sudo systemctl stop gitea # 禁用服务 sudo systemctl disable gitea # 删除服务文件 sudo rm /etc/systemd/system/gitea.service # 重新加载 systemd sudo systemctl daemon-reload ``` ## 步骤 5:清理 Nginx 配置(可选) ```bash # 如果不再需要 sudo rm /etc/nginx/conf.d/gitea.conf # 重载 Nginx sudo systemctl reload nginx ``` --- ## 快速卸载命令汇总 ```bash cd /data/gitea docker-compose down docker-compose down --volumes # 同时删除数据卷 docker system prune -a # 清理所有未使用的镜像、容器、网络 # 删除数据目录(根据需要选择) sudo rm -rf /data/gitea sudo rm -rf /data/git # 清理 systemd sudo systemctl stop gitea 2>/dev/null sudo systemctl disable gitea 2>/dev/null sudo rm /etc/systemd/system/gitea.service 2>/dev/null sudo systemctl daemon-reload ``` --- ## 确认卸载完成 ```bash # 检查是否还有 Gitea 相关容器 docker ps -a | grep gitea # 检查是否还有 Gitea 镜像 docker images | grep gitea # 检查数据目录 ls /data/gitea 2>/dev/null # 应该提示不存在 ``` 卸载完成后,你是想重新安装 Gitea,还是用其他方案(如 GitLab 或 SSH 裸仓库)?