jorgearma/atalaya

GitHub: jorgearma/atalaya

为单 VPS 上的 Docker 堆栈提供轻量级、无外部数据库的可观测性与安全仪表盘。

Stars: 0 | Forks: 0

# VPS 控制 · Panchi 机器人 为生产环境的 WhatsApp 机器人提供轻量级可观测性与安全仪表盘 运行在单 VPS 上的 Docker 堆栈上。不修改机器人代码,解析其自身的日志文件和 Nginx 访问日志,暴露只读 FastAPI 端点,并渲染一个无需框架即可在 1 GB VPS 上 流畅运行的 HTML 仪表盘。 ![仪表盘截图](https://raw.githubusercontent.com/jorgearma/atalaya/main/docs/screenshot.png) ## 存在的意义 当可观测性成为需求时,机器人已在生产环境运行:消息吞吐量、错误率、p50/p95 响应延迟,以及针对订单链接 URL 的可疑访问模式(枚举、Redis ID 模糊测试)。 而不是侵入式地改造机器人(会影响发布周期且存在风险),该项目与机器人**并排** 部署在同一主机上,通过解析机器人已生成的日志文件来推导所有指标。 **设计约束:** - 不修改被监控的机器人。 - 在小型 VPS 上占用不到 1 个 CPU 核心的 10%,大部分时间空闲。 - 无外部服务(无 Prometheus、无 Grafana、无云代理)。 - 默认 PII 安全——发送人电话号码使用 HMAC 哈希,原始号码永不离开进程。 ## 功能特性 - **系统指标** — 通过 `psutil` 获取 CPU、内存、交换区、磁盘、负载与运行时间。 - **Docker 堆栈健康** — 每个容器的状态、CPU%、内存,支持一键 `启动` / `停止` / `重启`。 - **SQL Server 活跃性探测** — 在容器内执行 `SELECT @@VERSION`,限制为每分钟一次。 - **机器人消息吞吐量** — 最近一小时每分钟消息数,使用纯 SVG 渲染火花线。 - **实时消息流** — 支持客户端暂停与过滤,隐私策略可配置(`full` / `hash` / `anon` / `agg`)。 - **近似机器人延迟** — 将每条进入的 Twilio 消息与对应发送方的下一条响应配对,展示 p50/p95。 - **错误追踪** — 统计最近一小时的 `ERROR` / `CRITICAL` / `Traceback` 并显示最近的几条及上下文。 - **订单链接枚举检测** — 标记在短窗口内访问超过 N 个不同 `/menu/`、`/pago/`、`/t/…` 路径的 IP,并将告警推送到现有安全追踪器。 - **可疑 IP 仪表盘** — 对访问 `/.env`、`/.git`、`/wp-admin` 等或使用扫描器 User-Agent(`sqlmap`、`nikto`、`nuclei` 等)的 IP 进行评分。 ## 架构 ``` ┌─────────────────┐ tail + regex ┌──────────────────┐ │ panchi-bot.log │ ─────────────────────────▶│ PanchiStats │ └─────────────────┘ (inode+offset persist) │ (1h windows, │ │ HMAC privacy) │ ┌─────────────────┐ docker logs nginx │ │ │ nginx access │ ─────────────────────────▶│ LinkStats │──┐ └─────────────────┘ │ SecurityTracker │ │ └──────────────────┘ │ ▼ /api/panchi /api/security /api/system … │ ▼ ┌──────────────┐ │ index.html │ │ (no framework)│ └──────────────┘ ``` 所有数据保存在有界内存双端队列(`maxlen` 或 1 小时滑动窗口)中。 无数据库,除一个微小的 `panchi_offset.json` 外无持久化,确保日志读取器在重启后继续工作。 ### 关键设计决策 | 决策 | 原因 | |---|---| | **基于 `inode + offset` 的增量日志读取** | 每次轮询重新读取 100 MB 是浪费;此方法仅读取机器人自上次轮询后追加的内容,并通过比较 inode 检测日志轮转。 | | **对每次 Shell 调用的 TTL 缓存** | `docker stats` 耗时约 800 毫秒;基于字典的 `cached(key, ttl, fn)` 包装器在零依赖的情况下将守护进程调用减少约 90%。 | | **发送者 ID 的 HMAC 加盐** | 纯 SHA-256 可通过小数字空间反解(电话号码)。仅 `.env` 中保存的盐值使不同部署间的哈希不可关联。 | | **无 JS 框架** | 仪表盘为 600 行原生 HTML/JS,火花线仅 15 行。加载时间小于 100 毫秒,无构建步骤。 | | **单 uvicorn 工作进程绑定本地主机** | 通过 SSH 隧道保护,而非公开 TLS + WAF。缩小攻击面,运维更简单。 | ## 快速启动(本地开发) ``` git clone https://github.com//vps_control.git cd vps_control cp .env.example .env # edit .env: set VPS_CONTROL_PASS and PANCHI_HASH_SALT ./run.sh ``` 然后打开 http://localhost:8080(用户/密码来自 `.env`)。 需要 Python 3.10+ 以及主机上的 Docker。 ## 配置(`.env`) | 变量 | 默认值 | 用途 | |---|---|---| | `VPS_CONTROL_USER` / `VPS_CONTROL_PASS` | `admin` / `changeme` | HTTP 基本认证,更改密码。 | | `VPS_CONTROL_PORT` | `8080` | uvicorn 绑定端口。 | | `PANCHIBOT_DIR` | — | 被监控机器人的目录(用于查找其 `.env` 中的 SQL 密码备用)。 | | `PANCHIBOT_LOG` | — | `panchi-bot.log` 的绝对路径。 | | `STACK_SERVICES` | `app,redis,sqlserver,worker-1,worker-2,nginx` | 在 Docker 卡片中高亮显示的服务名。 | | `PANCHI_PRIVACY` | `hash` | `full`、`hash`、`anon`、`agg` 之一。参见下文。 | | `PANCHI_HASH_SALT` | — | 32 字节的随机十六进制数。**使用 `openssl rand -hex 32` 生成**。 | | `PANCHI_TEXT_MAX` | `160` | 消息文本在流中的截断长度。 | | `PANCHI_LINK_PREFIXES` | `/menu/,/pago/,/t/` | 视为“订单链接”的 URL 前缀。 | | `PANCHI_ENUM_THRESHOLD` | `15` | 在时间窗口内触发枚举告警的不同链接数阈值。 | | `PANCHI_ENUM_WINDOW_SEC` | `300` | 上述检查的时间窗口(秒)。 | ### 隐私模式 | 模式 | 发送人显示为 | 消息文本 | |---|---|---| | `full` | `whatsapp:+34600123456` | 完整 | | `hash`(默认) | `a1b2c3d4`(HMAC-SHA256,取前 8 位十六进制) | 截断至 `PANCHI_TEXT_MAX` | | `anon` | `+34 *** *** *56` | 截断 | | `agg` | — | **不存储**,仅保留计数 | ## 部署(VPS) ``` # on the VPS (as root or via sudo) rsync -avz --exclude venv --exclude .env ./ vps:/opt/vps_control/ ssh vps cd /opt/vps_control python3 -m venv venv && ./venv/bin/pip install -r requirements.txt cp .env.example .env && nano .env # fill in real values ``` 通过编辑 `main.py` 最后一行,将 uvicorn 绑定到 `127.0.0.1`: ``` uvicorn.run("main:app", host="127.0.0.1", port=PORT, reload=False) ``` 通过 SSH 隧道访问仪表盘(不要将 8080 公开暴露): ``` ssh -N -L 8080:127.0.0.1:8080 vps # then open http://localhost:8080 in your browser ``` ### systemd 服务(以 root 运行 — 初始测试) 保存为 `/etc/systemd/system/vps-control.service`: ``` [Unit] Description=VPS Control · Panchi Bot dashboard After=docker.service network.target Requires=docker.service [Service] Type=simple User=root WorkingDirectory=/opt/vps_control ExecStart=/opt/vps_control/venv/bin/python main.py Restart=on-failure RestartSec=5 MemoryMax=256M CPUQuota=50% [Install] WantedBy=multi-user.target ``` 启用并启动: ``` sudo systemctl daemon-reload sudo systemctl enable --now vps-control sudo systemctl status vps-control sudo journalctl -u vps-control -f # follow logs ``` ### 主机前置条件 主机安全与网络安全模块需要读取日志和内核状态, 这需要访问系统资源。以 `root` 运行(上述方式)可自动满足所有要求。 但仍需在主机上验证或启用以下操作: **1. 启用 UFW 记录** — 网络模块解析防火墙事件以检测端口扫描、洪水和被阻断的连接。UFW 默认不记录被丢弃的数据包: ``` # check current state sudo ufw status verbose | grep Logging # enable — 'medium' is the sweet spot (logs blocked packets without # drowning the journal in accepted-traffic noise) sudo ufw logging medium # verify events are landing in the journal sudo journalctl -k -t kernel --grep='\[UFW' -n 20 --no-pager ``` 解析器从 `journalctl -k` 读取日志(而非 `/var/log/ufw.log`),因此在 Ubuntu、Debian、使用 rsyslog 或仅 journald 的任何发行版上均可工作。 **2. 验证服务用户可读取内核日志:** ``` journalctl -k -n 5 --no-pager journalctl -u ssh -n 5 --no-pager ``` 两者都必须有输出。若无,则以 `root` 运行服务(快速路径),或为服务用户添加至 `systemd-journal` 组: ``` sudo usermod -aG systemd-journal # re-login required for group change to apply ``` **3. 验证 Docker 访问** — 服务需要与 Docker 守护进程通信以读取容器状态和日志。 以 `root` 运行可覆盖此需求;若使用非 root 用户,必须将其加入 `docker` 组(`sudo usermod -aG docker <用户>`)。 ## 资源占用 在已运行完整机器人堆的 2 核 VPS 上测量,刷新间隔 10 秒,打开一个浏览器标签: | 资源 | 占用 | |---|---| | CPU | 平均约 1 个核心的 6%(`docker stats` 轮询峰值约 20%) | | 内存 | 稳定在 55–75 MB RSS(有界双端队列) | | 网络(至浏览器) | 约 5 MB/小时,通过 `ssh -C` 时约 4 MB/小时 | | 磁盘写入 | `panchi_offset.json`(每轮询约 80 字节),可疑事件追加到 `security_events.jsonl` | 高耗时操作(`docker stats`、`sqlcmd`、`docker logs`)均受 TTL 缓存保护(20 秒 / 60 秒 / 20 秒),因此多个浏览器标签页**不会**成倍增加开销。 ## 项目结构 ``` vps_control/ ├── main.py # FastAPI app, auth, endpoints, SecurityTracker, TTL cache ├── panchi_stats.py # Incremental bot-log parser + privacy + aggregator ├── nginx_stats.py # Nginx access-log classifier + enumerator detector ├── static/ │ └── index.html # Single-file dashboard (vanilla HTML/CSS/JS + SVG) ├── tests/ │ └── test_panchi_stats.py ├── requirements.txt ├── run.sh # venv bootstrap + launch (dev) ├── .env.example ├── PLAN_NIVEL_1.md # Original design doc for the observability section └── README.md ``` ## 测试 ``` python -m unittest discover tests ``` 测试覆盖纯聚合器(`PanchiStats`、`LinkStats`),无需运行服务器。参见 [`tests/test_panchi_stats.py`](tests/test_panchi_stats.py)。 ## 技术栈 - **后端**:Python 3.10+、FastAPI、uvicorn、psutil、python-dotenv - **前端**:原生 HTML + CSS + JS,无构建步骤,火花线使用 SVG - **运维**:systemd、SSH 隧道、Docker CLI(无 SDK) ## 许可证 MIT — 参见 [`LICENSE`](LICENSE)。
标签:AV绕过, C2命令与控制检测, CPU内存监控, Docker容器健康, Docker栈, FastAPI, HMAC哈希, Inotify实时日志, Nginx威胁评分, PII安全, Python后端, SEO: FastAPI日志分析, SEO: WhatsApp机器人安全, SEO: 单VPS监控, SEO: 无外部数据库监控, SEO: 自我托管仪表板, SQL Server存活探针, SSH审计, Vanilla JavaScript, WhatsApp机器人, x64dbg, 一键启动停止重启, 低资源占用, 内存分配, 前端无框架, 单VPS, 只读API, 响应时间百分位, 安全仪表板, 实时消息流, 客户端过滤, 延迟统计, 无数据库, 日志解析, 消息吞吐量, 生产环境监控, 网络安全, 自托管, 证书伪造, 请求拦截, 轻量级监控, 逆向工具, 错误追踪, 隐私保护