自建Git服务器实现一键重装恢复
最近花了点时间把Mac上的工作环境整理了一下,核心是搭建了一套Git服务器方案,目标是:系统重装后10分钟内完全恢复所有工作配置。
背景
平时在Mac mini上跑OpenClaw和一些技能脚本,配置文件、记忆文件、技能代码散落在各处。之前用本地备份脚本,但不够优雅。现在改用Git集中管理,配合Git服务器的匿名访问功能,实现真正的一键恢复。
架构
服务器: Debian虚拟机 (10.10.10.230) 客户端: Mac mini (SSH密钥认证) 备份策略: Git + Git Daemon匿名只读
仓库设计
设计了4个仓库,各司其职:
| 仓库 | 用途 | 访问方式 |
|---|---|---|
| openclaw-memory | 记忆文件、AGENTS.md、MEMORY.md | SSH读写 |
| openclaw-skills | 技能代码(不含node_modules) | SSH读写 |
| openclaw-dotfiles | .zshrc、Brewfile、SSH公钥 | SSH读写 |
| openclaw-recovery | 恢复脚本、私钥、文档 | Git匿名只读 |
关键点在于recovery仓库:它包含SSH私钥和恢复脚本,通过Git Daemon提供匿名只读访问。这意味着重装系统后,无需任何认证就能获取私钥,然后自动配置SSH,再拉取其他仓库。
服务器配置
1. 创建Git用户和仓库
useradd -m -d /home/git -s /bin/bash git
mkdir -p /srv/git
cd /srv/git
git init --bare openclaw-memory.git
git init --bare openclaw-skills.git
git init --bare openclaw-dotfiles.git
git init --bare openclaw-recovery.git
chown -R git:git /srv/git
2. 配置SSH密钥认证
# Mac上生成密钥
ssh-keygen -t rsa -b 4096 -C "openclaw@macmini"
# 公钥添加到服务器
cat ~/.ssh/id_rsa.pub >> /home/git/.ssh/authorized_keys
3. 启用Git Daemon匿名访问
apt install -y git-daemon-run
cat > /etc/systemd/system/git-daemon.service << 'EOF'
[Unit]
Description=Git Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/lib/git-core/git-daemon --reuseaddr --base-path=/srv/git --export-all --verbose
Restart=always
User=git
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable git-daemon
systemctl start git-daemon
Git Daemon在9418端口提供匿名只读访问,地址格式:git://10.10.10.230/仓库名
一键恢复脚本
恢复脚本的核心逻辑:
#!/bin/bash
# 1. 匿名获取恢复文件和私钥
git clone git://10.10.10.230/openclaw-recovery.git /tmp/recovery
cd /tmp/recovery
# 2. 部署私钥
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cp id_rsa ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
# 3. 配置SSH跳过host key检查(内网安全)
cat > ~/.ssh/config << 'EOF'
Host 10.10.10.230
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
User git
Port 22
IdentityFile ~/.ssh/id_rsa
EOF
# 4. 安装Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 5. 安装Git、Node
brew install git node
# 6. 克隆所有仓库
git clone git@10.10.10.230:/srv/git/openclaw-dotfiles.git /tmp/dotfiles
git clone git@10.10.10.230:/srv/git/openclaw-memory.git ~/.openclaw/workspace
git clone git@10.10.10.230:/srv/git/openclaw-skills.git ~/.openclaw/workspace/skills
# 7. 恢复配置
cp /tmp/dotfiles/.zshrc ~/
cp /tmp/dotfiles/*.pub ~/.ssh/
cd /tmp/dotfiles && brew bundle install
# 8. 安装OpenClaw
npm install -g openclaw
echo "恢复完成!"
实际使用时只需两行命令:
git clone git://10.10.10.230/openclaw-recovery.git /tmp/recovery
bash /tmp/recovery/restore.sh
全程无需手动输入,约10分钟完成。
日常备份
日常开发中,变更立即推送:
# 一键备份所有
git clone git://10.10.10.230/openclaw-recovery.git /tmp/r 2>/dev/null
cd /tmp/r && ./backup-all.sh
# 或手动分别备份
cd ~/.openclaw/workspace && git add -A && git commit -m "backup" && git push
cd ~/.openclaw/workspace/skills && git add -A && git commit -m "backup" && git push
安全考量
这套方案基于内网环境,做了以下权衡:
- SSH私钥存储在Git仓库中:通过Git Daemon只读暴露,重装时能自动获取
- 跳过SSH host key检查:内网环境,简化配置
- node_modules不备份:体积大,恢复后重新安装
如果是公网环境,建议:
- 私钥改用密码管理器(如1Password)保管
- 使用HTTPS + Token方式认证
- 启用Git的签名验证
总结
这套方案实现了真正的"一键重装恢复":
- 10分钟:从裸机到完全可用
- 0干预:全自动执行,无需手动输入
- 版本化:所有配置都有Git历史记录
对于经常折腾系统的开发者来说,这是一套实用的备份策略。
仓库地址
# 匿名只读(恢复用)
git://10.10.10.230/openclaw-recovery.git
# SSH读写(日常使用)
git@10.10.10.230:/srv/git/openclaw-memory.git
git@10.10.10.230:/srv/git/openclaw-skills.git
git@10.10.10.230:/srv/git/openclaw-dotfiles.git
git@10.10.10.230:/srv/git/openclaw-recovery.git