这个项目是什么
我在 .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 次)
- 仓库只读复制源文件,从不改动被备份的内容,可整机还原
技术栈
使用 / 部署教程
部署步骤
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)。