95384 / Docker Compose 搭建 Gitea 代码托管服务

Created Sun, 07 Jun 2026 10:00:00 +0800 Modified Sun, 07 Jun 2026 11:33:45 +0000

前言

Gitea 是一个轻量级、自托管的 Git 服务,使用 Go 语言编写。相比 GitLab,Gitea 资源占用极低(256MB 内存即可运行),安装配置简单,功能却不输大厂——支持 Issue、PR、CI/CD、Webhook、LDAP 等。

如果你不想把代码放在 GitHub/GitLab 上,或者想搭建一个私有的代码托管平台,Gitea 是最佳选择。


方案对比

方案 内存占用 部署难度 推荐场景
Gitea + SQLite ~200MB 个人仓库、小团队(<10人)
Gitea + PostgreSQL ~300MB ⭐⭐ 生产环境、多团队协作
Gitea + PostgreSQL + 备用 ~400MB ⭐⭐⭐ 高可用场景

本教程采用 Gitea + PostgreSQL 方案,兼顾性能和数据安全。


环境准备

前提条件

  • 已安装 Docker 和 Docker Compose(参考上篇 Docker 部署教程
  • 至少 512MB 可用内存
  • 开放端口(默认 3000 HTTP, 2222 SSH)
  • 一个域名(可选,推荐用于 HTTPS)

准备工作目录

mkdir -p /root/docker/gitea
cd /root/docker/gitea

编写 docker-compose.yml

下面是完整的 docker-compose.yml,包含 Gitea 和 PostgreSQL 两个服务:

services:
  # ─── 数据库 ───
  db:
    image: postgres:16-alpine
    container_name: gitea_db
    restart: unless-stopped
    environment:
      POSTGRES_USER: gitea
      POSTGRES_PASSWORD: gitea_secure_password
      POSTGRES_DB: gitea
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U gitea"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - gitea_net

  # ─── Gitea ───
  server:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "3000:3000"     # HTTP 端口
      - "2222:22"       # SSH 端口(映射到宿主机非特权端口)
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      # ── 基本配置 ──
      USER_UID: 1000
      USER_GID: 1000
      GITEA__database__DB_TYPE: postgres
      GITEA__database__HOST: db:5432
      GITEA__database__NAME: gitea
      GITEA__database__USER: gitea
      GITEA__database__PASSWD: gitea_secure_password

      # ── 服务器配置 ──
      GITEA__server__DOMAIN: git.yourdomain.com
      GITEA__server__HTTP_PORT: 3000
      GITEA__server__ROOT_URL: https://git.yourdomain.com
      GITEA__server__SSH_DOMAIN: git.yourdomain.com
      GITEA__server__SSH_PORT: 2222
      GITEA__server__SSH_LISTEN_PORT: 22

      # ── 禁用用户注册(生产环境建议) ──
      GITEA__service__DISABLE_REGISTRATION: true

      # ── 邮件配置(可选) ──
      # GITEA__mailer__ENABLED: true
      # GITEA__mailer__HOST: smtp.example.com:587
      # GITEA__mailer__FROM: [email protected]
      # GITEA__mailer__USER: [email protected]
      # GITEA__mailer__PASSWD: your_email_password

    networks:
      - gitea_net

networks:
  gitea_net:
    driver: bridge

⚠️ 请把以下配置换成你自己的:

  • POSTGRES_PASSWORD → 改成安全的随机密码
  • GITEA__server__DOMAIN → 换成你的域名
  • GITEA__server__ROOT_URL → 换成你的域名
  • GITEA__server__SSH_DOMAIN → 换成你的域名

启动服务

cd /root/docker/gitea
docker compose up -d

查看启动日志:

docker compose logs -f
# 看到 like "Server listen on http://0.0.0.0:3000" 即启动完成

确认所有容器正常运行:

docker compose ps

输出应该类似:

NAME                IMAGE                   STATUS              PORTS
gitea               gitea/gitea:latest      Up 2 minutes        0.0.0.0:3000->3000/tcp, 0.0.0.0:2222->22/tcp
gitea_db            postgres:16-alpine      Up 2 minutes (healthy)

初始化配置(首次启动)

浏览器访问 http://你的服务器IP:3000,会进入安装页面:

第一步:数据库设置

字段
数据库类型 PostgreSQL(默认)
主机 db:5432
数据库名 gitea
用户名 gitea
密码 你在 docker-compose.yml 中设置的密码

第二步:通用设置

字段 推荐值
站点名称 你的 Git 服务名称
仓库根路径 保持默认
Git 钩子路径 保持默认
运行系统用户 git
域名 你的域名
SSH 端口 2222
HTTP 端口 3000
应用 URL https://git.yourdomain.com

✅ 如果不需要注册功能,可以在安装页面勾选 “禁止自助注册”

第三步:管理员账号

安装页面底部可以设置初始管理员账号。建议立即创建一个:

字段
用户名 admin
密码 强密码
邮箱 你的邮箱

点击 “安装 Gitea” 完成配置。


配置 Caddy 反向代理(HTTPS)

有了域名,用 Caddy 一键搞定 HTTPS。Caddyfile 配置:

git.yourdomain.com {
    reverse_proxy localhost:3000
}

如果你已有 Caddy 在运行,只需把上面内容追加到 Caddyfile 并重载:

# 添加反向代理配置
echo "git.yourdomain.com {
    reverse_proxy localhost:3000
}" | sudo tee -a /etc/caddy/Caddyfile

