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

举报
yd_273651526 发表于 2026/11/09 11:25:54 2026/11/09
【摘要】 本文详细记录了在华为云弹性云服务器(ECS)Ubuntu 22.04 环境下,使用 Docker Compose 快速搭建 Gitea 私有代码托管平台的完整流程,涵盖双端口映射隔离、Nginx 反向代理大文件推送调优、关闭公开注册安全加固以及代码仓库每日自动化定时归档备份。

前言

对于小型研发团队或独立开发者而言,拥有一套自主可控的私有 Git 代码托管平台,不仅能保障核心业务源码的绝对安全,还能在局域网或云端内网环境中获得极速的代码拉取与推送体验。传统的 GitLab 功能虽然全面,但其动辄占用 4GB 以上的物理内存,对于常规规格的云服务器负担较重。而采用 Go 语言编写的开源轻量级代码托管方案 —— Gitea,在提供完整的仓库管理、Pull Request 代码审查、Issue 追踪及 Actions 持续集成功能的同时,日常运行仅需不到 150MB 内存。

本文将完整演示在华为云弹性云服务器(ECS)Ubuntu 22.04 环境下,利用 Docker Compose 部署 Gitea 私有代码仓库,并配置 宿主机 Nginx 反向代理及源码仓库每日定时归档备份。

一、 环境准备与目录规划

在开始部署前,我们先在华为云 ECS 宿主机上创建专门的工作目录,用于持久化存储 Git 仓库源码、自定义配置以及数据库文件:

# 创建 Gitea 容器化工作目录与备份目录
sudo mkdir -p /opt/gitea/{data,backup}
cd /opt/gitea

# 赋予数据目录合适的读写权限
sudo chmod -R 755 /opt/gitea

同时,请确保已在华为云控制台 安全组 -> 入方向规则 中放行 Web 访问所需的 TCP: 80/443 端口,以及用于 Git SSH 协议推送的独立端口(本文使用 TCP: 2222,避免与宿主机自身的 22 端口产生冲突)。

二、 使用 Docker Compose 编排并启动 Gitea

为了使整套系统更加轻量易维护,我们直接采用支持高并发读写的 SQLite3(或按需挂载已有的 MySQL 实例)作为后端存储,编写 /opt/gitea/docker-compose.yml 文件:

sudo tee /opt/gitea/docker-compose.yml << 'EOF'
version: "3.8"

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea-server
    restart: always
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - TZ=Asia/Shanghai
      - GITEA__server__DOMAIN=git.example.com
      - GITEA__server__HTTP_PORT=3000
      - GITEA__server__SSH_PORT=2222
      - GITEA__server__SSH_LISTEN_PORT=22
      # 首次初始化完成后,建议将下方参数改为 true 以禁止陌生人公开注册
      - GITEA__service__DISABLE_registration=false
    ports:
      # Web 界面仅绑定本地回环地址,由宿主机 Nginx 统一反向代理
      - "127.0.0.1:3000:3000"
      # 暴露 2222 端口用于处理客户端的 git@ 密钥推送请求
      - "2222:22"
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
EOF

参数说明:

  • 127.0.0.1:3000:3000:将 Gitea 的 HTTP 服务绑定在本地回环端口,避免直接暴露在公网,由外部 Nginx 统一承载流量。
  • 2222:22:将容器内部的 SSH 服务映射到宿主机的 2222 端口,这样既不影响开发者通过 22 端口 SSH 登录华为云 ECS 宿主机,又能支持 ssh://git@域名:2222/用户名/仓库.git 的高速免密代码拉取。

执行以下命令一键启动容器:

sudo docker-compose up -d

# 检查容器运行状态与启动日志
sudo docker ps | grep gitea-server
sudo docker logs --tail 30 gitea-server

三、 配置宿主机 Nginx 反向代理与大文件上传优化

在日常开发中,向 Git 仓库推送包含大型依赖或二进制资源的 Commit 时,如果 Nginx 默认限制了请求体大小(默认仅为 1MB),客户端会报错 RPC failed; HTTP 413 curl 22 The requested URL returned error: 413。因此,我们需要在 Nginx 代理配置中显式放宽上传体积限制。

新建站点配置文件 /etc/nginx/conf.d/gitea_proxy.conf:

sudo tee /etc/nginx/conf.d/gitea_proxy.conf << 'EOF'
server {
    listen 80;
    server_name _; # 可替换为你的实际域名,如 git.example.com

    # 允许单次推送最大 200MB 的代码包或 LFS 附件
    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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
    }
}
EOF

移除默认站点冲突并重载 Nginx:

sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

此时,在浏览器访问 http://<你的华为云EIP>,即可进入 Gitea 的初始化安装引导界面。

四、 初始化安全加固:关闭公开注册与性能优化

在网页端创建完第一个管理员账号后,为了防止公网无关人员随意注册账号占用服务器存储资源,我们可以通过修改配置文件 /opt/gitea/data/gitea/conf/app.ini 彻底锁定注册入口,仅允许管理员在后台手动创建团队成员账号:

# 将 DISABLE_REGISTRATION 修改为 true
sudo sed -i 's/DISABLE_REGISTRATION = false/DISABLE_REGISTRATION = true/g' /opt/gitea/data/gitea/conf/app.ini

# 重启容器使安全策略立即生效
sudo docker restart gitea-server

五、 编写 Git 仓库全量归档与自动备份脚本

代码资产是研发团队的核心命脉。我们可以通过简单的打包脚本,每天凌晨将 /opt/gitea/data 目录(包含所有 Git 裸仓库、Wiki、Issue 数据库及配置文件)完整归档压缩,并自动清理过期备份。

1. 创建备份脚本 gitea_backup.sh

sudo tee /opt/gitea/gitea_backup.sh << 'EOF'
#!/bin/bash

BACKUP_DIR="/opt/gitea/backup"
DATA_DIR="/opt/gitea/data"
DATE_STR=$(date +"%Y%m%d_%H%M%S")
ARCHIVE_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 -czf ${ARCHIVE_FILE} -C /opt/gitea data 2>/dev/null

if [ -s "${ARCHIVE_FILE}" ]; then
    SIZE=$(du -sh "${ARCHIVE_FILE}" | awk '{print $1}')
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份成功: ${ARCHIVE_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:00 自动执行全量归档备份:

(sudo crontab -l 2>/dev/null; echo "0 3 * * * /opt/gitea/gitea_backup.sh") | sudo crontab -

总结

借助 Docker Compose 容器化技术与 Gitea 极致的资源利用率,哪怕是在 1核2G 或 2核4G 的华为云 ECS 入门级实例上,我们也能轻松搭建起一套响应迅速、功能完备的私有 Git 代码托管平台。配合 Nginx 大体积推送调优与每日自动化归档脚本,既满足了研发团队的日常协作需求,又确保了核心代码资产的安全无虞。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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