85 lines
3.6 KiB
Markdown
85 lines
3.6 KiB
Markdown
# 服务器邮件告警与每日报告 — 部署指南
|
||
|
||
<!-- 更新时间:2026-08-21 -->
|
||
|
||
## 概述
|
||
|
||
两封自动邮件,均通过 `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 监控 <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 分钟即告警,
|
||
邮件中附订单号与创建时间,便于对照支付宝账单处理)。
|