香港服务器搭建Gitea轻量Git仓库:比GitLab省90%资源的私有代码托管方案
GitLab CE 功能强大但吃资源——最低需要 4核8G,启动完成后内存占用就超过 4GB。小团队如果只需要私有代码仓库 + 基本的 Issue 管理,Gitea 是更轻量的选择:Go 语言编写,512MB 内存即可流畅运行,启动时间不到 3 秒,Web 界面风格与 GitHub 高度相似,学习成本极低。本文在香港服务器上完成 Gitea 的完整部署。
一、Gitea vs GitLab vs GitHub 功能对比
| 功能 | Gitea | GitLab CE | GitHub |
|---|---|---|---|
| 最低内存 | 512MB | 4GB | SaaS(无需自托管) |
| Git 仓库 | ✅ | ✅ | ✅ |
| Issue/PR | ✅ | ✅ | ✅ |
| CI/CD(内置) | ✅ Gitea Actions | ✅ GitLab CI | ✅ GitHub Actions |
| Wiki | ✅ | ✅ | ✅ |
| 容器镜像仓库 | ✅(基础) | ✅(完整) | ✅ GHCR |
| 代码审查 | 基础 | 完整 | 完整 |
| 适合场景 | 小团队私有仓库 | 中大型研发团队 | 开源/付费 SaaS |
二、Docker Compose 部署 Gitea
<code"># /opt/gitea/docker-compose.yml
version: '3.8'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
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_db_pass
ports:
- "127.0.0.1:3000:3000" # HTTP
- "2222:22" # SSH(避免与系统 SSH 冲突)
volumes:
- /opt/gitea/data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
- db
db:
image: postgres:16-alpine
container_name: gitea-db
restart: unless-stopped
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: gitea_db_pass
POSTGRES_DB: gitea
volumes:
- /opt/gitea/postgres:/var/lib/postgresql/data<code"># 创建数据目录并启动
mkdir -p /opt/gitea/{data,postgres}
cd /opt/gitea && docker compose up -d
# 首次访问 http://服务器IP:3000 完成初始化配置
# 关键配置项:
# - 服务器域名:git.yourdomain.com
# - SSH 服务器端口:2222
# - HTTP 端口:443(通过 Nginx 反代)
# - 管理员账号:填写管理员用户名/密码三、Nginx 反向代理 + SSH 配置
<code"># /etc/nginx/sites-available/git.yourdomain.com
server {
listen 443 ssl http2;
server_name git.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/git.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.yourdomain.com/privkey.pem;
# 允许大文件推送
client_max_body_size 512M;
proxy_read_timeout 600s;
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;
}
}
# SSH 克隆配置
# 用户使用端口 2222:git clone ssh://git@git.yourdomain.com:2222/user/repo.git
# 或者在 ~/.ssh/config 中配置:
# Host git.yourdomain.com
# Port 2222
# IdentityFile ~/.ssh/id_ed25519四、Gitea 配置优化(app.ini)
<code"># /opt/gitea/data/gitea/conf/app.ini 关键配置 [server] DOMAIN = git.yourdomain.com ROOT_URL = https://git.yourdomain.com/ HTTP_PORT = 3000 SSH_DOMAIN = git.yourdomain.com SSH_PORT = 2222 DISABLE_SSH = false [service] REGISTER_EMAIL_CONFIRM = false # 是否要求邮件验证注册 DISABLE_REGISTRATION = true # 关闭公开注册(仅管理员创建用户) REQUIRE_SIGNIN_VIEW = true # 需要登录才能查看仓库(私有化) [repository] DEFAULT_PRIVATE = true # 新建仓库默认私有 [mailer] ENABLED = true SMTP_ADDR = smtp.gmail.com SMTP_PORT = 587 FROM = gitea@yourdomain.com USER = gitea@yourdomain.com PASSWD = your_app_password [session] PROVIDER = db # 会话存储在数据库(重启不丢失登录状态) [cache] ENABLED = true ADAPTER = memory INTERVAL = 60 # 修改配置后重启 docker restart gitea
五、Gitea Actions CI/CD(兼容 GitHub Actions 格式)
<code"># 首先需要在 Gitea 实例上安装 Runner docker run -d \ --name gitea-runner \ --restart unless-stopped \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /opt/gitea-runner:/data \ -e GITEA_INSTANCE_URL=https://git.yourdomain.com \ -e GITEA_RUNNER_REGISTRATION_TOKEN=从Gitea后台获取的Token \ gitea/act_runner:latest
<code"># .gitea/workflows/deploy.yml(与 GitHub Actions 语法相同)
name: Deploy to HK Server
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest tests/
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: deploy
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd /opt/myapp
git pull origin main
supervisorctl restart myapp六、用户与权限管理
<code"># 通过 Gitea CLI 批量创建用户 docker exec -it gitea gitea admin user create \ --username developer1 \ --password DevPass2026 \ --email dev1@yourdomain.com \ --must-change-password=false # 创建组织(相当于 GitHub Organization) # 在 Web 界面:+ → New Organization → mycompany # 将用户加入组织 # Organization Settings → Members → Invite Member # 创建团队并设置权限 # Organization → New Team → Developers(read/write 权限)
七、Webhook 集成(通知飞书/钉钉)
<code"> 仓库 → Settings → Webhooks → Add Webhook → Feishu 配置: - Payload URL: https://open.feishu.cn/open-apis/bot/v2/hook/xxx - Content Type: application/json - Trigger Events: Push Events, Pull Request, Issues 推送通知效果: ✅ [myapp] developer1 推送了 3 个提交到 main 分支 - fix: 修复支付回调 500 错误 - feat: 添加 TikTok 订单同步功能 - docs: 更新 API 文档
八、镜像同步(从 GitHub 同步代码)
<code"> Gitea 支持将 GitHub 仓库镜像到本地,实现: - 定时拉取最新代码(自动同步) - 作为 GitHub 的离线备份 - 内网访问时无需翻墙 操作:+ → New Migration → GitHub 填写: - Clone URL: https://github.com/username/repo - 访问令牌: GitHub Personal Access Token - Mirror: 勾选(自动同步) - Mirror Interval: 8h(每8小时同步一次)
九、备份与恢复
<code"># Gitea 官方备份命令(包含数据库 + 仓库文件 + 配置) docker exec -it gitea gitea dump \ -c /data/gitea/conf/app.ini \ -f /data/gitea-dump-$(date +%Y%m%d).zip # 将备份文件复制到宿主机 docker cp gitea:/data/gitea-dump-$(date +%Y%m%d).zip /backup/gitea/ # 定时自动备份 echo "0 3 * * * docker exec gitea gitea dump -c /data/gitea/conf/app.ini -f /data/gitea-backup-\$(date +\%Y\%m\%d).zip" >> /etc/crontab
十、总结
Gitea 是小团队私有代码托管的最优解:512MB 内存起步、类 GitHub 界面零学习成本、内置 CI/CD(与 GitHub Actions 语法兼容)。香港服务器上 1核2G VPS(¥50~80/月)即可流畅运行 Gitea,服务 10~20 人开发团队,比 GitLab CE 节省约 80% 的服务器成本。从 GitHub 迁移到 Gitea 几乎无缝,原有的 Actions Workflow 文件直接复用。