自建Git服务器实现一键重装恢复

自建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

安全考量

这套方案基于内网环境,做了以下权衡:

  1. SSH私钥存储在Git仓库中:通过Git Daemon只读暴露,重装时能自动获取
  2. 跳过SSH host key检查:内网环境,简化配置
  3. 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

Built with Hugo
Theme Stack designed by Jimmy