From c1a5174fd1ef0513d2f9d40c512e9f9306874da4 Mon Sep 17 00:00:00 2001 From: aiyimickey <39365912+aiyimickey@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:09:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=90=88=E5=B9=B6=20deploy-monitor?= =?UTF-8?q?.sh=20=E5=88=B0=20deploy-ai.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除独立的 deploy-monitor.sh 脚本 - 构建新鲜度检查功能合并到 deploy-ai.sh - 使用动态检测替代硬编码站点列表(自动检测 .next/standalone/server.js) - 更新 README.md 移除 deploy-monitor.sh 相关内容 --- README.md | 1 - deploy-ai.sh | 11 ++++++ deploy-monitor.sh | 98 ----------------------------------------------- 3 files changed, 11 insertions(+), 99 deletions(-) delete mode 100644 deploy-monitor.sh diff --git a/README.md b/README.md index e47d628..5e6f537 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ | `sites-manage-cloud.sh` | 云服务器站点启停(SSH / 服务器本地运行) | 云端 | | `deploy-ai.sh` | 部署站点到 tlyq.ai(txjp 服务器) | 云端 | | `deploy-cc.sh` | 部署站点到 tlyq.cc(tgz 服务器) | 云端 | -| `deploy-monitor.sh` | 独立部署 monitor-ai 告警监控 | 云端 | | `edit-site-cc.sh` | www.tlyq.cc 官网内容管理 | 云端 | | `check-compliance.sh` | D1-D8 合规检查(LESSONS-LEARNED 自动化) | 本地 | | `docker-cache-cleanup.sh` | Docker 缓存清理(构建缓存、悬空镜像、测试镜像) | 本地/云端 | diff --git a/deploy-ai.sh b/deploy-ai.sh index 8de4042..acd91f5 100755 --- a/deploy-ai.sh +++ b/deploy-ai.sh @@ -639,6 +639,17 @@ EOF return 1 fi + # 构建新鲜度检查(自动检测 Node.js standalone 部署) + if ssh txjp "test -f $REMOTE_DIR/.next/standalone/server.js" 2>/dev/null; then + BUILD_MTIME=$(ssh txjp "stat -c %Y $REMOTE_DIR/.next/standalone/server.js" 2>/dev/null || echo 0) + SRC_MTIME=$(ssh txjp "find $REMOTE_DIR/src -type f \( -name '*.ts' -o -name '*.tsx' \) -exec stat -c %Y {} + 2>/dev/null | sort -rn | head -1" 2>/dev/null || echo 0) + if [ "$BUILD_MTIME" -lt "$SRC_MTIME" ] 2>/dev/null; then + warn "构建产物旧于源码!请确保 npm run build 已重新执行" + else + info "构建新鲜度检查通过" + fi + fi + # 静态导出站点(www):next build 产出 out/,移至 html/ 供 nginx 托管 if [[ "$SITE" == "www" ]]; then ssh txjp "cd ${REMOTE_DIR} && rm -rf html && mv out html 2>/dev/null" || { diff --git a/deploy-monitor.sh b/deploy-monitor.sh deleted file mode 100644 index b495d90..0000000 --- a/deploy-monitor.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash -# deploy-monitor.sh — 部署 monitor-ai 到云服务器 -# 用法: bash deploy-monitor.sh [--remote --host ] [--dev] -set -e - -MODE="${1:-local}" -REMOTE_HOST="" -PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" -MONITOR_DIR="$PROJECT_DIR/monitor-ai" -SHARED_DIR="$PROJECT_DIR/shared" -TIMESTAMP=$(date +%Y%m%d_%H%M%S) - -# 解析参数 -while [[ $# -gt 0 ]]; do - case $1 in - --remote) MODE="remote"; shift ;; - --host) REMOTE_HOST="$2"; shift 2 ;; - --dev) MODE="dev"; shift ;; - *) shift ;; - esac -done - -echo "=== deploy-monitor.sh === Mode: $MODE ===" - -# 打包源码 -echo "[1/5] 打包源码..." -TARBALL="/tmp/monitor-ai-${TIMESTAMP}.tar.gz" -cd "$PROJECT_DIR" -tar czf "$TARBALL" --exclude='node_modules' --exclude='.next' --exclude='data/*.db' \ - shared/lib/ monitor-ai/ - -echo "[2/5] 上传..." -if [ "$MODE" = "remote" ]; then - if [ -z "$REMOTE_HOST" ]; then - echo "Error: --remote 模式需要 --host " - exit 1 - fi - ssh "$REMOTE_HOST" "mkdir -p /root/docker" - scp "$TARBALL" "$REMOTE_HOST:/root/docker/" - ssh "$REMOTE_HOST" "cd /root/docker && tar xzf monitor-ai-${TIMESTAMP}.tar.gz && rm monitor-ai-${TIMESTAMP}.tar.gz" -else - # local 模式: 部署到当前服务器的 /root/docker/ - sudo mkdir -p /root/docker - sudo cp "$TARBALL" /root/docker/ - cd /root/docker - sudo tar xzf "monitor-ai-${TIMESTAMP}.tar.gz" - sudo rm "monitor-ai-${TIMESTAMP}.tar.gz" -fi - -echo "[3/5] 构建..." -if [ "$MODE" = "remote" ]; then - ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && npm install && npm run build" -else - cd /root/docker/monitor-ai - sudo npm install - sudo npm run build -fi - -# 构建新鲜度检查 -BUILD_MTIME=$(ssh "$REMOTE_HOST" "stat -c %Y /root/docker/monitor-ai/.next/standalone/server.js" 2>/dev/null || echo 0) -SRC_MTIME=$(ssh "$REMOTE_HOST" "find /root/docker/monitor-ai/src -type f \( -name '*.ts' -o -name '*.tsx' \) -exec stat -c %Y {} + 2>/dev/null | sort -rn | head -1" 2>/dev/null || echo 0) -if [ "$BUILD_MTIME" -lt "$SRC_MTIME" ] 2>/dev/null; then - echo "⚠️ 构建产物旧于源码!请确保 npm run build 已重新执行" -else - echo "✅ 构建新鲜度检查通过" -fi - -echo "[4/5] 配置首次部署..." -if [ "$MODE" = "remote" ]; then - # 生成密钥 - OIDC_SECRET=$(openssl rand -hex 32) - LOCALADMIN_PWD=$(openssl rand -hex 16) - ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && \ - echo 'NODE_ENV=production' > .env && \ - echo 'DATABASE_PATH=/data/monitor.db' >> .env && \ - echo 'MONITOR_MODE=local' >> .env && \ - echo 'AUTHELIA_URL=https://sso.tlyq.ai' >> .env && \ - echo 'OIDC_CLIENT_ID=monitor-oidc' >> .env && \ - echo 'OIDC_CLIENT_SECRET=${OIDC_SECRET}' >> .env && \ - echo 'OIDC_REDIRECT_URI=https://monitor.tlyq.ai/api/auth/callback' >> .env && \ - echo 'JWT_SECRET=<与全站一致>' >> .env && \ - echo 'COOKIE_DOMAIN=.tlyq.ai' >> .env && \ - echo 'LDAP_URL=ldap://ldap-ai:3890' >> .env && \ - echo 'LOCALADMIN_PASSWORD=${LOCALADMIN_PWD}' >> .env && \ - echo 'NODE_TLS_REJECT_UNAUTHORIZED=0' >> .env" -fi - -echo "[5/5] 启动容器..." -if [ "$MODE" = "remote" ]; then - ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && docker compose up -d --build" -else - cd /root/docker/monitor-ai - sudo docker compose up -d --build -fi - -echo "=== 部署完成 ===" -echo "monitor-ai: https://monitor.tlyq.ai" -echo "健康检查: curl https://monitor.tlyq.ai/api/health"