我最早是在一台 1C1G 的腾讯云轻量上装 GitLab CE,结果 gitlab-ctl reconfigure 跑了 11 分钟,最后 SSH 都卡。后来换 Gitea,Docker 镜像 100 多 MB,内存 180MB 左右,才意识到“开源软件”四个字不等于“适合你”。现在手头是一台 4C8G、Ubuntu 22.04 的 VPS,Caddy 2.7 做反代,PostgreSQL 15 单独容器,把 Gitea、Forgejo、GitLab CE 都跑过一遍。下面不是功能清单复读,是我自己踩过的坑和迁移命令。
先说结论,观点可能不讨喜:小团队自建 Git,真正卡你的不是 Git 协议,而是 CI Runner、备份恢复和升级路径。如果你只有 2GB 内存,别装 GitLab CE,这不是“优化一下就行”的问题;官方最低 4GB 是底线,实际带 CI 我建议 8GB 起步。Gitea 和 Forgejo 在 4C8G 上跑 20 个仓库、每天 30 次 push,内存常在 200-400MB 之间,备份包 2.3GB 里大半是附件和 LFS。GitLab CE 16.11 空闲就吃 3.8-4.5GB,启动要 2-3 分钟,Runner 另算。
Gitea vs Forgejo 的差别,别只看界面。它俩是分叉关系:Gitea 2022 年成立商业公司,Forgejo 由 Codeberg e.V. 社区接手,许可证上 Forgejo 走 GPLv3+,Gitea 是 MIT。我不站队,但如果你在意治理透明和商标归属,Forgejo 更对味;如果你要买商业支持、图省事,Gitea 的生态和文档更顺。代码层面两者兼容度很高,但升级时数据库迁移别乱跳版本,先看 release notes。
部署 Forgejo 的 Docker Compose 我现在的写法,重点是别用 SQLite 扛团队,至少 PostgreSQL 15。内存限制 512M 对 10 人团队够用,端口 3000 给 HTTP,2222 给 SSH,卷挂到 /var/lib/forgejo。Caddy 反代记得传 X-Forwarded-Proto,不然克隆地址会变 http,LFS 也可能 404。compose 大概这样:
services:
forgejo:
image: codeberg.org/forgejo/forgejo:7
container_name: forgejo
restart: unless-stopped
ports:
- "3000:3000"
- "2222:22"
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=换成你的密码
volumes:
- /var/lib/forgejo:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
- db
db:
image: postgres:15
restart: unless-stopped
environment:
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=换成你的密码
- POSTGRES_DB=forgejo
volumes:
- /var/lib/forgejo-db:/var/lib/postgresql/data
启动:docker compose up -d,然后 docker compose logs -f forgejo 看 migration。第一次进 http://IP:3000,在安装页把数据库主机填 db:5432,不是 127.0.0.1。SSH 克隆地址如果显示 ssh://git@localhost:2222,去 app.ini 改 DOMAIN、SSH_DOMAIN、ROOT_URL、SSH_PORT,重启容器。
备份和迁移才是重点。Gitea/Forgejo 自带的 dump 命令能打包数据库、仓库、附件,但大仓库我更信 pg_dump + 文件系统快照。我常用的顺序:凌晨 2 点停写入,pg_dump -U forgejo -h 127.0.0.1 -Fc forgejo > forgejo-20260404.dump,再 docker exec -u git forgejo /usr/local/bin/forgejo dump -c /etc/forgejo/app.ini --file /tmp/forgejo-dump.zip,最后 docker cp forgejo:/tmp/forgejo-dump.zip ./。恢复时别直接把旧 app.ini 全量盖回去,先比对 SECRET_KEY、INTERNAL_TOKEN、JWT_SECRET,这几个错一个,登录态和 webhook 全乱。迁移完必须点:仓库 Git clone、LFS 拉取、issue 附件、webhook 最近投递、Actions secrets。
GitLab CE 我为什么不推荐小主机硬上:它不是一个 Git 服务,是一整套 DevOps 平台。Omnibus 安装包 curl 下来就 1GB 左右,gitlab-ctl reconfigure 后磁盘 6-8GB,Puma、Sidekiq、Gitaly、PostgreSQL、Redis 全塞一起。4GB 内存开 swap 能用,但 push 大仓库时 OOM 很常见。它的优势也明显:.gitlab-ci.yml、Runner、容器 registry、环境变量保护、MR 审批,这些 Forgejo Actions 还追得吃力。我的观点:10 人以内、没有专职运维,Forgejo/Gitea + 单独一台 1C2G Runner 更划算;超过 30 人、CI 复杂、要合规审计,再考虑 GitLab CE 或直接买 SaaS。
最后给一个选择步骤,别抄功能表:1)数清楚仓库大小和 LFS 总量,du -sh /var/lib/forgejo/repos;2)跑一次恢复演练,不是只看备份成功;3)列出 CI 里用到的 uses、缓存、service containers,Forgejo Actions 不保证 100% 兼容;4)决定谁负责升级,Gitea/Forgejo 每月小版本,GitLab 每月补丁;5)如果只有 2GB 内存,直接排除 GitLab CE。开源软件省的是许可证钱,不省运维时间。