Gitea 备份加密 5 分钟上手:给 dump 文件加一道解不开的锁
2026/8/24 5:01:20 网站建设 项目流程

Gitea 备份加密 5 分钟上手:给 dump 文件加一道解不开的锁

【免费下载链接】giteaGit with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD项目地址: https://gitcode.com/GitHub_Trending/gi/gitea

一次真实的备份翻车现场

公司 Gitea 服务器每晚 cron 自动备份。某天新同事不知道这个 Gitea 备份 zip 里装着全量代码库和整份数据库,好心把它传上了公开网盘"方便大家取用"。两天后有人在公网搜到了它,才被发现。问题不在没备份,而在那个备份文件是"裸压"状态——谁拿到谁就能打开。读完你能做到一件事:给备份文件加上一把别人解不开的锁。

60 秒搞懂 Gitea 备份流程:程序做 4 步,你做 1 步

你在服务器终端跑一条 dump 命令(相当于给整个 Gitea 拍一张全家福),数据会经历这些阶段:

  • 导出:先把数据库导出成一份 gitea-db.sql,用户、仓库、Issue 这些"账本"数据都在这里。
  • 收集:repos 目录下的仓库文件逐个收进来,开了 LFS、附件、包注册表的话也一起收。
  • 压缩:全部数据打进一个压缩包,默认 zip,也支持 tar.gz、tar.zst 等格式。
  • 落盘:写到指定路径,写完后程序会自动把文件权限设成 0600,即只有属主能读——这段逻辑在 cmd/dump.go 源码的 319-325 行附近,有兴趣可以翻翻。
  • 传输:往后的 scp、对象存储、网盘都靠你自己,这也是最容易被"看光"的一段。

前四步程序替你干了,第五步是你自己的活,加密就是你要补上去的那一层。

🔒 三档落地:从能跑到跑好

第一档·最小可用:先把完整备份跑起来

./gitea dump -f /backups/gitea-$(date +%F).zip

它在做什么:带日期落盘一份完整 zip(数据库+仓库+配置),写完自动 600 权限。记得把 /backups 目录权限设成 700,别的系统用户连目录都进不去。

  • ✅ 输出里出现 "Finish dumping in file",没有 Fatal 报错
  • ✅ ls -l 看到的文件权限是 600,目录是 700
  • ✅ 备份文件属主是专门跑备份的账号,而不是 root

第二档·进阶加固:加一层 GPG 对称加密

./gitea dump -f - | gpg --symmetric --cipher-algo AES256 --output /backups/gitea-$(date +%F).zip.gpg

它在做什么:-f - 让 dump 输出到标准输出,管道直接交给 gpg,落盘的就是 AES-256 密文,没有口令谁都打不开。⚠️ 口令放密码管理器里,别在服务器磁盘上写一个明文口令文件。跑 cron 时给 gpg 加上 --batch --passphrase-file 指向口令文件,否则它会在等输入的地方卡住。

  • ✅ 产物以 .gpg 结尾,直接 unzip 会报格式错误
  • ✅ 解密口令存在密码管理器,不在备份目录附近
  • ✅ 你亲手解密并还原过一次这个文件

第三档·团队协作:换密钥对,谁都不独占一个密码

./gitea dump -f - | gpg --encrypt -r backup-team -o /backups/gitea-$(date +%F).zip.gpg

它在做什么:改用 GPG 密钥对加密。持有团队私钥的人都能解,加新人就是多一个收件人,有人离职则吊销对应密钥,不用像口令那样"改了就得重加密全部历史"。⚠️ 私钥导出后离线存放,和备份文件放不同磁盘,别一个硬盘装下全家。

恢复演练也在这一步做,一条解密加一条还原:

gpg --decrypt /backups/gitea-20260801.zip.gpg > /tmp/backup.zip ./gitea restore-repo -r /tmp/backup -o admin -n demo

完整恢复的套路是:停服务 → 解包 → 把数据库 SQL 导进库里 → data 目录归位;restore-repo 负责把单个仓库放回去(实现见 cmd/restore_repo.go)。

  • ✅ 团队私钥已离线备份,不止一个人知道存放位置
  • ✅ 新成员用团队密钥解密过一次并成功
  • ✅ 最近一个季度做过一次完整恢复演练

4 个容易踩的坑

别笑,这四个坑都有人真实踩过。

坑 1|.gpg 备份和口令/私钥文件躺在同一个目录 → 锁和钥匙放一个抽屉,目录一泄露加密等于没做 → 密钥单独存放,跨"距离"隔离(别的盘、离线介质)。

坑 2|只压缩成 zip 就高枕无忧 → 压缩是省地方,不是上锁,谁拿到都能解开 → 传输前多一道 gpg 加密,"装进箱子"和"锁上箱子"是两件事。

坑 3|重跑备份命令报 "Dump file exists" 直接退出 → dump 拒绝覆盖同名已有文件,防的就是误删上一份 → 文件名带日期,另配一条定期清理旧备份的命令。

坑 4|恢复演练发现数据库是空的 → 备份命令上挂着 --skip-db 或 --skip-repository,你以为全量其实缺了半边 → 每次备份后扫一眼日志,确认数据库和仓库都真的进包了。

上线前的自查表

检查项怎么查期望结果
备份文件权限ls -l /backups/文件 600、目录 700,仅备份账号可读
内容真的加密了file /backups/gitea-*.gpg显示 PGP data,而不是 Zip archive
密钥存放位置看一眼口令/私钥在哪与备份文件不同磁盘
数据库在包里翻 dump 日志有 "Dumping database",且没被 skip
恢复演练查演练记录近一季度内做过,数据完整

下次 cron 跑起来的时候记得:zip 只是纸箱,锁还得你自己装。

【免费下载链接】giteaGit with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD项目地址: https://gitcode.com/GitHub_Trending/gi/gitea

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询