Skip to main content

主服务器配置 Git仓库多服务器自动同步

本文是为初学者设计的详细配置指南,帮助您实现主服务器Git仓库更新后自动同步到多个从服务器


🛠 准备工作

确保满足以下条件才能开始:

  1. 主服务器(中心仓库所在服务器)
  2. 多台从服务器(需要同步的其他服务器)
  3. 所有服务器使用root账户操作(简化权限)
  4. 所有服务器已安装Git:yum install git -yapt install git -y
  5. 所有服务器网络互通(能互相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

📌 重要提示

  1. 请确保三台服务器开启了 ssh 登录
  2. 首次连接时会询问"Are you sure you want to continue connecting (yes/no)?",输入 yes
  3. 要求输入目标服务器的root密码(不是主服务器密码)
  4. 成功后显示:"Number of key(s) added: 1"

🧪 第三步:验证免密登录(在主服务器测试)

3.1 测试连接到服务器1

ssh -i ~/.ssh/git-sync root@192.168.1.101

3.2 预期结果

  1. 成功登录到目标服务器(不提示输入密码)
  2. 看到终端提示符变为目标服务器的提示符(如:root@server1:~#
  3. 退出测试会话:输入 exit

⚠️ 排查连接问题

如果失败:

  1. 检查IP是否正确:ping 192.168.1.101
  2. 检查目标服务器ssh是否开启:systemctl status sshd
  3. 再次确认分发公钥时输入的密码正确

📦 第四步:创建主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

🛠 疑难解答

❌ 所有同步都失败

  1. 检查脚本权限:ls -l /git/test-repo.git/hooks/
    • 确保 sync-to-nodes.sh 和 post-receive 有可执行权限
  2. 检查脚本路径是否一致

❓ 部分服务器同步失败

  1. 单独测试连接:ssh -i ~/.ssh/git-sync root@故障服务器IP
  2. 检查目标服务器存储空间:df -h
  3. 检查仓库路径:目标服务器是否存在/git/test-repo.git

⚠ 同步延迟较大

  1. 考虑减少服务器数量(测试时先用2台)
  2. 检查网络带宽:ping -c 10 目标服务器IP
  3. 增加超时设置:在SSH命令后添加 -o ConnectTimeout=20

提示:首次配置建议使用test-repo作为测试仓库名称,正式使用更换为实际名称