Gitea 自动备份到 MinIO

方案说明

为了防止服务器故障、磁盘损坏或误操作导致代码仓库丢失,可以将 Gitea 数据目录定时同步到 MinIO 对象存储,实现异地备份。

本方案基于:

  • Gitea
  • MinIO
  • MinIO Client(mc)
  • Linux Crontab

同步方式采用 mc mirror,支持增量同步,仅传输新增或变更文件。


前置条件

0. docker compose 安装 MinIO

services:
  minio-server:  # 这里是正确的服务定义位置minio-server:
    image: quay.io/minio/minio:RELEASE.2025-04-03T14-56-28Z
    container_name: minio
    ports:
      - "9000:9000"  # API端口
      - "9001:9001"  # 控制台端口
    volumes:
      - /vol1/1000/docker/minio/data:/data  # 挂载数据目录
    environment:
      MINIO_ROOT_USER: username  # 默认管理员用户名
      MINIO_ROOT_PASSWORD: password  # 默认管理员密码
    command: server --console-address ":9001" /data  # 指定控制台端口和数据目录
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

1. 安装 MinIO Client

curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  -o /usr/local/bin/mc

chmod +x /usr/local/bin/mc

验证安装:

mc --version

2. 配置 MinIO 连接

添加 MinIO 服务:

mc alias set myminio \
  http://minio.example.com:9000 \
  ACCESS_KEY \
  SECRET_KEY

验证连接:

mc ls myminio

Gitea 数据目录

确认 Gitea 实际数据目录,例如:

/home/rong/gitea

目录通常包含:

gitea/
├── repositories/   # Git 仓库
├── lfs/            # Git LFS 文件
├── data/           # 附件及其他数据
├── conf/           # 配置文件
└── log/            # 日志

手动执行备份

执行同步:

mc mirror --overwrite \
  /home/rong/gitea \
  myminio/backup/gitea

同步完成后:

myminio
└── backup
    └── gitea
        ├── repositories
        ├── lfs
        ├── data
        └── conf

配置定时任务

编辑 Crontab:

crontab -e

添加:

0 4 * * * /usr/local/bin/mc mirror --overwrite /home/rong/gitea myminio/backup/gitea >> /home/rong/gitea-backup.log 2>&1

含义:

配置项说明
0 4 * * *每天凌晨 4 点执行
mc mirror目录镜像同步
–overwrite覆盖已存在文件
/home/rong/gitea本地 Gitea 数据目录
myminio/backup/giteaMinIO 备份目录
» log记录执行日志
2>&1记录错误日志

查看日志:

tail -f /home/rong/gitea-backup.log

关于 –remove 参数

可以使用:

mc mirror --overwrite --remove \
  /home/rong/gitea \
  myminio/backup/gitea

但不建议用于备份场景。

原因:

如果本地误删仓库:

/home/rong/gitea/repositories/project.git

下一次同步时,MinIO 中对应目录也会被删除。

因此:

  • -remove:适合灾备镜像
  • 不加 -remove:适合长期备份

推荐使用:

mc mirror --overwrite

数据恢复

从 MinIO 恢复:

mc mirror \
  myminio/backup/gitea \
  /home/rong/gitea

恢复完成后启动 Gitea:

docker restart gitea

或:

docker compose restart gitea

最佳实践

推荐策略:

  • 每天凌晨自动同步
  • MinIO 开启版本控制(Versioning)
  • 定期验证备份可恢复性
  • 重要数据同时备份到另一台服务器或云存储

推荐保留:

本地 Gitea
    ↓
MinIO 主备份
    ↓
异地存储(可选)

形成多副本备份体系,降低数据丢失风险。


示例目录结构

MinIO
└── backup
    └── gitea
        ├── repositories
        ├── lfs
        ├── data
        ├── conf
        └── log

该方案适用于 Docker 部署、NAS 部署以及传统 Linux 服务器部署的 Gitea 实例。