自建Git服务器完整指南:Gitea在香港VPS部署、代码托管与CI/CD集成实战

GitHub、GitLab虽然方便,但私有代码托管在第三方平台存在数据主权问题,且私有仓库有数量或协作限制。Gitea是轻量级开源Git服务,比GitLab占用资源少90%,非常适合在香港VPS上自建私有代码托管服务。

一、Gitea vs GitLab vs Gogs 对比

特性GiteaGitLab CEGogs
最低内存要求128MB4GB64MB
内置CI/CDGitea Actions(兼容GitHub)GitLab CI(功能完整)
Issue追踪✅(更完整)基础
代码审查(PR)
用户管理
LFS支持
社区活跃度非常活跃极高较低
中文支持完整部分完整

二、Docker Compose部署Gitea

<code">mkdir -p /srv/gitea && cd /srv/gitea
<code"># docker-compose.yml
version: '3.8'

services:
  gitea:
    image: gitea/gitea:1.21
    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__server__DOMAIN: git.yourdomain.com
      GITEA__server__SSH_DOMAIN: git.yourdomain.com
      GITEA__server__ROOT_URL: https://git.yourdomain.com
      GITEA__server__HTTP_PORT: 3000
      GITEA__server__SSH_PORT: 2222
      GITEA__server__DISABLE_SSH: "false"
      GITEA__service__DISABLE_REGISTRATION: "true"   # 关闭注册(私有服务器)
      GITEA__service__REQUIRE_SIGNIN_VIEW: "true"    # 未登录不可查看
      GITEA__mailer__ENABLED: "true"
      GITEA__mailer__FROM: noreply@yourdomain.com
      GITEA__mailer__SMTP_ADDR: mail.yourdomain.com
      GITEA__mailer__SMTP_PORT: 465
      GITEA__mailer__USER: noreply@yourdomain.com
      GITEA__mailer__PASSWD: 邮箱密码
    volumes:
      - gitea_data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"
      - "0.0.0.0:2222:22"    # SSH端口暴露到公网(克隆代码用)
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: gitea
      POSTGRES_USER: gitea
      POSTGRES_PASSWORD: 数据库密码
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U gitea"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  gitea_data:
  db_data:
<code">docker compose up -d

# 首次访问 https://git.yourdomain.com 完成安装向导
# 配置管理员账号后即可使用

三、Nginx HTTPS反向代理

<code">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 100M;    # 允许推送大文件

    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;

        proxy_http_version 1.1;
        proxy_set_header Connection "";    # 启用HTTP keep-alive

        proxy_read_timeout 300;            # Git大文件推送超时
    }
}

四、SSH克隆配置

<code"># Gitea监听2222端口提供SSH服务
# 在本地 ~/.ssh/config 中配置别名

Host gitea
    HostName git.yourdomain.com
    Port 2222
    User git
    IdentityFile ~/.ssh/id_ed25519

# 在Gitea中添加SSH公钥
# 用户设置 → SSH密钥 → 添加密钥
cat ~/.ssh/id_ed25519.pub

# 克隆仓库
git clone gitea:your-username/your-repo.git

# 或使用完整格式
git clone ssh://git@git.yourdomain.com:2222/your-username/your-repo.git

五、Gitea Actions CI/CD(兼容GitHub Actions语法)

<code"># .gitea/workflows/deploy.yml
# 语法与GitHub Actions完全兼容

name: Build and Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'

      - name: Install Dependencies
        run: composer install --no-dev --optimize-autoloader

      - name: Run Tests
        run: php vendor/bin/phpunit

      - name: Deploy to Server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          port: 2233
          script: |
            cd /var/www/html
            git pull origin main
            composer install --no-dev --optimize-autoloader
            systemctl reload php8.1-fpm

安装并启动Gitea Runner

<code"># 在执行CI任务的服务器上安装Gitea Runner
# 下载对应版本
wget https://dl.gitea.com/act_runner/latest/act_runner-linux-amd64
chmod +x act_runner-linux-amd64
mv act_runner-linux-amd64 /usr/local/bin/act_runner

# 注册Runner(在Gitea后台获取Token:站点管理→Runner→创建Runner)
act_runner register \
    --instance https://git.yourdomain.com \
    --token 你的Runner注册Token \
    --name my-runner \
    --labels ubuntu-latest:docker://node:20-bookworm

# 启动Runner
act_runner daemon

六、Webhook触发自动部署

<code"># 在Gitea仓库设置中添加Webhook:
# 仓库 → 设置 → Webhooks → 添加Webhook

# Webhook URL示例:https://yourdomain.com/git-deploy-hook.php
# Secret:用于验证请求来自Gitea
<code"><?php // git-deploy-hook.php $secret = '你的Webhook Secret'; $payload = file_get_contents('php://input'); $sig = 'sha256=' . hash_hmac('sha256', $payload, $secret); // 验证签名 if (!hash_equals($sig, $_SERVER['HTTP_X_GITEA_SIGNATURE'] ?? '')) { http_response_code(403); exit('签名验证失败'); } $data = json_decode($payload, true); $branch = $data['ref'] ?? ''; // 只处理main分支推送 if ($branch === 'refs/heads/main') { $output = shell_exec('cd /var/www/html && git pull origin main 2>&1');
    echo $output;
}

http_response_code(200);

七、数据备份策略

<code">#!/bin/bash
# /usr/local/bin/gitea-backup.sh
# 每天凌晨2点执行

BACKUP_DIR="/backup/gitea"
DATE=$(date +%Y%m%d)

mkdir -p "$BACKUP_DIR"

# 备份Gitea数据(包含仓库、数据库、附件等)
docker compose -f /srv/gitea/docker-compose.yml exec gitea \
    gitea admin git-repos backup --config /data/gitea/conf/app.ini \
    --output /data/gitea-backup-${DATE}.zip

# 从容器中复制备份文件
docker cp gitea-gitea-1:/data/gitea-backup-${DATE}.zip "$BACKUP_DIR/"

# 只保留最近30天的备份
find "$BACKUP_DIR" -name "*.zip" -mtime +30 -delete

echo "Gitea备份完成:$BACKUP_DIR/gitea-backup-${DATE}.zip"

八、总结

Gitea在1核1G的香港VPS上即可流畅运行,支持无限私有仓库、团队协作、代码审查和CI/CD。完全自托管意味着代码数据完全私有,无外部依赖。IDC.Net的香港VPS网络稳定,Git push/pull的速度快,是私有代码仓库的优质托管平台。

THE END