个人开发者如何低成本搭建私有Git仓库与CI/CD流水线


摘要: GitHub访问不稳定、代码存在合规顾虑、或者只是想完全掌控自己的开发环境?本文面向个人开发者和小团队,手把手教你用一台最基础的VPS搭建私有Git服务(Gitea)+ 自动化构建(Drone CI),月成本不到一杯奶茶钱。


一、为什么需要私有Git仓库

GitHub依然是全球开发者的首选,但国内用户或多或少遇到过这些问题:网页加载慢、git push/pull超时、Release附件下载失败。对于个人项目或许还能忍,一旦涉及团队协作或客户交付,这些不确定性就成了风险点。

更现实的考量是数据主权。某些行业的代码、文档、配置信息不适合托管在第三方平台,即使GitHub有私有仓库。自建Git服务意味着你的代码只存在于你控制的服务器上,配合定期异地备份,安全性并不输给大厂。

成本方面,一台1C1G的VPS足以支撑5人以内团队的日常开发,月付低至5美元。相比GitHub Team版每人每月4美元,自建方案在3人以上团队就开始显现成本优势。

二、选型:Gitea为什么比GitLab更适合个人

GitLab功能最全,但资源消耗惊人。官方最低配置要求2核4G内存,实际使用中4核8G才能流畅运行。对于个人开发者,这是严重的资源浪费。

Gitea是Go语言编写的轻量级Git服务,功能覆盖GitLab核心需求的80%以上:代码托管、Issue追踪、Pull Request、Wiki、Actions(CI/CD)、包管理、代码审查。而它的内存占用通常只有100-300MB,1C1G的VPS运行Gitea + Drone CI + Nginx绰绰有余。

另一个选择是Gogs,Gitea的前身。但Gitea社区更活跃、功能迭代更快,2024年后新增的Actions功能直接对标GitHub Actions,个人开发者强烈建议选Gitea。

三、环境准备与Gitea安装

假设你有一台运行Ubuntu 22.04的VPS,已配置好SSH密钥登录和基础防火墙。

安装依赖

sudo apt update
sudo apt install -y git sqlite3

Gitea默认使用SQLite数据库,个人使用完全够用。团队规模扩大后可无缝迁移到MySQL/PostgreSQL。

创建专用用户

sudo adduser --system --group --disabled-password --home /var/lib/gitea gitea
sudo mkdir -p /var/lib/gitea/{custom,data,log,repositories}
sudo chown -R gitea:gitea /var/lib/gitea
sudo chmod 750 /var/lib/gitea

下载并安装Gitea

VERSION="1.22.0"
wget -O /tmp/gitea https://dl.gitea.com/gitea/${VERSION}/gitea-${VERSION}-linux-amd64
sudo mv /tmp/gitea /usr/local/bin/
sudo chmod +x /usr/local/bin/gitea

创建Systemd服务

sudo tee /etc/systemd/system/gitea.service > /dev/null <<EOF
[Unit]
Description=Gitea
After=network.target

[Service]
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea
ExecStart=/usr/local/bin/gitea web -c /var/lib/gitea/custom/conf/app.ini
Restart=always
Environment=USER=gitea HOME=/var/lib/gitea GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now gitea

初始化配置

浏览器访问 http://你的VPS_IP:3000,按向导完成首次配置。关键设置项:

数据库类型选SQLite3,路径保持默认。基础URL填写你规划的域名,如 https://git.yourdomain.com。默认启用离线模式(DISABLE_REGISTRATION=true),关闭公开注册,后续手动添加团队成员。

四、Nginx反向代理与HTTPS

安装Nginx和Certbot

sudo apt install -y nginx certbot python3-certbot-nginx

配置Nginx

