给Gitea备份上保险:从0到1搭好加密备份链路 📅 2026/8/24 1:53:56 给Gitea备份上保险从0到1搭好加密备份链路【免费下载链接】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-dump-xxx.zip里面是数据库全量导出、带着 SMTP 密码的 app.ini、所有私有仓库的完整文件——等于把机房钥匙连同图纸一起放进了公共快递柜。这类事故的根源不是运气差而是备份链路只做了打包没做保护。本文以 Gitea 的dump命令为基础讲透 Gitea 备份加密的落地路径从备份内容分级到目录权限、GPG/OpenSSL 加密、定时任务与留痕最后给出一套可执行的恢复演练清单。读完你能做到说清 Gitea 备份包里哪些内容最敏感、为什么明文存放等于裸奔用最小权限用户 700 目录把备份存放地的门锁上用 GPG 或 OpenSSL 两条路线给备份文件加防撬网并知道怎么选用定时任务 审计日志让备份自动跑、出事可追溯按清单完成一次真实恢复演练确认备份真的能救你本文导航章节内容预计耗时先看懂备份包里到底有什么内容分级与敏感点2 分钟落地三步搭好加密备份流水线权限、加密、定时化8 分钟容易翻车的5个地方排查对照表3 分钟把恢复当日常演练清单与流程图3 分钟一页纸速查表命令/配置/权限速查按需查阅先看懂备份包里到底有什么结论先行gitea dump生成的包不是几个文件的压缩包而是一份全量数据镜像明文存放它等同于把机房整体搬进公共快递柜。翻看 cmd/dump.go 的实现可以确认一个默认备份包依次装入这些内容包内条目内容敏感层级repos/所有 Git 仓库完整对象含私有仓库全部提交高泄露即代码泄露gitea-db.sql数据库全量导出含用户密码哈希、会话、Webhook 地址、OAuth 凭据高可直接撞库、横向渗透app.ini服务器配置含数据库口令、SMTP 密码、Secret Key高拿到即可冒充管理员data/LFS 对象、附件、包仓库文件中业务资产log/历史日志含部分请求与操作痕迹低辅助情报结构上可以这样理解一个备份包gitea-dump-20260823.zip ├── gitea-db.sql ← 数据库全量最敏感 ├── app.ini ← 全部配置含密钥 ├── repos/ ← 所有仓库 ├── data/ ← LFS / 附件 / 包 └── log/ ← 日志代码层面还有一个容易忽视的事实生成完成后Gitea 会把文件权限收紧为0600见 cmd/dump.go 末尾的os.Chmod但这只防同机其他用户防不了目录被误暴露、磁盘被物理接触、传输被中间人截获。权限是锁加密是防撬网两个都得有。注意app.ini在包内是无条件包含的不存在跳过配置的参数。只要包泄露密钥就泄露这是必须加密的第一理由。落地三步搭好加密备份流水线第1步给备份目录上最小权限的锁先做减法备份不该由功能用户gitea直接持有目录只允许备份专用用户进入。下面 4 行创建专用用户并把备份目录锁成 700防的是任何本机账户都能翻备份目录useradd -r -s /usr/sbin/nologin gitea-backup mkdir -p /var/backups/gitea chown -R gitea-backup:gitea /var/backups/gitea chmod 700 /var/backups/gitea执行完的验证命令ls -ld /var/backups/gitea应看到drwx------且属组为gitea-backup。风险专用用户没有登录 shell这是刻意的。任何方便起见给它开个 ssh的念头都会让这一层白做。第2步选一条加密传输与存储的路线打包和加密之间用管道衔接明文备份在磁盘上只存在几秒。gitea dump -f - --typetar会把裸 tar 流写到标准输出-f -即 stdout随后交给加密工具。先确认系统装有gpg或opensslgpg --version || openssl version。两条路线各有适用场景先看决策表再动手维度路线AGPG 对称加密路线BOpenSSL 密钥派生依赖gpg多数发行版预装openssl几乎必然有密钥形态密码短语文件支持--batch自动化口令文件-pbkdf2抗暴破密钥轮换重新对称加密旧备份即可同左且无密钥对管理负担适合谁已用 GPG 体系管密钥的团队环境精简、只信 OpenSSL 的场景选路线A的话下面这行把 dump 流直接加密落盘防的是备份文件本身被拷走sudo -u gitea-backup sh -c /usr/local/bin/gitea dump -f - --typetar | \ gpg --symmetric --cipher-algo AES256 --batch \ --passphrase-file /var/backups/gitea/.passphrase \ -o /var/backups/gitea/gitea-$(date %F).tar.gpg选路线B则换成这条防的同样是被拷走区别在于用 OpenSSL 的 KDF 派生密钥sudo -u gitea-backup sh -c /usr/local/bin/gitea dump -f - --typetar | \ openssl enc -aes-256-cbc -pbkdf2 -iter 200000 \ -pass file:/var/backups/gitea/.key \ -out /var/backups/gitea/gitea-$(date %F).tar.enc执行完的验证命令gpg --list-packets /var/backups/gitea/gitea-*.tar.gpg | head -n 2路线B用openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -pass file:/var/backups/gitea/.key -in 文件 | head -c 100 | tar t能列出包内容说明加密链路完整。坑.passphrase/.key必须chmod 600且移出备份目录。口令和备份放同一目录等于把备用钥匙和房产证装进同一个袋子。第3步让备份定时跑、把过程留痕手动跑一次不算完成只有跑进计划任务、且日志能查到每次成败才算流水线。下面这行把备份注册为每天 03:10 的 cron 任务stdout 与错误都落进日志(crontab -u gitea-backup -l 2/dev/null; \ echo 10 3 * * * /usr/local/bin/gitea-backup.sh /var/log/gitea-backup.log 21) \ | crontab -u gitea-backup -同时把 Gitea 自身的日志从 console 切到文件这样备份窗口内 dump 过程产生的信息也进日志而不是飘走。改 custom/conf/app.example.ini 中的[log]段为[log] MODE file LEVEL Info执行完的验证命令crontab -u gitea-backup -l应列出该行tail -n 20 /var/log/gitea-backup.log能看到最近一次成功输出Finish dumping to stdout。注意gitea-backup.sh里写死第2步的完整命令。cron 环境极简任何依赖交互输入的写法都会静默失败务必先手动su gitea-backup跑通脚本再交给 cron。容易翻车的5个地方现象原因修复密钥/口令存哪没共识团队各存一份口令文件散落在备份机各处口令文件单独存于异盘或密码管理器备份机上只留 600 权限副本轮换时先换口令再重加密解密时报BAD DECIPHERMENT或 GPG 直接拒绝口令文件版本对不上或备份在磁盘满时被截断写成半个文件解密前先校验包尾完整性tar 包最后应有 10240 字节零填充从上一个完整包重来cron 日志里一片Permission deniedcron 用户与目录属组不匹配或sudo未配免密统一用sudo -u gitea-backup执行目录属组保持gitea-backup不给人情属组换机器恢复失败restore 报找不到数据新机器目录结构、属主不一致数据库类型还不同先解包到临时目录核对内部结构tar tf用gitea restore-repo恢复仓库时指定--repo_dir与实际路径一致备份到一半失败报空间不足dump 的临时目录-t参数默认/tmp与备份盘是同一块盘双份写爆--tempdir指到另一块盘备份盘按备份包大小×2预留空间并纳入监控风险跨机器恢复是最容易平时没测、真出事才发现的环节。上面第4行对应的完整流程直接走下一节的演练清单。把恢复当日常备份的价值只在恢复成功的那一刻兑现。建议把演练固定为每季度一次或每次升级 Gitea 大版本后加做一次按下面的清单执行取最近一个加密包在非生产机上执行解密确认包可完整解开解包后gitea-db.sql非空、repos/下仓库数与生产一致ls repos | wc -l对照挑一个核心仓库恢复后验证提交历史git log --oneline | wc -l与备份前记录一致核对恢复后的 app.ini 中密钥可正常登录用测试账号别碰生产会话演练结果写进运维记录日期、人、耗时、是否通过注意演练用的密钥口令如果和日常用同一份演练本身就是一次口令泄露面审计——顺手检查有没有人把它拷到过别的地方。一页纸速查表类别条目速查命令打包到 stdoutgitea dump -f - --typetar命令GPG 加密落盘gpg --symmetric --cipher-algo AES256 --batch --passphrase-file .passphrase -o 目标.tar.gpg命令OpenSSL 加密落盘openssl enc -aes-256-cbc -pbkdf2 -iter 200000 -pass file:.key -out 目标.tar.enc命令恢复仓库gitea restore-repo --repo_dir 解包目录 --owner_name o --repo_name r配置日志落盘[log]下MODE file、LEVEL Info权限备份目录700属主gitea-backup权限口令文件600且不在备份目录内权限dump 产物Gitea 自动0600见 cmd/dump.go习惯定时任务cron 内先sudo -u gitea-backup手动跑通再上线习惯演练每季度一次核对解密完整、行数对得上、git log 完整三点链路搭完最后只问一句上周那份备份除了你还有谁能解开它【免费下载链接】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),仅供参考