3.6 KiB
3.6 KiB
服务器邮件告警与每日报告 — 部署指南
概述
两封自动邮件,均通过 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. 配置 cron(root)
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 分钟即告警, 邮件中附订单号与创建时间,便于对照支付宝账单处理)。