146 lines
6.1 KiB
YAML
146 lines
6.1 KiB
YAML
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"
|