项目/工具
工具 · 运行中

项目代码 Git 自动备份

每天自动把三台机器+NASH 的配置、文档、对话记录同步进 Git 仓库并推到 Gitea。

Gitrsync备份systemd

这个项目是什么

我在 .223 上建了一个 Git 仓库 /opt/homelab-git,把散落在三台机器和 NAS 上的东西收进版本管理:.164 NAS 上的程序与配置、.223 本机的服务配置、NAS 工作区的文档,以及全部 DSH 对话记录(包括 Windows 时代那份旧对话)。首次备份约 1400 个文件、183M。

为什么做

Homelab 最怕的是「配置改了忘了改哪」和「机器炸了重建一遍」。以前靠零散的 .bak 文件,能回滚但查不清来龙去脉。现在每天凌晨 1:00 自动同步一次并提交,任何改动都能查到哪天改的、改了什么。

顺带一个好处:历年改动留下的备份文件基本都还在硬盘上,我把它们一起收了进去,等于把旧版本的历史也补进了仓库。

怎么看

网页 https://xiejun-server.top/git/,主页第一张卡片也有入口;或者 ssh xiejun-server 后 cd /opt/homelab-git 直接 git log。网页是自动生成的,有累计备份次数、最近 40 次备份表、各部分体积与文件数,还有「按文件查改动」的搜索框(纯前端查询,支持 ?q=dashboard/app.js 这种直链)。页面上还有个「⚡ 立即同步一次」按钮,白天想更新时不用等凌晨。

现状

运行中,systemd 定时器每天 01:00:12 触发,已稳定跑了一段时间。仓库只读复制源文件,脚本从不修改被备份的内容。

功能

  • 每天 01:00 自动 rsync + commit,关机错过会在开机后补跑
  • 统一收纳 .164 配置、.223 服务配置、NAS 文档与全部 DSH 对话记录
  • 自动生成暗色主题进展网页,含最近 40 次备份、体积统计与「按文件查改动」搜索
  • 网页内「立即同步」按钮,带防滥用限流(60 秒间隔、每小时 20 次)
  • 仓库只读复制源文件,从不改动被备份的内容,可整机还原

技术栈

GitrsyncsystemdPythonNginx Proxy ManagerGiteaSSH

使用 / 部署教程

部署步骤

1. 准备仓库目录

在备份机(我这里是 .223)上建目录并 git init:

mkdir -p /opt/homelab-git && cd /opt/homelab-git
git init
git config user.name "backup" && git config user.email "backup@local"

2. 写同步脚本

/opt/homelab-git/sync.sh 大致做四件事:

  • 用 rsync 把各来源目录拉进 projects/164/、projects/223/、projects/nas/、conversations/;
  • git add -A && git commit -m "backup $(date +%F)"(无改动时跳过);
  • 调用 gen-page.py 生成进展页并 scp 到 Web 机;
  • 日志重定向到文件,失败时退出码非零。

注意脚本里要显式排除仓库自身目录,否则会自己同步自己。

3. 配 systemd 定时器

homelab-git-backup.service:Type=oneshot、Nice=10、TimeoutStartSec=3600。 homelab-git-backup.timer:OnCalendar=*-*-* 01:00:00、Persistent=true。

systemctl enable --now homelab-git-backup.timer
systemctl list-timers homelab-git-backup.timer   # 确认下次触发时间
systemctl start homelab-git-backup.service       # 手动跑一次验证
journalctl -u homelab-git-backup.service -n 50

4. 发布进展页

生成静态 index.html,scp 到 Web 机的目录,在 Nginx 里加:

location ^~ /git/ { alias /data/gitweb/; index index.html; }

如果要加「立即同步」按钮,再在备份机上跑一个小的 Python 标准库 HTTP 服务(监听内网端口),由 Nginx 反代到 /git/sync/,proxy_read_timeout 给到 300s。同步接口带 Token 校验,令牌文件 600 权限且不进 git。

5. 回退

systemctl disable --now homelab-git-backup.timer
rm -rf /opt/homelab-git    # 只删仓库,不影响源文件

通用注意事项

  • 跨机读取共享目录时权限常是坑,先确认只读挂载与属主;必要时在源端放开 a+rX。
  • 别用 cmd | grep -v xxx || warn 这种写法判断失败,grep 无匹配时退出码为 1 会误报,改成输出到临时文件再判断。
  • 配置路径要核实,别照着印象写(比如 natfrp 的配置在 /etc/natfrp,不是 /opt/natfrp)。

注意

  • 仓库含敏感内容:.164 的 /root/.ssh/(含私钥)、监控台 auth.json/token.txt、DSH 配置可能含 API Key。当前仓库只在 .223 本机、无远端,不要 push 到 GitHub 等公网仓库;若以后要推,先把密钥类文件加进排除清单。
  • /git/ 网页是公开无密码地址,页面只含目录名、文件名、体积与提交信息,不含口令——新增字段时注意别把敏感内容渲染进去。
  • 仓库在 .223,进展页托管在 .164;.164 挂了网页会 404,但备份与仓库本身不受影响。
  • NAS 共享对 .223 是只读的,要往 NAS 写文件必须经 .164 中转(scp → cp → chmod 664)。