自建Git服务器完整指南:Gitea在香港VPS部署、代码托管与CI/CD集成实战
GitHub、GitLab虽然方便,但私有代码托管在第三方平台存在数据主权问题,且私有仓库有数量或协作限制。Gitea是轻量级开源Git服务,比GitLab占用资源少90%,非常适合在香港VPS上自建私有代码托管服务。
一、Gitea vs GitLab vs Gogs 对比
| 特性 | Gitea | GitLab CE | Gogs |
|---|---|---|---|
| 最低内存要求 | 128MB | 4GB | 64MB |
| 内置CI/CD | Gitea 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的速度快,是私有代码仓库的优质托管平台。
版权声明:
作者:后浪云
链接:https://idc.net/help/442841/
文章版权归作者所有,未经允许请勿转载。
THE END
