香港服务器搭建Gitea轻量Git仓库:比GitLab省90%资源的私有代码托管方案

香港服务器搭建Gitea轻量Git仓库:比GitLab省90%资源的私有代码托管方案

GitLab CE 功能强大但吃资源——最低需要 4核8G,启动完成后内存占用就超过 4GB。小团队如果只需要私有代码仓库 + 基本的 Issue 管理,Gitea 是更轻量的选择:Go 语言编写,512MB 内存即可流畅运行,启动时间不到 3 秒,Web 界面风格与 GitHub 高度相似,学习成本极低。本文在香港服务器上完成 Gitea 的完整部署。


一、Gitea vs GitLab vs GitHub 功能对比

功能GiteaGitLab CEGitHub
最低内存512MB4GBSaaS(无需自托管)
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 文件直接复用。

Telegram