Files
asd-backend/docs/OPS-ALERT.md
2026-08-21 09:02:59 +08:00

3.6 KiB
Raw Blame History

服务器邮件告警与每日报告 — 部署指南

概述

两封自动邮件,均通过 msmtp → 163 SMTP 发送(复用现有 ~/.msmtprc 配置):

脚本 频率cron 作用
daily-report.sh 每日 08:00 服务器健康报告HTML系统/容器/SSL/服务/安全/备份 + 支付与会员统计
alert.sh 每 5 分钟 实时异常告警:正常时静默,异常才发邮件(带防刷屏状态机)

部署步骤

# 1. 上传三个文件到服务器root 用户)
scp scripts/mail-lib.sh scripts/daily-report.sh scripts/alert.sh root@<服务器>:/root/rust/scripts/
ssh root@<服务器> 'chmod +x /root/rust/scripts/*.sh && mkdir -p /root/rust/scripts/logs'

# 2. 配置 cronroot
ssh root@<服务器> 'crontab -e'
# 加入以下两行:
0 8 * * * /root/rust/scripts/daily-report.sh >> /root/rust/scripts/logs/daily-report.log 2>&1
*/5 * * * * /root/rust/scripts/alert.sh >> /root/rust/scripts/logs/alert.log 2>&1

验证

# 干跑告警(预览当前异常与将发送的邮件,不真正发送)
/root/rust/scripts/alert.sh --dry-run

# 手动发一封健康报告测试 msmtp 链路
/root/rust/scripts/daily-report.sh

# 查看邮件日志
tail -50 /root/rust/scripts/logs/mail.log

alert.sh 检测项与阈值

检测项 警告 严重
磁盘使用(/ > 80% > 90%
内存使用 > 80% > 90%
备份时效 > 24h > 48h或无备份
服务状态green/blue/nginx 非 active
Docker 容器 存在非 Up 容器 / docker 不可用
SSL 证书剩余 < 30 天 < 7 天
支付卡单pending > 30 分钟) ≥ 1 笔(附订单号)
数据库SELECT 1 不可用

防刷屏机制

状态文件 .alert-state(默认 /root/rust/scripts/.alert-state)记录每个检测项最近告警级别:

  • 级别上升 → 立即发邮件
  • 级别不变 → 冷却 ALERT_COOLDOWN_HOURS(默认 6 小时)后才再次提醒
  • 恢复正常 → 静默清除状态,不发邮件

可配置项(环境变量)

变量 默认值 说明
MAIL_TO m943790568@163.com 收件人,逗号分隔多地址
MAIL_FROM ASD 监控 <m943790568@163.com> 发件人显示名
MAIL_ACCOUNT default msmtp 账户名
MAIL_LOG_DIR /root/rust/scripts/logs 日志目录mail.log / alert.log
MAIL_RETRY 3 发送失败重试次数
DB_CONTAINER 1Panel-postgresql-FtMo PostgreSQL 容器名1Panel 安装)
BACKUP_DIR /root/rust/backups/milkydata 备份目录
STUCK_ORDER_MINUTES 30 pending 订单视为卡单的时长
ALERT_STATE_FILE /root/rust/scripts/.alert-state 状态文件路径
ALERT_COOLDOWN_HOURS 6 同级别再次提醒的冷却时间

注意事项

  • 脚本在服务器本机运行cron 以 root 执行),数据库通过 docker exec <容器> psql 访问, 容器名与 check-members.sh / send-notification.sh 保持一致;如容器名不同,设置 DB_CONTAINER 覆盖。
  • 邮件为 HTML + UTF-8无需额外编码配置msmtp 发送失败自动重试 3 次并记录日志。
  • 单次采集失败(如 journalctl 无权限)不会阻断整封邮件,对应项显示 N/A。
  • alert.sh 的卡单检测可直接发现「支付卡在确认页面」类问题pending 超 30 分钟即告警, 邮件中附订单号与创建时间,便于对照支付宝账单处理)。