1. 为什么需要自建代码托管环境?
在云服务商提供的代码托管平台大行其道的今天,自建代码托管环境似乎是个"费力不讨好"的选择。但当我为团队连续三次遭遇云服务商突发故障导致CI/CD中断后,终于下定决心研究这个方案。自建环境的核心价值在于:
- 数据主权:所有代码资产物理存储位置完全可控,避免企业核心资产受第三方条款变更影响
- 成本优化:长期使用成本显著低于商业SaaS服务(以10人团队为例,云主机年费约$200 vs GitHub企业版$4200)
- 深度定制:可自由集成内部工具链,如自定义CI/CD流程、与内部审计系统对接等
- 网络隔离:适用于金融、政务等对网络隔离有硬性要求的场景
我选择的方案是Gitea+Docker组合。Gitea作为轻量级Git服务,其单二进制部署特性(仅约50MB内存占用)特别适合中小规模团队。实测在2核4G的云服务器上,可稳定支持20人团队的日常开发活动。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 服务器选型建议
根据负载评估选择合适配置:
- 开发测试用途:1核2G(阿里云轻量应用服务器约$5/月)
- 10人以下团队:2核4G(建议华为云通用计算型)
- 20人以上团队:4核8G(需搭配SSD云盘)
避坑提示:避免选择突发性能实例(如AWS t系列),代码仓库的频繁IO操作可能导致CPU积分快速耗尽
2.2 操作系统优化
以Rocky Linux 9为例的基础配置:
bash复制# 关闭SELinux(避免权限问题)
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 设置静态IP(生产环境必须)
nmcli con mod "eth0" ipv4.addresses "192.168.1.100/24"
nmcli con mod "eth0" ipv4.gateway "192.168.1.1"
nmcli con mod "eth0" ipv4.dns "8.8.8.8"
nmcli con mod "eth0" ipv4.method manual
nmcli con up "eth0"
# 基础工具安装
sudo dnf install -y git vim tmux
2.3 Docker环境部署
最新版Docker安装与调优:
bash复制# 卸载旧版本
sudo yum remove docker*
# 安装依赖
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
# 设置镜像加速(国内环境必须)
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 安装Docker CE
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动服务
sudo systemctl enable --now docker
# 验证安装
docker run hello-world
常见问题处理:
- Virtualization not enabled:需进入BIOS开启VT-x/AMD-V虚拟化支持
- Permission denied:将当前用户加入docker组
sudo usermod -aG docker $USER
3. Gitea服务部署实战
3.1 数据库准备
推荐使用PostgreSQL以获得更好性能:
bash复制docker run -d \
--name postgres \
-e POSTGRES_USER=gitea \
-e POSTGRES_PASSWORD=yourstrongpassword \
-e POSTGRES_DB=gitea \
-v /data/postgres:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:15
3.2 Gitea容器部署
生产级部署配置示例:
bash复制docker run -d \
--name=gitea \
--restart=always \
-p 3000:3000 \
-p 2222:22 \
-v /data/gitea:/data \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
--link postgres \
-e DB_TYPE=postgres \
-e DB_HOST=postgres \
-e DB_NAME=gitea \
-e DB_USER=gitea \
-e DB_PASSWD=yourstrongpassword \
gitea/gitea:1.20
关键参数说明:
/data/gitea:持久化存储仓库数据2222:22:SSH协议端口映射(避免与系统SSH冲突)--link postgres:容器间网络互通
3.3 初始配置向导
访问 http://服务器IP:3000 完成安装:
- 数据库设置:选择PostgreSQL,主机填写
postgres:5432 - 常规设置:
- 站点标题:Your Git Service
- 仓库根目录:保持默认
/data/git/repositories - 禁用注册(生产环境建议)
- 管理员账户:设置强密码(建议16位含特殊字符)
安全提示:立即配置HTTPS!可通过Nginx反向代理或直接使用Let's Encrypt证书
4. 高级配置与优化
4.1 邮件通知配置
修改/data/gitea/conf/app.ini:
ini复制[mailer]
ENABLED = true
HOST = smtp.yourdomain.com:465
FROM = git@yourdomain.com
USER = git@yourdomain.com
PASSWD = yourpassword
PROTOCOL = smtps
测试配置有效性:
bash复制docker exec -it gitea sh -c "gitea admin user mail-test --username admin"
4.2 仓库镜像同步
实现与GitHub/GitLab的自动同步:
bash复制# 创建同步任务
docker exec -it gitea sh -c "gitea repo sync-mirrors"
设置cron定时任务(每天凌晨同步):
bash复制0 3 * * * docker exec gitea sh -c "gitea repo sync-mirrors" >> /var/log/gitea_mirror.log 2>&1
4.3 性能调优参数
针对100+仓库的优化配置:
ini复制[database]
MAX_OPEN_CONNS = 100
CONN_MAX_LIFETIME = 3m
[repository]
ROOT = /data/git/repositories
SCRIPT_TYPE = bash
[server]
SSH_DOMAIN = git.yourdomain.com
DOMAIN = yourdomain.com
HTTP_PORT = 3000
ROOT_URL = https://git.yourdomain.com/
5. 安全加固与监控
5.1 基础安全措施
-
防火墙规则:
bash复制sudo firewall-cmd --permanent --add-port=3000/tcp sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload -
定期备份策略:
bash复制# 数据库备份 docker exec postgres pg_dump -U gitea gitea > /backups/gitea_db_$(date +%Y%m%d).sql # 仓库备份 tar czvf /backups/gitea_data_$(date +%Y%m%d).tar.gz /data/gitea
5.2 漏洞防护
针对CVE-2026-58053等权限漏洞的防护:
- 及时更新到Gitea最新版本
- 限制act_runner的网络访问:
bash复制
docker network create --internal gitea-internal docker network connect gitea-internal gitea
5.3 监控方案
Prometheus监控配置示例:
ini复制[metrics]
ENABLED = true
TOKEN = your_monitoring_token
Grafana仪表盘关键指标:
- 仓库操作延迟(P99 < 500ms)
- 内存使用率(<70%)
- 活动连接数(峰值预警)
6. 日常维护与问题排查
6.1 版本升级流程
无损升级步骤:
bash复制# 停止旧容器
docker stop gitea
# 备份数据
cp -r /data/gitea /data/gitea_backup_$(date +%Y%m%d)
# 拉取新镜像
docker pull gitea/gitea:latest
# 启动新容器(使用原有参数)
docker run ...(保持与之前相同的启动参数)
6.2 常见故障处理
问题1:仓库无法通过SSH访问
- 检查点:
bash复制# 验证端口映射 ss -tulnp | grep 2222 # 检查authorized_keys cat /data/gitea/ssh/authorized_keys
问题2:Docker容器频繁重启
- 排查命令:
bash复制# 查看容器日志 docker logs --tail 100 gitea # 检查资源限制 docker stats gitea
6.3 性能瓶颈分析
使用内置pprof工具:
bash复制# 生成30秒CPU profile
docker exec gitea sh -c "curl http://localhost:3000/debug/pprof/profile?seconds=30 > /data/cpu.pprof"
# 分析内存
go tool pprof /data/cpu.pprof
关键优化方向:
- 大文件仓库:启用git LFS
- 高频访问:配置Redis缓存
- 大量用户:启用分片存储
我在实际运维中发现,最影响用户体验的往往是SSH连接速度。通过将/data/gitea/ssh挂载到内存盘(tmpfs),可使SSH操作响应时间降低40%:
bash复制# 修改容器启动参数
-v /dev/shm/gitea-ssh:/data/gitea/ssh
