2026 Gitea 自建 Git 仓库:Docker 部署轻量替代 GitHub

2323 字
12 分钟
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#

对比项GiteaGitLabGitHub
语言GoRuby + Go闭源
内存占用~100MB~1.5GB+N/A(云服务)
安装方式单二进制 / Docker复杂依赖不用安装
私人仓库无限免费无限免费有限制
CI/CDGitea Actions内置 CIGitHub 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 完全够用。

创建目录结构:

Terminal window
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 来访问

启动服务:

Terminal window
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 的注册过程需要先拿到注册令牌:

  1. 在 Gitea Web 界面中进入:管理后台 → Actions → Runners → 创建 Runner
  2. 复制显示的注册令牌
  3. 启动 Runner 容器时输入注册令牌

Runner 注册完成后,在你的仓库根目录创建 .gitea/workflows/build.yml,语法跟 GitHub Actions 一模一样:

name: Build and Test
on: [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

修改后重启容器:

Terminal window
docker compose restart

这样仓库的 Clone URL 就会正确显示为 https://git.你的域名.com/user/repo.git,而不是 http://localhost:3000/user/repo.git


五、从 GitHub 迁移仓库#

把你现有的 GitHub 仓库迁移到 Gitea 非常简单,不需要手动 git push

  1. 登录 Gitea,点击右上角「+」→ 「迁移仓库」
  2. 迁移源选 GitHub
  3. 填写 GitHub 仓库 URL
  4. 勾选 「镜像仓库」或者「迁移」——镜像是只读同步,迁移是完整复制后断开与原仓库的关系
  5. 点击「迁移仓库」,完成

Gitea 会自动从 GitHub 拉取所有代码、Issue、PR、Wiki——但 Actions 不会迁移,需要你在 Gitea 上重新配置。

一次迁移单个仓库没问题,如果要迁移几十个仓库,可以用 Gitea 的命令行工具批量操作。

批量迁移脚本(需要 curljq):

#!/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

把上面的 TOKENUSERGITEA_URLGITEA_TOKEN 改成你自己的。Gitea Token 在「设置 → 应用 → 管理访问令牌」里生成。


六、常用配置优化#

1. 限制注册和仓库可见性

个人用的 Gitea 建议关掉自助注册,防止外人进来开仓库:

在 Gitea 的 docker-compose.yml 里加:

environment:
GITEA__service__DISABLE_REGISTRATION: true
GITEA__service__REQUIRE_SIGNIN_VIEW: true

DISABLE_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 运行器管理

首次部署后进去看看,把不需要的自动任务关掉可以省点资源。

延伸阅读#


七、常见问题#

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 目录,里面包含了所有仓库和数据库:

Terminal window
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 的机器再挂个 CaddyJellyfin 或者 MinIO,就能搭起完整的个人云服务平台。

推荐指数:⭐⭐⭐⭐⭐

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
2026 Gitea 自建 Git 仓库:Docker 部署轻量替代 GitHub
https://www.kshare.top/posts/2026-gitea-自建-git-仓库docker-部署轻量替代-github/
作者
Kshare
发布于
2026-06-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录