guanghulab/.github/workflows/emergency-stop-email.yml
2026-05-10 13:12:44 +08:00

146 lines
6.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: 🛑 紧急停邮件 (Ops-Agent Email Kill Switch)
# ⚠️ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 2026-05-03 D72冰朔反映 ops-agent 一直发"大脑服务器异常"邮件刷屏。
# 本 workflow 提供一键停止 / 恢复邮件告警的能力。
#
# 仓库侧的 OPS_EMAIL_ENABLED 默认值已翻转为 false见 ops-agent/notifier.js
# 但服务器上跑的 ops-agent 进程可能已经从环境变量或 pm2 set 拿到了 true
# 这个 workflow 是用来在不重新部署的情况下立即让服务器停发邮件。
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
on:
workflow_dispatch:
inputs:
action:
description: '动作'
required: true
default: 'disable'
type: choice
options:
- disable # 关掉邮件pm2 set OPS_EMAIL_ENABLED=false + restart
- enable # 重新启用邮件
- stop-ops-agent # 直接停掉整个 ops-agent 进程(最彻底)
- status # 仅查询当前状态,不修改
target:
description: '目标服务器'
required: true
default: 'face'
type: choice
options:
- face # ZY-SVR-002 面孔服务器ops-agent 主部署位)
- brain # ZY-SVR-005 大脑服务器(如果那里也跑了 ops-agent
permissions:
contents: read
concurrency:
group: emergency-stop-email
cancel-in-progress: false
jobs:
kill-switch:
name: '🛑 ${{ github.event.inputs.action }} on ${{ github.event.inputs.target }}'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: 🔑 准备 SSH (面孔)
if: github.event.inputs.target == 'face'
run: |
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "${{ secrets.SERVER_KEY }}" > ~/.ssh/svr_key
chmod 600 ~/.ssh/svr_key
ssh-keyscan -H "${{ secrets.SERVER_HOST }}" >> ~/.ssh/known_hosts 2>/dev/null
echo "TARGET_USER=${{ secrets.SERVER_USER }}" >> "$GITHUB_ENV"
echo "TARGET_HOST=${{ secrets.SERVER_HOST }}" >> "$GITHUB_ENV"
- name: 🔑 准备 SSH (大脑)
if: github.event.inputs.target == 'brain'
run: |
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "${{ secrets.ZY_BRAIN_KEY }}" > ~/.ssh/svr_key
chmod 600 ~/.ssh/svr_key
ssh-keyscan -H "${{ secrets.ZY_BRAIN_HOST }}" >> ~/.ssh/known_hosts 2>/dev/null
echo "TARGET_USER=${{ secrets.ZY_BRAIN_USER }}" >> "$GITHUB_ENV"
echo "TARGET_HOST=${{ secrets.ZY_BRAIN_HOST }}" >> "$GITHUB_ENV"
- name: 🛑 关闭邮件
if: github.event.inputs.action == 'disable'
run: |
ssh -i ~/.ssh/svr_key -o StrictHostKeyChecking=no -o ConnectTimeout=15 \
"${TARGET_USER}@${TARGET_HOST}" \
'set -e
echo "=== Before ==="
pm2 env ops-agent 2>/dev/null | grep -i OPS_EMAIL || echo "(no current OPS_EMAIL var)"
echo "=== Setting OPS_EMAIL_ENABLED=false ==="
pm2 set ops-agent:OPS_EMAIL_ENABLED false || true
pm2 restart ops-agent --update-env || pm2 restart ops-agent || true
echo "=== After ==="
pm2 env ops-agent 2>/dev/null | grep -i OPS_EMAIL || echo "(env empty / agent not running)"
pm2 status ops-agent || echo "(ops-agent not in pm2 list)"' \
2>&1 | tee /tmp/kill-output.log
{
echo "## 🛑 邮件告警已关闭"
echo ""
echo "目标:\`${{ github.event.inputs.target }}\` (\`$TARGET_HOST\`)"
echo ""
echo "\`\`\`"
tail -c 4000 /tmp/kill-output.log
echo "\`\`\`"
} >> "$GITHUB_STEP_SUMMARY"
- name: ▶️ 重新启用邮件
if: github.event.inputs.action == 'enable'
run: |
ssh -i ~/.ssh/svr_key -o StrictHostKeyChecking=no -o ConnectTimeout=15 \
"${TARGET_USER}@${TARGET_HOST}" \
'pm2 set ops-agent:OPS_EMAIL_ENABLED true || true
pm2 restart ops-agent --update-env || pm2 restart ops-agent || true
pm2 env ops-agent 2>/dev/null | grep -i OPS_EMAIL || echo "(env empty)"
pm2 status ops-agent' \
2>&1 | tee /tmp/kill-output.log
{
echo "## ▶️ 邮件告警已重新启用"
echo ""
echo "\`\`\`"
tail -c 4000 /tmp/kill-output.log
echo "\`\`\`"
} >> "$GITHUB_STEP_SUMMARY"
- name: 💀 直接停掉 ops-agent
if: github.event.inputs.action == 'stop-ops-agent'
run: |
ssh -i ~/.ssh/svr_key -o StrictHostKeyChecking=no -o ConnectTimeout=15 \
"${TARGET_USER}@${TARGET_HOST}" \
'pm2 stop ops-agent || true
pm2 status ops-agent || echo "(stopped)"' \
2>&1 | tee /tmp/kill-output.log
{
echo "## 💀 ops-agent 进程已停止"
echo ""
echo "\`\`\`"
tail -c 4000 /tmp/kill-output.log
echo "\`\`\`"
echo ""
echo "如需恢复:\`pm2 start ops-agent\` (在服务器上)"
} >> "$GITHUB_STEP_SUMMARY"
- name: 📋 查询状态
if: github.event.inputs.action == 'status'
run: |
ssh -i ~/.ssh/svr_key -o StrictHostKeyChecking=no -o ConnectTimeout=15 \
"${TARGET_USER}@${TARGET_HOST}" \
'pm2 env ops-agent 2>/dev/null | grep -i -E "OPS_EMAIL|SMTP" || echo "(no relevant env vars)"
echo "---"
pm2 status ops-agent || echo "(ops-agent not in pm2)"' \
2>&1 | tee /tmp/status-output.log
{
echo "## 📋 当前状态"
echo ""
echo "\`\`\`"
cat /tmp/status-output.log
echo "\`\`\`"
} >> "$GITHUB_STEP_SUMMARY"