华为云 ECS 实战:基于 Docker Compose 搭建 Gitea 轻量级私有 Git 代码仓库与自动备份
前言
在个人独立开发或中小型研发团队的日常协作中,搭建一套私有的 Git 代码托管平台是保障核心源码资产安全、实现内网高速拉取与自动化 CI/CD 流水线构建的常见需求。相比 GitLab 动辄需要 4GB 甚至 8GB 以上的运行内存开销,采用 Go 语言编写的开源项目 Gitea 极其轻量——仅需不到 200MB 内存即可流畅提供代码仓库管理、Pull Request 审查、Issue 跟踪以及Gitea Actions 自动化流水线等完整功能。
本文将完整演示在华为云弹性云服务器(ECS)或 Flexus 应用服务器 L 实例(Ubuntu 22.04)环境下,使用 Docker Compose 一键部署 Gitea 私有代码托管平台,并结合宿主机 Nginx 配置反向代理与自动化归档备份。
一、 环境准备与目录规划
为了确保代码仓库文件、数据库与配置信息的持久化安全,我们在宿主机的 /opt/gitea 目录下创建独立的工作目录,并正确配置容器内运行用户(UID/GID 为 1000)的目录权限:
# 1. 创建 Gitea 持久化数据与备份目录
sudo mkdir -p /opt/gitea/{data,config,backup}
cd /opt/gitea
# 2. 将数据与配置目录权限赋予容器默认用户 (1000:1000)
sudo chown -R 1000:1000 /opt/gitea/data /opt/gitea/config
各目录职责说明:
data/:存放所有的 Git 裸仓库数据、SQLite 数据库文件、附件以及头像等静态资源。config/:存放 Gitea 的核心配置文件app.ini。backup/:存放每日定时打包生成的仓库快照压缩包。
二、 编写 Docker Compose 编排文件并启动服务
对于 10 人以内的中小团队或个人开发者,使用 Gitea 内置的 SQLite3 或轻量容器数据库即可获得极佳的响应速度,同时将华为云 ECS 的内存消耗降至最低。
1. 创建 docker-compose.yml 文件
為了避免與宿主机原本的 SSH 端口(默认 22)产生冲突,我们将容器的 Git SSH 端口映射在宿主机的 2222 端口,并将 Web 访问端口仅绑定在本地回环地址 127.0.0.1:3000(后续由宿主机 Nginx 统一代理):
sudo tee /opt/gitea/docker-compose.yml << 'EOF'
version: "3.8"
services:
gitea:
image: gitea/gitea:1.22-rootless
container_name: gitea-server
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
- GITEA__database__PATH=/var/lib/gitea/gitea.db
- GITEA__server__DOMAIN=git.yourdomain.com
- GITEA__server__SSH_DOMAIN=git.yourdomain.com
- GITEA__server__SSH_PORT=2222
- GITEA__server__SSH_LISTEN_PORT=2222
- GITEA__service__DISABLE_REGISTRATION=false
- TZ=Asia/Shanghai
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "2222:2222"
EOF
2. 启动 Gitea 容器
执行以下命令拉取镜像并在后台启动服务:
sudo docker-compose up -d
# 查看容器运行状态与启动日志
sudo docker-compose ps
sudo docker logs --tail 30 gitea-server
当终端日志输出 Listen: http://0.0.0.0:3000 时,说明 Gitea 核心服务已启动完毕。
三、 配置宿主机 Nginx 反向代理与大文件上传优化
在使用 Git 推送包含大型依赖或二进制资源的仓库时,如果 Nginx 默认的请求体大小限制(1MB)过小,会导致 git push 报错 HTTP 413 Request Entity Too Large。因此我们需要在 Nginx 层做针对性调优。
1. 编写 Nginx 配置文件
新建 /etc/nginx/conf.d/gitea.conf:
sudo tee /etc/nginx/conf.d/gitea.conf << 'EOF'
server {
listen 80;
server_name _; # 如有域名可替换为实际域名,如 git.yourdomain.com
# 允许上传最大 200MB 的单次 Git 推送包或 Release 附件
client_max_body_size 200M;
access_log /var/log/nginx/gitea_access.log;
error_log /var/log/nginx/gitea_error.log;
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_read_timeout 300s;
proxy_send_timeout 300s;
}
}
EOF
检查配置语法并重载 Nginx:
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
2. 初始化管理员账号与关闭公开注册
- 确保华为云控制台 安全组 -> 入方向规则 已放行
TCP: 80和TCP: 2222。 - 在浏览器访问
http://<你的华为云EIP>,进入 Gitea 首次安装向导页面。 - 核对基础设置后,在页面底部展开 “管理员帐号设置”,填写你的管理员用户名与密码,点击 “立即安装”。
- 安全加固:创建完团队成员账号后,建议修改
/opt/gitea/config/app.ini,将DISABLE_REGISTRATION = false改为true,随后执行sudo docker restart gitea-server关闭公开注册,防止陌生人随意注册使用你的私有代码库。
四、 编写代码仓库定时打包备份脚本
源码数据至关重要,我们可以通过定时打包 /opt/gitea/data 与 /opt/gitea/config 目录来实现完整的代码库与配置快照备份。
1. 创建备份脚本 gitea_backup.sh
sudo tee /opt/gitea/gitea_backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/gitea/backup"
DATE_STR=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/gitea_full_backup_${DATE_STR}.tar.gz"
RETENTION_DAYS=7
mkdir -p ${BACKUP_DIR}
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始打包备份 Gitea 数据与配置..." >> ${BACKUP_DIR}/backup.log
# 使用 tar 压缩打包数据目录与配置目录
tar -czf ${BACKUP_FILE} -C /opt/gitea data config
if [ -s "${BACKUP_FILE}" ]; then
SIZE=$(du -sh "${BACKUP_FILE}" | awk '{print $1}')
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份成功: ${BACKUP_FILE} (${SIZE})" >> ${BACKUP_DIR}/backup.log
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [错误] 备份生成失败!" >> ${BACKUP_DIR}/backup.log
exit 1
fi
# 清理超过 7 天的旧备份包
find ${BACKUP_DIR} -name "gitea_full_backup_*.tar.gz" -type f -mtime +${RETENTION_DAYS} -delete
EOF
sudo chmod +x /opt/gitea/gitea_backup.sh
2. 添加 Crontab 每日凌晨自动备份
设置每天凌晨 03:15 自动执行一次全量归档备份:
(sudo crontab -l 2>/dev/null; echo "15 3 * * * /opt/gitea/gitea_backup.sh") | sudo crontab -
总结
借助 Docker 容器化技术与 Gitea 极高的资源利用率,即使在入门级 1核1G 或 2核2G 的华为云 ECS 实例上,我们也能轻松构建起媲美大型代码托管平台的私有化 Git 服务。通过配合 Nginx 请求体调优与定时全量归档脚本,既保障了日常大体积代码推送的流畅度,也为团队核心源码资产提供了可靠的数据兜底。
- 点赞
- 收藏
- 关注作者
评论(0)