Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions src/content/ai.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ hub、配好反代、接入第一个节点。也可以把 [`llms.txt`](/llms.txt
- monitor 由三部分组成:hub(面板 + API,装在一台机器上)、agent(装在每台被监控的
机器上)、主题(公开状态页的皮肤,默认已内置)。
- hub 是单个 Rust 二进制加一个 SQLite 文件。零配置文件,所有设置存在数据库里。
- 一键脚本装出来的 hub **只监听 127.0.0.1**,这是刻意的安全设计,不要试图改成
0.0.0.0 或者去开防火墙端口。正确做法是配一个反向代理,用 HTTPS 域名访问。
- 一键脚本装出来的 hub **默认只监听 127.0.0.1**,这是刻意的安全设计。公网部署不要改成
0.0.0.0 或去开防火墙端口,正确做法是配一个反向代理用 HTTPS 域名访问。内网直连是另一种
受支持的用法:`--host <内网地址>`,然后从同一内网用 `http://私网IP:端口` 访问。
- hub 的一键脚本只支持 systemd;没有 systemd 的机器用 Docker 部署 hub。
- agent 只支持 Linux(systemd 或 OpenRC),不提供 Docker 镜像,这也是刻意的。
- 从 IP 地址或明文 HTTP 进面板时,添加节点和生成安装命令的入口会被禁用。
必须先配好域名和 TLS。
- 从公网的 IP 或明文 HTTP 进面板时,添加节点和生成安装命令的入口会被禁用,必须先配好域名和 TLS。
例外:**同一内网直连**(没有经过反代)时,用 `http://私网IP:28080` 也能添加节点。

## 执行规则

Expand Down Expand Up @@ -125,7 +126,8 @@ WebSocket 能升级,期望输出 101(升级后连接保持,由 --max-time
周期性掉线 → 反代读写超时太短,或者没关 proxy_buffering
"添加节点"是灰的 → 按钮上方那行字就是原因:不是从 HTTPS 域名进的,
或者 hub 启动时带的 --site 不是 https 加域名;反代把 Host 改写了、
没有透传 X-Forwarded-Proto 也会这样
没有透传 X-Forwarded-Proto 也会这样。
(从同一内网用私网 IP 直连是允许的,不算这种情况)
导入备份 413 → 反代的 client_max_body_size 没设到 8m
今日流量不归零 → Docker 部署没设 TZ 环境变量

Expand Down
15 changes: 13 additions & 2 deletions src/content/config/data.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,22 @@ hub 的全部数据在一个 SQLite 文件里:一键脚本部署是 `/opt/moni

## 保留天数

**设置**页的**历史数据保留天数**(1–3650,默认 7)决定每分钟一行的历史明细和延迟记录留多久,hub 每
小时清理一次超出的部分。
**设置**页的**历史数据保留天数**(1–365,默认 90)决定 hub 为你留多久的历史。hub 每小时处理一次。

历史分两层,这样「留得久」和「占得少」可以同时成立:

- **明细层(固定 7 天)**:每分钟一行的原始数据,图表上的细节来自这里
- **汇总层(保留天数)**:更早的数据会先合并成**每小时一行**再留下——平均值、峰值、延迟中位数
与丢包数都还在,只是不再有分钟级的抖动

所以把天数从 7 调到 90,占用空间的增长远小于十二倍:一小时一行,而不是六十行。90 天、100 台
节点的库,折叠并整理后实测约 **127 MiB**(完全不折叠是 1.77 GiB)。

累计流量不受影响:总流量和月流量是独立的累计值,不是从明细算出来的,调小保留天数只会让图表变短。

**上限 365 天,而且调小会删数据。** 原来设成大于 365 的安装,升级后按 365 天算,更早的汇总会在之后
几次清理里被删掉(启动日志会写明这件事)。调小之前请先在**数据**页导出备份。

## 回收空间

删掉的历史只把空间还给 SQLite 自己,文件不会变小。**数据**页的**回收空间**依次清理超出保留天数的明细、
Expand Down
12 changes: 10 additions & 2 deletions src/content/dev/architecture.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,19 @@ POST /api/db/restore POST /api/db/vacuum
| `setting` | key/value 配置,替代配置文件 |
| `node` | 节点配置 + agent 上报的静态信息,含分组、离线通知的开关与状态 |
| `traffic` | **单调递增的流量累计**。1:1 于 node,但每次上报都写 |
| `metric` | 历史明细,每节点每分钟一行,按保留天数删 |
| `metric` | 历史明细,每节点每分钟一行,超出明细窗口(7 天)后折叠进 `metric_hour` 再删 |
| `ping_task` / `ping_node` | 探测任务及其节点分配 |
| `ping_record` | 探测结果,同样按保留天数删 |
| `ping_record` | 探测结果,同样先折叠进 `ping_hour` 再删 |
| `metric_hour` | 小时汇总:分钟数、均值、峰值,按保留天数删 |
| `ping_hour` | 小时汇总:该小时的中位数、上下界与丢包数,按保留天数删 |
| `session` | 登录会话,存 sha256,14 天过期 |

`metric_hour` / `ping_hour` 是**汇总层**:一个小时后满两小时(agent 最慢一小时上报一次,探测结果
也要等下一帧)才把那一小时折叠进去,`INSERT OR REPLACE` 所以重复折叠只是重写;水位线存在 `setting`
里,重启后接着折。明细行**只在它的小时已经折叠之后**才允许删除,所以汇总落后只会多占磁盘、
不会少历史。两张表不在 `TABLES` 里——升级前导出的备份没有它们,必须仍能恢复——所以它们的行数在
**数据**页单独显示。

`traffic` 单独一张表,因为它和 `node` 的读写方式完全不同:一个是偶尔修改的配置,一个是每秒都在写的数据。
更重要的是,`metric` 可以随意清理而累计流量不受影响,累计值不是从明细算出来的。

Expand Down
8 changes: 8 additions & 0 deletions src/content/dev/theme.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,14 @@ const groups = [...new Set(nodes.map((n) => n.group ?? "").filter(Boolean))]
- `d7`、`d30`:近 7 天、近 30 天的比例,0–1
- `from7`、`from30`、`to`:两个窗口实际覆盖的区间(epoch 秒)。窗口会被节点自己的创建时间和 hub 的
保留天数截短,所以别把「近 30 天」写死,按 `from`/`to` 说跨度
- **档位也不要写死**:`GET /api/me` 的 `history_days` 是这台 hub 保留的天数,按它生成档位,
并且**不要给出超过它的档位**——那会画出比所选窗口更短的图,看起来像丢了数据,而不是像上限。
这个字段是后来才有的,**旧 hub 不会返回它**,取不到时回退到 7 天。默认主题的
`src/lib/ranges.ts` 就是这么做的,可以直接照抄。

```json
{ "history_days": 90 }
```
- 它衡量的是「agent 有没有在跟 hub 说话」,不是探测目标通不通;后者是 `ping` 的 `loss`

按小时的时间轴和故障列表由 `metrics` 的 `availability` 系列给出:
Expand Down
7 changes: 6 additions & 1 deletion src/content/guide/philosophy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,17 @@ hub 因此改不了自己的二进制,可写的只有数据库和主题所在

### 面板默认不对公网开放

一键脚本写死 `--listen 127.0.0.1`,装完后从公网打不开面板,要先配反向代理。
一键脚本默认 `--listen 127.0.0.1`(`--host` 可改),装完后从公网打不开面板,要先配反向代理。

原因是明文 HTTP 上,会话 cookie 和节点 token 都在链路上明文传输,中间人还能替换安装命令下载的脚本和
二进制,而那个脚本以 root 执行。所以 agent 和 `install.sh` 拒绝用明文连远程 hub,从 IP 或明文地址进
面板时也不给出安装命令。

一个例外是**同一内网的直连**:从私网地址(`10.`、`172.16`–`172.31`、`192.168.`、IPv6 ULA,或本机)
直接用 `http://IP:28080` 进面板,hub 会照常给出安装命令——令牌没有离开这个网络,上面那些风险不成立。
判断依据是「这次请求没有声明 `X-Forwarded-Proto`,且 hub 看到的客户端地址是私网地址」;经反代转发的
公网访客不满足,所以反代部署不会因为这个例外被绕过。

配法见[反向代理](/install/reverse-proxy)。

## 极简
Expand Down
14 changes: 13 additions & 1 deletion src/content/install/hub.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

| 参数 | 说明 |
|---|---|
| `--host <addr>` | 监听地址,默认 `127.0.0.1`。改成 `0.0.0.0` 或内网地址后端口就明文可达了,只应在内网、或反向代理之后这样用 |
| `--port <n>` | 本机监听端口,默认 `28080` |
| `--site <url>` | 一般不用填,见下文[什么时候需要 `--site`](#什么时候需要---site) |
| `--uninstall` | 卸载,数据保留在 `/opt/monitor/data`,见[卸载](/install/uninstall) |
Expand Down Expand Up @@ -53,7 +54,7 @@ sudo ./install-hub.sh
```

- 新二进制校验通过才替换;新版起不来时自动换回上一版
- 没写的参数沿用上次安装的,端口和 `--site` 不会被冲掉
- 没写的参数沿用上次安装的,监听地址、端口和 `--site` 不会被冲掉

脚本不会自我更新:每次用到的就是手上这一份。要拿到新脚本,按
[快速开始](/install/quick-start)里的命令重新下载一次。
Expand Down Expand Up @@ -102,6 +103,17 @@ monitor-hub
- 节点要连的域名和你进面板用的域名不是同一个:填节点可达的 HTTPS 域名
- 反代不发 `X-Forwarded-Proto`:cookie 拿不到 `Secure`,用 `--site https://...` 强制加上

### 内网直连可以用明文

从**同一内网**直接访问(没有经过反向代理)时,面板允许用 `http://私网IP:28080` 添加节点:hub 看到 TCP
对端是私网地址、且这次请求没有声明 `X-Forwarded-Proto`,就按「令牌不出这个网络」处理。`--site` 不必填,
安装命令用浏览器地址栏里的地址。

两种情况下这个例外不成立,仍是「必须 HTTPS 域名」:请求是反代转发的(hub 会取 `X-Forwarded-For` 的
最后一段,那就是真实客户端),或者声明了 `X-Forwarded-Proto`。

回环地址(`localhost`、`127.0.0.1`)也不算:那样生成的安装命令只有本机能用。

`--site` 必须是 `https://` 加域名,可以带端口,不能是 IP,不能带路径。不符合时 hub 照常启动,但拒绝
添加和安装节点。

Expand Down
8 changes: 7 additions & 1 deletion src/content/install/reverse-proxy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,16 @@ curl -s --http1.1 --max-time 3 -o /dev/null -w '%{http_code}\n' \
https://hub.example.com/api/ws
```

面板**节点**页的「添加节点」能点,说明是从 HTTPS 域名进的;从 IP 或明文地址进面板时它是灰的。hub 看三样:
面板**节点**页的「添加节点」能点,说明入口被判为可用:要么是从 HTTPS 域名进的,要么是**同一内网直连**
(私网 IP + 明文,且没有经过反代,见 [内网直连可以用明文](/install/hub#内网直连可以用明文))。从公网的
IP 或明文地址进面板时它是灰的。hub 看三样:
反代转发过来的 `Host`(必须是域名)、`X-Forwarded-Proto`(必须是 `https`,没给 hub 配 `--site` 时尤其
重要),以及浏览器发来的 `Origin`(带了就必须和 `Host` 同源)。所以反代既要在 `Host` 里保留域名、透传
`X-Forwarded-Proto`,也不要清掉或改写 `Origin`。

上面那个「内网直连」的例外不会漏进来:它要求这次请求**没有**声明 `X-Forwarded-Proto`,且 hub 看到的
客户端地址(本机反代会取 `X-Forwarded-For` 的最后一段)是私网地址。反代声明了 https、或转发的是一段
公网地址,都回到老规矩。

`X-Forwarded-Proto` 是否生效,看登录后的会话 cookie 有没有 `Secure` 标志:浏览器开发者工具的
应用 → Cookie 里,`monitor_session` 那一行。
Loading