主服务器配置 Git仓库多服务器自动同步
本文是为初学者设计的详细配置指南,帮助您实现主服务器Git仓库更新后自动同步到多个从服务器
🛠 准备工作
确保满足以下条件才能开始:
- 主服务器(中心仓库所在服务器)
- 多台从服务器(需要同步的其他服务器)
- 所有服务器使用root账户操作(简化权限)
- 所有服务器已安装Git:
yum install git -y或apt install git -y - 所有服务器网络互通(能互相ping通IP)
🔑 第一步:生成专用的SSH密钥对(在主服务器操作)
1.1 执行密钥生成命令
# 在终端输入以下命令
ssh-keygen -t rsa -f ~/.ssh/git-sync -N ""
- -t rsa:指定生成RSA类型密钥
- -f ~/.ssh/git-sync:密钥保存位置和名称
- -N "":密钥不设置密码(简化同步过程)
1.2 查看生成结果
ls -l ~/.ssh/git-sync*
应该显示两个文件:
git-sync:私钥文件(需保护好)git-sync.pub:公钥文件(将分发给其他服务器)
📤 第二步:分发公钥到从服务器(在主服务器操作)
2.1 准备服务器IP列表
在此例中使用:
- 服务器1: 192.168.1.101
- 服务器2: 192.168.1.102
- 服务器3: 192.168.1.103
2.2 执行分发命令(逐条执行)
# 分发到服务器1
ssh-copy-id -i ~/.ssh/git-sync.pub root@192.168.1.101
# 分发到服务器2
ssh-copy-id -i ~/.ssh/git-sync.pub root@192.168.1.102
# 分发到服务器3
ssh-copy-id -i ~/.ssh/git-sync.pub root@192.168.1.103
📌 重要提示
- 请确保三台服务器开启了 ssh 登录
- 首次连接时会询问"Are you sure you want to continue connecting (yes/no)?",输入 yes
- 要求输入目标服务器的root密码(不是主服务器密码)
- 成功后显示:"Number of key(s) added: 1"
🧪 第三步:验证免密登录(在主服务器测试)
3.1 测试连接到服务器1
ssh -i ~/.ssh/git-sync root@192.168.1.101
3.2 预期结果
- 成功登录到目标服务器(不提示输入密码)
- 看到终端提示符变为目标服务器的提示符(如:
root@server1:~#) - 退出测试会话:输入
exit
⚠️ 排查连接问题
如果失败:
- 检查IP是否正确:
ping 192.168.1.101 - 检查目标服务器ssh是否开启:
systemctl status sshd - 再次确认分发公钥时输入的密码正确
📦 第四步:创建主Git仓库(在主服务器操作)
注意:第四步内容不是主要的,是用参考的,告诉你你主服务器要有这个库。
这里只是简单说明,没有详细库的使用说明。
4.1 创建裸仓库
mkdir -p /git/test-repo.git
cd /git/test-repo.git
git init --bare
4.2 在各服务器创建相同仓库
在每台服务器上执行:
mkdir -p /git/test-repo.git
cd /git/test-repo.git
git init --bare
🤖 第五步:设置同步脚本(在主服务器操作)
5.1 创建同步脚本文件
nano /git/test-repo.git/hooks/sync-to-nodes.sh
5.2 粘贴以下内容并替换变量
#!/bin/bash
# 目标服务器列表(改为您的服务器IP)
SERVERS=("192.168.1.101" "192.168.1.102" "192.168.1.103")
# 专用密钥路径(不要更改)
SSH_KEY="/root/.ssh/git-sync"
# 仓库名称(改为您的实际名称)
REPO_NAME="test-repo"
# 设置Git专用SSH命令
export GIT_SSH_COMMAND="ssh -i $SSH_KEY -o IdentitiesOnly=yes"
echo "---- 🔄 开始仓库同步 ----"
date # 显示同步时间
# 循环同步到所有服务器
for server in "${SERVERS[@]}"; do
echo "🚀 正在同步到: $server"
# 强制推送到目标服务器
git push --force ssh://root@$server/git/$REPO_NAME.git master
# 检查同步结果
if [ $? -eq 0 ]; then
echo "✅ $server 同步成功!"
else
echo "❌ $server 同步失败!"
echo "!!! 请手动检查:ssh -i ~/.ssh/git-sync root@$server"
fi
done
echo "---- ✅ 同步操作完成 ----"
### 5.3 保存后设置权限
```bash
chmod +x /git/test-repo.git/hooks/sync-to-nodes.sh
⚡ 第六步:设置钩子文件(在主服务器操作)
6.1 创建post-receive钩子
nano /git/test-repo.git/hooks/post-receive
6.2 添加调用同步脚本的指令
#!/bin/bash
# 主仓库收到推送后执行的脚本
/git/test-repo.git/hooks/sync-to-nodes.sh
6.3 保存后设置权限
chmod +x /git/test-repo.git/hooks/post-receive
🧪 第七步:测试完整流程
7.1 本地开发电脑克隆仓库
git clone ssh://root@主服务器IP/git/test-repo.git
cd test-repo
7.2 添加测试文件并推送
echo "# Test Project" > README.md
git add .
git commit -m "首次提交"
git push origin master
7.3 在主服务器查看同步日志
# 实时监控日志
tail -f /git/test-repo.git/hooks/sync-to-nodes.log
7.4 在从服务器检查同步结果
ssh -i ~/.ssh/git-sync root@192.168.1.101
cat /git/test-repo.git/README.md
🛠 疑难解答
❌ 所有同步都失败
- 检查脚本权限:
ls -l /git/test-repo.git/hooks/- 确保 sync-to-nodes.sh 和 post-receive 有可执行权限
- 检查脚本路径是否一致
❓ 部分服务器同步失败
- 单独测试连接:
ssh -i ~/.ssh/git-sync root@故障服务器IP - 检查目标服务器存储空间:
df -h - 检查仓库路径:目标服务器是否存在
/git/test-repo.git
⚠ 同步延迟较大
- 考虑减少服务器数量(测试时先用2台)
- 检查网络带宽:
ping -c 10 目标服务器IP - 增加超时设置:在SSH命令后添加
-o ConnectTimeout=20
提示:首次配置建议使用
test-repo作为测试仓库名称,正式使用更换为实际名称