华为云 ECS 实战:基于 Docker Compose 搭建 Gitea 轻量级私有 Git 代码仓库与自动备份

举报
yd_273651526 发表于 2026/11/07 12:28:18 2026/11/07
【摘要】 本文详细记录了在华为云弹性云服务器(ECS)Ubuntu 22.04 环境下,利用 Docker Compose 部署 Gitea 轻量级私有 Git 代码托管平台的完整流程,包含 Rootless 容器安全配置、Nginx 大文件推送调优、关闭公开注册安全加固以及 Crontab 每日定时归档备份。

前言

在个人独立开发或中小型研发团队的日常协作中,搭建一套私有的 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. 初始化管理员账号与关闭公开注册

  1. 确保华为云控制台 安全组 -> 入方向规则 已放行 TCP: 80 和 TCP: 2222。
  2. 在浏览器访问 http://<你的华为云EIP>,进入 Gitea 首次安装向导页面。
  3. 核对基础设置后,在页面底部展开 “管理员帐号设置”,填写你的管理员用户名与密码,点击 “立即安装”。
  4. 安全加固:创建完团队成员账号后,建议修改 /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 请求体调优与定时全量归档脚本,既保障了日常大体积代码推送的流畅度,也为团队核心源码资产提供了可靠的数据兜底。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。