162 lines
5.4 KiB
Bash
162 lines
5.4 KiB
Bash
#!/bin/bash
|
||
# ════════════════════════════════════════════════════════════════
|
||
# 光湖 · Git Sync 服务一键部署脚本
|
||
# 在新服务器 ZY-CVM-MAIN 上执行
|
||
# ════════════════════════════════════════════════════════════════
|
||
#
|
||
# 功能:
|
||
# 1. 部署 Git Sync 服务到 /data/guanghulab/server/git-sync/
|
||
# 2. 用 PM2 启动并设置开机自启
|
||
# 3. 配置 Nginx 反向代理
|
||
# 4. 在 Gitea 配置 Webhook
|
||
#
|
||
# 前提:Forgejo 已运行,PM2 已安装,Nginx 已配置
|
||
# ════════════════════════════════════════════════════════════════
|
||
|
||
set -e
|
||
|
||
REPO_DIR="/data/guanghulab/repo"
|
||
SYNC_DIR="$REPO_DIR/server/git-sync"
|
||
TOKEN="e0fed57503db0d26046b7e30c51c80458da364b4"
|
||
GITEA_URL="http://127.0.0.1:3001"
|
||
|
||
echo "═══════════════════════════════════════"
|
||
echo "光湖 · Git Sync 部署"
|
||
echo "═══════════════════════════════════════"
|
||
|
||
# ─── 1. 同步代码到服务器 ───
|
||
echo ""
|
||
echo "▸ 步骤 1/5: 同步最新代码..."
|
||
cd "$REPO_DIR"
|
||
git fetch origin
|
||
git reset --hard origin/main
|
||
echo "✅ 代码已同步: $(git log --oneline -1)"
|
||
|
||
# ─── 2. 确保依赖已安装 ───
|
||
echo ""
|
||
echo "▸ 步骤 2/5: 安装依赖..."
|
||
if [ ! -d "$SYNC_DIR/node_modules" ]; then
|
||
cd "$SYNC_DIR"
|
||
npm install --production 2>/dev/null || true
|
||
echo "✅ 依赖已安装"
|
||
else
|
||
echo "✅ 依赖已存在,跳过"
|
||
fi
|
||
|
||
# ─── 3. 用 PM2 启动 Git Sync ───
|
||
echo ""
|
||
echo "▸ 步骤 3/5: 启动 Git Sync 服务..."
|
||
|
||
# 停止旧的(如果有)
|
||
pm2 delete guanghulab-git-sync 2>/dev/null || true
|
||
|
||
# 启动
|
||
cd "$SYNC_DIR"
|
||
ZY_REPO_TOKEN="$TOKEN" \
|
||
pm2 start server.js \
|
||
--name guanghulab-git-sync \
|
||
--env production
|
||
|
||
pm2 save
|
||
echo "✅ Git Sync 已启动 (端口 8082)"
|
||
|
||
# ─── 4. 配置 Nginx ───
|
||
echo ""
|
||
echo "▸ 步骤 4/5: 配置 Nginx 反向代理..."
|
||
|
||
NGINX_CONF="/etc/nginx/sites-enabled/guanghulab"
|
||
|
||
if grep -q "/sync/" "$NGINX_CONF" 2>/dev/null; then
|
||
echo "✅ Nginx 已有 /sync/ 路由,跳过"
|
||
else
|
||
# 在 /wake/ location 后面添加 /sync/ location
|
||
sed -i '/location \/wake\//,/}/a\
|
||
\
|
||
# ─── Git Sync 同步服务 (/sync/) ───\
|
||
location /sync/ {\
|
||
proxy_pass http://127.0.0.1:8082/;\
|
||
proxy_set_header Host $host;\
|
||
proxy_set_header X-Real-IP $remote_addr;\
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\
|
||
proxy_set_header X-Forwarded-Proto $scheme;\
|
||
}' "$NGINX_CONF"
|
||
|
||
nginx -t && systemctl reload nginx
|
||
echo "✅ Nginx 已添加 /sync/ 路由"
|
||
fi
|
||
|
||
# ─── 5. 配置 Gitea Webhook ───
|
||
echo ""
|
||
echo "▸ 步骤 5/5: 配置 Gitea Webhook..."
|
||
|
||
# 生成 Webhook Secret
|
||
WEBHOOK_SECRET=$(openssl rand -hex 16)
|
||
echo " Webhook Secret: $WEBHOOK_SECRET"
|
||
|
||
# 检查是否已存在 Webhook
|
||
EXISTING=$(curl -s -H "Authorization: token $TOKEN" \
|
||
"$GITEA_URL/api/v1/repos/bingshuo/guanghulab/hooks" | \
|
||
python3 -c "
|
||
import sys, json
|
||
hooks = json.load(sys.stdin)
|
||
for h in hooks:
|
||
if h.get('config', {}).get('url', '').endswith('/sync/webhook'):
|
||
print(h['id'])
|
||
break
|
||
" 2>/dev/null || echo "")
|
||
|
||
if [ -n "$EXISTING" ]; then
|
||
# 更新现有 Webhook
|
||
curl -s -X PATCH -H "Authorization: token $TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
"$GITEA_URL/api/v1/repos/bingshuo/guanghulab/hooks/$EXISTING" \
|
||
-d "{
|
||
\"config\": {
|
||
\"url\": \"http://127.0.0.1:8082/webhook\",
|
||
\"content_type\": \"json\",
|
||
\"secret\": \"$WEBHOOK_SECRET\"
|
||
},
|
||
\"events\": [\"push\"],
|
||
\"active\": true
|
||
}" > /dev/null
|
||
echo "✅ Webhook 已更新 (ID: $EXISTING)"
|
||
else
|
||
# 创建新 Webhook
|
||
curl -s -X POST -H "Authorization: token $TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
"$GITEA_URL/api/v1/repos/bingshuo/guanghulab/hooks" \
|
||
-d "{
|
||
\"type\": \"gitea\",
|
||
\"config\": {
|
||
\"url\": \"http://127.0.0.1:8082/webhook\",
|
||
\"content_type\": \"json\",
|
||
\"secret\": \"$WEBHOOK_SECRET\"
|
||
},
|
||
\"events\": [\"push\"],
|
||
\"active\": true
|
||
}" > /dev/null
|
||
echo "✅ Webhook 已创建"
|
||
fi
|
||
|
||
# 将 Secret 写入 Git Sync 环境变量
|
||
pm2 set guanghulab-git-sync:GIT_SYNC_SECRET "$WEBHOOK_SECRET" 2>/dev/null || true
|
||
|
||
# 重启 Git Sync 让环境变量生效
|
||
pm2 restart guanghulab-git-sync --update-env \
|
||
--env ZY_REPO_TOKEN="$TOKEN" \
|
||
--env GIT_SYNC_SECRET="REDACTED_PASSWORD"
|
||
|
||
echo ""
|
||
echo "═══════════════════════════════════════"
|
||
echo "✅ Git Sync 部署完成!"
|
||
echo ""
|
||
echo "工作方式:"
|
||
echo " · 你在 Gitea 合并 PR → 自动触发 Webhook"
|
||
echo " · Git Sync 收到通知 → 自动 git pull 到服务器"
|
||
echo " · 代码立即可用,无需手动操作"
|
||
echo ""
|
||
echo "测试命令:"
|
||
echo " curl http://127.0.0.1:8082/health"
|
||
echo " curl http://127.0.0.1:8082/status"
|
||
echo "═══════════════════════════════════════"
|