sudo tee /etc/nginx/sites-available/gitea > /dev/null <<EOF
server {
    listen 80;
    server_name git.yourdomain.com;

    location / {
        proxy_pass http://localhost: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;
        client_max_body_size 512M;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

申请SSL证书

sudo certbot --nginx -d git.yourdomain.com

完成后访问 https://git.yourdomain.com,确认HTTPS正常工作。

五、Drone CI:轻量级持续集成

Drone与Gitea天然兼容,配置简单,资源占用低。

安装Drone Server

sudo docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITEA_SERVER=https://git.yourdomain.com \
  --env=DRONE_GITEA_CLIENT_ID=你的GiteaOAuth应用ID \
  --env=DRONE_GITEA_CLIENT_SECRET=你的GiteaOAuth密钥 \
  --env=DRONE_RPC_SECRET=随机生成的密钥 \
  --env=DRONE_SERVER_HOST=ci.yourdomain.com \
  --env=DRONE_SERVER_PROTO=https \
  --publish=8080:80 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

安装Drone Runner

sudo docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=https \
  -e DRONE_RPC_HOST=ci.yourdomain.com \
  -e DRONE_RPC_SECRET=同上 \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=runner-1 \
  -p 3001:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

配置Gitea OAuth

在Gitea管理后台 → 应用 → 创建OAuth2应用,填写Drone的回调地址(https://ci.yourdomain.com/login),获取Client ID和Client Secret填入上面的Drone启动参数。

编写Pipeline

在项目根目录创建 .drone.yml

kind: pipeline
type: docker
name: build

steps:
  - name: test
    image: node:20
    commands:
      - npm ci
      - npm test

  - name: build
    image: node:20
    commands:
      - npm run build
    when:
      branch:
        - main

  - name: deploy
    image: appleboy/drone-scp
    settings:
      host: 你的服务器IP
      username: deploy
      key:
        from_secret: ssh_key
      target: /var/www/yourapp
      source: dist/*
    when:
      branch:
        - main
      event:
        - push

提交代码后,Drone自动触发构建、测试、部署全流程。

六、备份策略:别让心血付诸东流

自建服务的最大风险是数据丢失。建议三层备份:

本地定时备份。Gitea提供内置备份命令:

sudo -u gitea gitea dump -c /var/lib/gitea/custom/conf/app.ini -w /var/lib/gitea -f /backup/gitea-backup.zip

配合crontab每日凌晨执行,保留最近7天备份。

异地自动同步。将备份文件同步到对象存储(如腾讯云COS、阿里云OSS)或另一台VPS。工具推荐rclone,支持几乎所有主流存储后端:

rclone sync /backup remote:backup-bucket --include "gitea-*.zip"

灾难恢复演练。每季度至少做一次恢复测试,确认备份文件完整可用。很多团队备份做了三年,真到用时才发现文件损坏或缺少关键数据。

七、性能调优与扩展路径

当前1C1G配置支撑5人团队日常开发无压力。若团队扩大或项目增多,可按以下路径扩展:

垂直扩展。升级VPS配置到2C2G或2C4G,Gitea和Drone都能直接利用更多资源,无需额外配置。

读写分离。Gitea支持将Git操作和Web请求分离到不同实例,数据库也可迁移到独立服务器。

对象存储。仓库中的大文件(如设计稿、二进制包)迁移到对象存储,减轻本地磁盘压力。Gitea内置LFS(Large File Storage)支持。

外部CI。当Drone的构建队列经常排满时,可考虑接入GitHub Actions Runner或自建Jenkins集群,将CI负载 offload 出去。

八、写在最后

自建开发工具链的核心价值不是省钱,而是可控。你知道代码存在哪里、谁有权限访问、构建流程每一步在做什么。这种透明感在第三方平台上很难获得。

当然,维护成本是真实存在的——系统更新、安全补丁、备份验证、偶尔的服务重启。建议把运维操作文档化,形成团队知识库。当这些成本被量化后,你会发现它远低于因平台不可控带来的隐性风险。



Docker Swarm还是K3s?个人VPS上的容器编排终极二选一

为什么你的香港VPS晚高峰卡成PPT?线路真相与自救方案

评 论
更换验证码