# 服务器邮件告警与每日报告 — 部署指南 ## 概述 两封自动邮件,均通过 `msmtp` → 163 SMTP 发送(复用现有 `~/.msmtprc` 配置): | 脚本 | 频率(cron) | 作用 | | --- | --- | --- | | `daily-report.sh` | 每日 08:00 | 服务器健康报告(HTML):系统/容器/SSL/服务/安全/备份 + **支付与会员统计** | | `alert.sh` | 每 5 分钟 | **实时异常告警**:正常时静默,异常才发邮件(带防刷屏状态机) | ## 部署步骤 ```bash # 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 ``` ## 验证 ```bash # 干跑告警(预览当前异常与将发送的邮件,不真正发送) /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 监控 ` | 发件人显示名 | | `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 分钟即告警, 邮件中附订单号与创建时间,便于对照支付宝账单处理)。