From a40a16d167cab0570c9151c935db0e672310cb4c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Mar 2026 11:26:43 +0000
Subject: [PATCH 1/3] Initial plan
From 47e401db31e532f1d6ae52024617c33c68c3d6e9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Mar 2026 11:34:02 +0000
Subject: [PATCH 2/3] =?UTF-8?q?feat(backend):=20=E5=90=8E=E7=AB=AF?=
=?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=85=8D=E7=BD=AE=20=E2=80=94=20WebSocket?=
=?UTF-8?q?=E7=94=9F=E4=BA=A7=E5=9C=B0=E5=9D=80=20+=20Nginx=E5=8F=8D?=
=?UTF-8?q?=E5=90=91=E4=BB=A3=E7=90=86=20+=20pm2=E5=BC=80=E6=9C=BA?=
=?UTF-8?q?=E8=87=AA=E5=90=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
YM-BACKEND-20260307-001:
- status-board/index.html: 修复重复脚本引用和重复闭合标签,
WebSocket地址自动检测(生产环境wss://host/ws,本地ws://localhost:8080)
- deploy-to-server.yml: 新增WebSocket服务(mock-ws-server.js)pm2部署,
添加pm2 startup开机自启,新增Nginx API(/api/→3000)和WebSocket(/ws→8080)
反向代理自动配置(snippets方式注入server块)
Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com>
---
.github/workflows/deploy-to-server.yml | 78 ++++++++++++++++++++++++--
status-board/index.html | 34 +++++------
2 files changed, 87 insertions(+), 25 deletions(-)
diff --git a/.github/workflows/deploy-to-server.yml b/.github/workflows/deploy-to-server.yml
index 264092bd..500ffe3f 100644
--- a/.github/workflows/deploy-to-server.yml
+++ b/.github/workflows/deploy-to-server.yml
@@ -209,22 +209,32 @@ jobs:
exit 0
fi
- # 部署 backend 服务
+ # 部署 backend 服务(Express API,端口 3000)
if [ -f '${{ secrets.DEPLOY_PATH }}/backend/server.js' ]; then
echo '📦 安装 backend 依赖...'
cd '${{ secrets.DEPLOY_PATH }}/backend'
- npm install --production || echo '⚠️ backend npm install 失败'
+ npm install --production 2>/dev/null || echo '⚠️ backend npm install 失败'
echo '🔄 重启 backend 服务...'
pm2 restart guanghulab-backend 2>/dev/null || \
pm2 start server.js --name guanghulab-backend 2>/dev/null || \
echo '⚠️ backend pm2 启动失败'
fi
+ # 部署 status-board WebSocket 服务(端口 8080)
+ if [ -f '${{ secrets.DEPLOY_PATH }}/status-board/mock-ws-server.js' ]; then
+ echo '🔄 重启 WebSocket 服务...'
+ cd '${{ secrets.DEPLOY_PATH }}/status-board'
+ npm install --production 2>/dev/null || true
+ pm2 restart guanghulab-ws 2>/dev/null || \
+ pm2 start mock-ws-server.js --name guanghulab-ws 2>/dev/null || \
+ echo '⚠️ WebSocket pm2 启动失败'
+ fi
+
# 部署 src HLI 中间层
if [ -f '${{ secrets.DEPLOY_PATH }}/src/index.js' ]; then
echo '📦 安装 src 依赖...'
cd '${{ secrets.DEPLOY_PATH }}'
- npm install --production || echo '⚠️ src npm install 失败'
+ npm install --production 2>/dev/null || echo '⚠️ src npm install 失败'
echo '🔄 重启 HLI 服务...'
pm2 restart guanghulab 2>/dev/null || \
pm2 start src/index.js --name guanghulab 2>/dev/null || \
@@ -232,6 +242,10 @@ jobs:
fi
pm2 save || echo '⚠️ pm2 save 失败,重启后进程可能不会自动启动'
+
+ # 设置开机自启(仅首次需要,后续无操作)
+ pm2 startup 2>/dev/null | grep -o 'sudo.*' | bash 2>/dev/null || true
+
echo '✅ 后端服务部署完成'
"
@@ -247,8 +261,9 @@ jobs:
exit 0
fi
+ NGINX_CHANGED=false
+
# 一次性迁移:更新 root 路径(从旧的 status-board 子目录改为站点根目录)
- # 迁移完成后此检查自动无操作
if grep -q 'root.*guanghulab/status-board' /etc/nginx/sites-available/default 2>/dev/null || \
grep -q 'root.*guanghulab/status-board' /etc/nginx/conf.d/*.conf 2>/dev/null; then
echo '🔄 更新 Nginx root 路径...'
@@ -256,11 +271,62 @@ jobs:
/etc/nginx/sites-available/default 2>/dev/null || true
sudo sed -i 's|root.*guanghulab/status-board[^;]*|root ${{ secrets.DEPLOY_PATH }}|g' \
/etc/nginx/conf.d/*.conf 2>/dev/null || true
- sudo nginx -t && sudo systemctl reload nginx
- echo '✅ Nginx 配置已更新'
+ NGINX_CHANGED=true
+ echo '✅ Nginx root 路径已更新'
else
echo '✅ Nginx root 路径正确,无需修改'
fi
+
+ # 配置 API + WebSocket 反向代理
+ if ! grep -rq 'location /api/' /etc/nginx/sites-available/ /etc/nginx/conf.d/ /etc/nginx/snippets/ 2>/dev/null; then
+ echo '🔄 添加 API + WebSocket 反向代理...'
+ sudo mkdir -p /etc/nginx/snippets
+ printf '%s\n' \
+ '# guanghulab 反向代理(由 CD 工作流自动生成)' \
+ '' \
+ '# API 反向代理 → Express 后端端口 3000' \
+ 'location /api/ {' \
+ ' proxy_pass http://127.0.0.1:3000/api/;' \
+ ' proxy_http_version 1.1;' \
+ ' 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;' \
+ ' proxy_cache_bypass \$http_upgrade;' \
+ '}' \
+ '' \
+ '# WebSocket 反向代理 → 看板实时推送端口 8080' \
+ 'location /ws {' \
+ ' proxy_pass http://127.0.0.1:8080;' \
+ ' proxy_http_version 1.1;' \
+ ' proxy_set_header Upgrade \$http_upgrade;' \
+ ' proxy_set_header Connection \"Upgrade\";' \
+ ' 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_read_timeout 86400;' \
+ '}' \
+ | sudo tee /etc/nginx/snippets/guanghulab-proxy.conf > /dev/null
+
+ # 在 server 块中加入 include 指令
+ NGINX_MAIN=\$(grep -rl 'server_name' /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ 2>/dev/null | head -1)
+ if [ -z \"\$NGINX_MAIN\" ]; then
+ NGINX_MAIN='/etc/nginx/sites-available/default'
+ fi
+ if [ -f \"\$NGINX_MAIN\" ] && ! grep -q 'guanghulab-proxy' \"\$NGINX_MAIN\" 2>/dev/null; then
+ sudo sed -i '/server_name/a\\ include /etc/nginx/snippets/guanghulab-proxy.conf;' \"\$NGINX_MAIN\" 2>/dev/null && \
+ NGINX_CHANGED=true && echo '✅ 反向代理已自动配置' || \
+ echo '⚠️ 自动配置失败,请手动在 Nginx server 块中加入: include /etc/nginx/snippets/guanghulab-proxy.conf;'
+ fi
+ else
+ echo '✅ API 反向代理已存在,无需修改'
+ fi
+
+ # 如果有变更,验证并重新加载 Nginx
+ if [ \"\$NGINX_CHANGED\" = true ]; then
+ sudo nginx -t && sudo systemctl reload nginx && echo '✅ Nginx 配置已重新加载' || \
+ echo '⚠️ Nginx 配置验证失败,请手动检查'
+ fi
"
- name: 🔍 验证部署
diff --git a/status-board/index.html b/status-board/index.html
index 1aa8113a..34f2201b 100644
--- a/status-board/index.html
+++ b/status-board/index.html
@@ -177,13 +177,7 @@
-
-
-
-
-
-
-
+
@@ -191,23 +185,27 @@
-
+