# 重载 Caddy
sudo systemctl reload caddy

🎉 配置完成后,就可以通过 https://git.yourdomain.com 安全访问 Gitea 了


SSH 配置详解

Gitea 默认 SSH 端口是 22,但在 Docker 中为了避免和宿主机 SSH 冲突,映射为 2222 端口。

客户端 Clone 仓库

# HTTPS 方式(推荐)
git clone https://git.yourdomain.com/username/repo.git

# SSH 方式(需要指定端口)
git clone ssh://[email protected]:2222/username/repo.git

简化 SSH 克隆(可选)

如果想直接用 [email protected]:username/repo.git 的简洁格式,需要在宿主机上做端口转发:

方法 A:使用 iptables 转发(推荐)

# 将宿主机 22 端口的 SSH 流量按域名转发到 Gitea 的 2222 端口
# ⚠️ 注意:这会与宿主机 SSH 冲突,仅当宿主机 SSH 改了端口时可用

方法 B:使用 SSH 配置文件

在客户端 ~/.ssh/config 中添加:

Host git.yourdomain.com
    HostName git.yourdomain.com
    Port 2222
    User git

之后就可以直接用简写拉取代码:

git clone [email protected]:username/repo.git

常用运维命令

# 查看服务状态
cd /root/docker/gitea
docker compose ps
docker compose logs --tail=50 -f

# 重启服务
docker compose restart

# 更新 Gitea 版本
docker compose pull
docker compose up -d

# 备份数据(重要!定期执行)
tar -czf gitea-backup-$(date +%Y%m%d).tar.gz ./data ./db

# 恢复备份
# 先停止服务:docker compose down
# 解压 backup 到目录
# 再启动:docker compose up -d

# 完全停止并删除容器
docker compose down

# 清理不再使用的镜像
docker system prune -a

配置 CI/CD(Gitea Actions)

Gitea 内置了 Actions(与 GitHub Actions 兼容),配置非常简单。

1. 启动 Act Runner

在 Gitea 服务器上(或单独的 runner 机器上):

# 先获取注册 token:在 Gitea Web 界面 → 站点管理 → Actions → Runners → 创建 runner

mkdir -p /root/docker/gitea-runner
cd /root/docker/gitea-runner

创建 docker-compose.yml

services:
  runner:
    image: gitea/act_runner:latest
    container_name: gitea_runner
    restart: unless-stopped
    environment:
      GITEA_INSTANCE_URL: https://git.yourdomain.com
      GITEA_RUNNER_REGISTRATION_TOKEN: YOUR_REGISTRATION_TOKEN
      GITEA_RUNNER_NAME: my-runner
      # GITEA_RUNNER_LABELS: "ubuntu-latest,ubuntu-22.04"
    volumes:
      - ./data:/data
      - /var/run/docker.sock:/var/run/docker.sock

