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),仅供参考