摘要: 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 出去。
八、写在最后
自建开发工具链的核心价值不是省钱,而是可控。你知道代码存在哪里、谁有权限访问、构建流程每一步在做什么。这种透明感在第三方平台上很难获得。
当然,维护成本是真实存在的——系统更新、安全补丁、备份验证、偶尔的服务重启。建议把运维操作文档化,形成团队知识库。当这些成本被量化后,你会发现它远低于因平台不可控带来的隐性风险。