启动 runner:

docker compose up -d

2. 在仓库中使用 Actions

在仓库根目录创建 .gitea/workflows/build.yml

name: Build and Test
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 显示提交信息
        run: echo "Commit ${{ github.sha }}"
      - name: 运行测试
        run: echo "Tests passed!"

生产环境最佳实践

1. 定期备份

加入 crontab,每天凌晨自动备份:

crontab -e
# 添加:
0 3 * * * cd /root/docker/gitea && tar -czf /backup/gitea/gitea-$(date +\%Y\%m\%d).tar.gz ./data ./db && find /backup/gitea -name "gitea-*.tar.gz" -mtime +30 -delete

2. 资源限制

docker-compose.yml 中添加资源限制:

services:
  server:
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: "1.0"

  db:
    deploy:
      resources:
        limits:
          memory: 256M
          cpus: "0.5"

3. 使用非 root 运行 Gitea

确保 USER_UIDUSER_GID 与宿主机上的用户匹配,避免文件权限问题:

# 查看当前用户的 UID/GID
id
# uid=1000(youruser) gid=1000(youruser)

4. 配置 Webhook

Gitea 支持在代码推送时触发 Webhook,可以搭配 CI/CD 或通知服务:

  1. 进入仓库 → 设置Webhooks
  2. 添加 Webhook,填入目标 URL
  3. 选择触发事件(Push、PR、Issue 等)

常见问题排查

❌ Gitea 启动后页面 502/连接拒绝

# 检查数据库是否先启动
docker compose logs db

# 检查端口映射
docker compose ps

# 可能问题:数据库还没完全就绪,Gitea 正在重试
docker compose logs server

Authentication failed 连接数据库

# 确认 docker-compose.yml 中的密码完全一致
# GITEA__database__PASSWD 要与 POSTGRES_PASSWORD 一致

# 重新创建数据库容器
docker compose down
rm -rf ./db
docker compose up -d

❌ 推送代码报 Permission denied (publickey)

# 1. 确认 SSH 密钥已添加到 Gitea
# 用户设置 → SSH/GPG Keys → 添加密钥

# 2. 确认使用了正确的 SSH 端口
ssh -T -p 2222 [email protected]
# 看到 "Hi there, username! You've successfully authenticated..." 即正常

# 3. 检查 SSH 密钥权限(在客户端)
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh

❌ 推送大文件超时

在 Gitea 容器配置中增加超时限制:

environment:
  GITEA__server__LFS_START_SERVER: true
  GITEA__git__TIMEOUT_DEFAULT: 360
  GITEA__git__TIMEOUT_MIGRATE: 600
  GITEA__git__TIMEOUT_CLONE: 300
  GITEA__git__TIMEOUT_PUSH: 300

❌ 忘记管理员密码

# 进入 Gitea 容器
docker exec -it gitea bash

# 使用 Gitea 命令行重设密码
gitea admin user change-password --username admin --password 新密码

# 退出容器
exit

升级 Gitea

cd /root/docker/gitea

# 1. 备份(永远先备份)
tar -czf /tmp/gitea-pre-upgrade-$(date +%Y%m%d-%H%M%S).tar.gz ./

# 2. 拉取新镜像
docker compose pull

# 3. 重新创建容器
docker compose up -d

# 4. 确认升级成功
docker compose logs --tail=20

💡 Gitea 升级非常稳定,通常只需替换镜像即可,数据库迁移会自动进行。升级后建议去 Web 界面检查一下功能是否正常。


总结

通过 Docker Compose,不到 10 分钟就能搭建一个完整的 Gitea 代码托管平台:

# 三步启动
mkdir -p /root/docker/gitea && cd /root/docker/gitea
# 创建 docker-compose.yml
docker compose up -d

访问 http://你的IP:3000 完成初始化配置,一个属于你自己的 Git 服务就上线了 🚀

进阶方向:

  • 接入 LDAP/OAuth 实现统一登录
  • 配置 Gitea Actions 实现 CI/CD 流水线
  • 对接 Drone/Jenkins 等第三方 CI 工具
  • 使用 Gitea + Tea 命令行工具管理仓库