2026 Gitea 自建 Git 仓库:Docker 部署轻量替代 GitHub
GitHub 很好用,但有些场景让人很头疼。私人仓库免费版有协作人数限制,Action 有额度,一些敏感代码你也不放心放在别人的服务器上。公司内部用 GitLab?那玩意 Java 写的,内存开销大得离谱——我见过 2G 内存的机器跑 GitLab 启动就要几分钟,日常占用 1.5G+。
Gitea 就是为这些场景而生的。一个用 Go 语言编写的轻量级 Git 托管服务,完整支持 GitHub 的核心功能——仓库管理、Issue、PR、CI/CD、Wiki——但资源占用不到 GitLab 的十分之一。
它目前是 GitHub 上 56k+ Star 的项目,社区非常活跃,几乎每个月都出新版本。而且 Gitea 是从 Gogs fork 出来的,因为原项目的开发速度跟不上社区需求——社区选择了 Gitea,事实证明这个选择是对的,Gitea 的功能更新频率远超原项目。
一、Gitea vs GitLab vs GitHub
| 对比项 | Gitea | GitLab | GitHub |
|---|---|---|---|
| 语言 | Go | Ruby + Go | 闭源 |
| 内存占用 | ~100MB | ~1.5GB+ | N/A(云服务) |
| 安装方式 | 单二进制 / Docker | 复杂依赖 | 不用安装 |
| 私人仓库 | 无限免费 | 无限免费 | 有限制 |
| CI/CD | Gitea Actions | 内置 CI | GitHub Actions |
| 开源 | ✅ MIT | 部分 CE 版 | ❌ |
| 代码所有权 | 完全归你 | 自部署下归你 | GitHub 服务器上 |
Gitea 的核心优势是 轻量——100MB 内存 vs GitLab 的 1.5GB+。在 1 核 2G 的 VPS 上跑 Gitea 加几个其他服务完全没问题,GitLab 一个人就吃完了。而且 Go 写的单二进制,启动只需要几百毫秒。
功能方面,Gitea 覆盖了日常开发 90% 的需求。代码审查、Issue 跟踪、Pull Request、Actions CI/CD、Wiki 都有了。如果你只是自己或小团队用 Gitea,你不会感觉到什么功能缺失。
二、Docker Compose 部署
Gitea 可以只用一个 SQLite 文件运行,不需要独立的数据库——这是它轻量的一个重要原因。如果团队大了(几十人以上),可以切到 PostgreSQL,但对个人和小团队来说 SQLite 完全够用。
创建目录结构:
mkdir -p ~/gitea && cd ~/gitea新建 docker-compose.yml:
services: gitea: image: gitea/gitea:latest container_name: gitea restart: unless-stopped ports: - "3000:3000" - "2222:22" volumes: - ./data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro environment: USER_UID: 1000 USER_GID: 1000 GITEA__database__DB_TYPE: sqlite3 GITEA__server__DOMAIN: localhost GITEA__server__HTTP_PORT: 3000 GITEA__server__ROOT_URL: http://localhost:3000 GITEA__server__SSH_DOMAIN: localhost GITEA__server__SSH_PORT: 2222端口说明:
3000:Gitea Web 界面2222:SSH 协议访问 Git 仓库时用的端口。映射到宿主的 2222 而非 22,是因为 22 端口通常被宿主 SSH 占用。客户端 clone 时用ssh://git@你的IP:2222/user/repo.git来访问
启动服务:
docker compose up -d访问 http://你的IP:3000,第一次打开会自动跳转到安装页面。大部分配置使用默认值即可,只需要设置:
- 管理员账号——第一个注册的账号是管理员。也可以勾选「禁止自助注册」防止别人乱注册
- 站点名称——随便写,比如”个人 Git”
- SSH 服务器端口——填
2222(跟 docker-compose 里暴露的端口一致) - Gitea 基本 URL——填
http://你的IP:3000(之后配了域名换成域名)
完成安装后就能正常使用了。
三、开启 Gitea Actions CI/CD
Gitea 从 1.19 版本开始引入了内置的 Actions 系统,兼容 GitHub Actions 的语法(什么意思呢?你在 GitHub 上用的 actions/checkout@v4 可以直接搬到 Gitea 上用)。这意味着不需要额外学习一套新的 CI 配置语法。
开启 Actions 需要额外跑一个 Runner 容器:
services: gitea: # ...(前面已有的 Gitea 配置保持不变)
gitea-runner: image: gitea/act_runner:latest container_name: gitea-runner restart: unless-stopped depends_on: - gitea volumes: - ./runner-data:/data - /var/run/docker.sock:/var/run/docker.sock environment: GITEA_INSTANCE_URL: http://gitea:3000 GITEA_RUNNER_REGISTRATION_TOKEN: "" # 需要手动获取Runner 的注册过程需要先拿到注册令牌:
- 在 Gitea Web 界面中进入:管理后台 → Actions → Runners → 创建 Runner
- 复制显示的注册令牌
- 启动 Runner 容器时输入注册令牌
Runner 注册完成后,在你的仓库根目录创建 .gitea/workflows/build.yml,语法跟 GitHub Actions 一模一样:
name: Build and Teston: [push, pull_request]
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Build run: go build ./... - name: Test run: go test ./...Gitea Actions 的好处是 Action 的每分钟运行成本为零——没有 GitHub 的免费额度限制,想跑多久跑多久。不过代价是 Runner 会消耗你的 VPS 资源,如果机器配置不高,建议只跑轻量任务(lint、build),别跑并发压力大的测试。
四、配置反向代理和 HTTPS
Gitea 的 Web 界面通过反向代理访问是最稳妥的方式。跟 Navidrome 一样,用 Nginx Proxy Manager 或 Caddy 都行。
Caddy 方案:
git.你的域名.com { reverse_proxy gitea:3000}Nginx 方案:
server { listen 443 ssl; server_name git.你的域名.com;
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $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; }}配置好 HTTPS 后,别忘了更新 Gitea 的配置——在 docker-compose.yml 的环境变量里修改:
environment: GITEA__server__DOMAIN: git.你的域名.com GITEA__server__ROOT_URL: https://git.你的域名.com GITEA__server__SSH_DOMAIN: git.你的域名.com GITEA__server__SSH_PORT: 2222修改后重启容器:
docker compose restart这样仓库的 Clone URL 就会正确显示为 https://git.你的域名.com/user/repo.git,而不是 http://localhost:3000/user/repo.git。
五、从 GitHub 迁移仓库
把你现有的 GitHub 仓库迁移到 Gitea 非常简单,不需要手动 git push:
- 登录 Gitea,点击右上角「+」→ 「迁移仓库」
- 迁移源选 GitHub
- 填写 GitHub 仓库 URL
- 勾选 「镜像仓库」或者「迁移」——镜像是只读同步,迁移是完整复制后断开与原仓库的关系
- 点击「迁移仓库」,完成
Gitea 会自动从 GitHub 拉取所有代码、Issue、PR、Wiki——但 Actions 不会迁移,需要你在 Gitea 上重新配置。
一次迁移单个仓库没问题,如果要迁移几十个仓库,可以用 Gitea 的命令行工具批量操作。
批量迁移脚本(需要 curl 和 jq):
#!/bin/bash# 获取 GitHub 用户的所有仓库TOKEN="你的 GitHub Token"USER="你的 GitHub 用户名"GITEA_URL="https://git.你的域名.com"GITEA_TOKEN="你的 Gitea Token"
curl -s -H "Authorization: token $TOKEN" \ "https://api.github.com/users/$USER/repos?per_page=100" \ | jq -r '.[].clone_url' | while read url; do curl -X POST "$GITEA_URL/api/v1/repos/migrate" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"clone_addr\":\"$url\",\"repo_name\":\"$(basename $url .git)\",\"uid\":1,\"service\":\"github\"}"done把上面的 TOKEN、USER、GITEA_URL、GITEA_TOKEN 改成你自己的。Gitea Token 在「设置 → 应用 → 管理访问令牌」里生成。
六、常用配置优化
1. 限制注册和仓库可见性
个人用的 Gitea 建议关掉自助注册,防止外人进来开仓库:
在 Gitea 的 docker-compose.yml 里加:
environment: GITEA__service__DISABLE_REGISTRATION: true GITEA__service__REQUIRE_SIGNIN_VIEW: trueDISABLE_REGISTRATION: true 禁止新用户注册,只有管理员能创建账号。REQUIRE_SIGNIN_VIEW: true 让所有未登录用户看不到任何仓库内容。
2. 配置 SMTP 邮件发送
需要注册验证、密码找回、Issue 通知等功能的话,配个邮箱发信:
environment: GITEA__mailer__ENABLED: true GITEA__mailer__PROTOCOL: smtp GITEA__mailer__SMTP_ADDR: smtp.你的邮箱服务.com GITEA__mailer__SMTP_PORT: 587 GITEA__mailer__USER: your@email.com GITEA__mailer__PASSWD: 你的密码或授权码3. 管理后台
登录管理员账号后,点击右上角头像 → 站点管理,可以看到:
- 所有用户和仓库的统计
- 服务器配置面板
- 运行的定时任务(健康检查、仓库清理等)
- Actions 运行器管理
首次部署后进去看看,把不需要的自动任务关掉可以省点资源。
延伸阅读
- Docker 换源避坑指南 — 部署前的必备准备
- Nginx Proxy Manager 反代面板 — 统一管理所有服务的访问入口
- Listmonk 自建邮件营销平台 — 打造个人 Newsletter
七、常见问题
Q:Gitea 和 Gogs 什么关系?
Gogs 是更早的项目(2014 年),Gitea 是 2016 年从 Gogs fork 出来的。Gogs 现在还活着但更新很慢,Gitea 的社区活跃度和功能更新远超过 Gogs。如果是在这两个之间选,无脑选 Gitea。
Q:需要 PostgreSQL 吗?
个人用不需要。Gitea 内置 SQLite 支持,能存下几千个仓库和几十万条 Issue。等到哪天 SQLite 不够用了——那时候你肯定已经知道怎么迁移到 PostgreSQL 了。Gitea 官方提供了完整的数据库迁移指南。
Q:Gitea 的存储空间占用多大?
一个 Git 仓库在 Gitea 上占用的空间跟它在 GitHub 上完全一样——Gitea 存的就是原生的 Git 裸仓库,没有额外转换。Gitea 本身的元数据(Issue、评论、用户信息等)存在 SQLite 数据库里,一万条 Issue 大概占用几十 MB。
Q:怎么备份 Gitea?
备份就是备份整个 data 目录,里面包含了所有仓库和数据库:
tar -czf gitea-backup-$(date +%Y%m%d).tar.gz ~/gitea/data恢复时直接解压到新的 data 目录,启动容器就行。Gitea 的迁移非常简单——不需要重新安装配置,数据文件带着所有东西。
Q:Gitea 支持 WebDAV 吗?
不支持,WebDAV 不是 Git 相关的功能。不过 Gitea 支持 LFS(大文件存储),可以管理超过 100MB 的大文件。
用 Gitea 自建 Git 服务之后,你会发现小团队或个人项目的开发体验甚至比 GitHub 更好——没有网络延迟、没有仓库配额限制、CI/CD 不限额度。配上反代和 HTTPS,公网上访问跟用云服务一样快。
而且 Gitea 和 Navidrome 可以跑在同一台低配 VPS 上——两个 Go 写的服务加起来不到 200MB 内存,互不干扰。一台 1 核 2G 的机器再挂个 Caddy、Jellyfin 或者 MinIO,就能搭起完整的个人云服务平台。
推荐指数:⭐⭐⭐⭐⭐
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!