fix: correct client interface traffic filtering
ServerStatus 是一个轻量的服务器探针和云监控面板,支持多节点在线状态、资源占用、三网延迟、服务监测、SSL 证书检查、Watchdog 告警、HTTP API 和 Web 配置管理。
在线演示:https://tz.cloudcpp.com
# Docker Compose,本地构建加:--build ADMIN_TOKEN='your-strong-token' docker compose -f docker-compose-server.yml up -d
# Docker Run wget -qO ~/serverstatus-config.json \ --header='Accept: application/vnd.github.raw' \ 'https://api.github.com/repos/cppla/ServerStatus/contents/server/config.json?ref=master' mkdir -p ~/serverstatus-data docker run -d --restart=always --name=serverstatus-server \ -e ADMIN_TOKEN='your-strong-token' \ -v ~/serverstatus-config.json:/app/config/config.json \ -v ~/serverstatus-data:/app/data \ -p 8080:80 -p 35601:35601 \ cppla/serverstatus:server
启动后访问:
35601/tcp
ADMIN_TOKEN 不设置时,监控页面仍可读取,管理 API 返回 503,WebUI 的“配置”页不能修改数据。
ADMIN_TOKEN
503
# Docker Compose,本地构建加:--build SERVER=127.0.0.1 USER=s01 PASSWORD=USER_DEFAULT_PASSWORD \ docker compose -f docker-compose-client.yml up -d --force-recreate
# Docker Run docker run -d --restart=always --name=serverstatus-client \ --network=host --pid=host \ -e SERVER=127.0.0.1 \ -e USER=s01 \ -e PASSWORD=USER_DEFAULT_PASSWORD \ cppla/serverstatus:client
# Shell Run wget -qO client-linux.py --header='Accept: application/vnd.github.raw' \ 'https://api.github.com/repos/cppla/ServerStatus/contents/clients/client-linux.py?ref=master' nohup python3 client-linux.py SERVER=127.0.0.1 USER=s01 PASSWORD=USER_DEFAULT_PASSWORD >/dev/null 2>&1 &
USER 是常见的宿主机环境变量名。如果没有显式传递或传递方式错误,Compose 可能会把系统中的 $USER 解析成本机用户名,而不是默认的 s01。推荐优先级:
USER
$USER
s01
USER=s01
docker-compose-client.yml
SERVER
127.0.0.1
PORT
35601
PASSWORD
USER_DEFAULT_PASSWORD
INTERVAL
1
PROBEPORT
80
PROBE_PROTOCOL_PREFER
ipv4
ipv6
PING_PACKET_HISTORY_LEN
100
CU
cu.tz.cloudcpp.com
CT
ct.tz.cloudcpp.com
CM
cm.tz.cloudcpp.com
CLIENT
psutil
linux
Docker 镜像中的默认路径为:
CONFIG_PATH
/app/config/config.json
STATS_PATH
/app/data/stats.json
WEB_DIR
/app/web
HTTP_ADDR
:80
AGENT_ADDR
:35601
ADMIN_CORS_ORIGIN
INSECURE_CALLBACK_TLS
false
VERBOSE
TZ
Asia/Shanghai
对应命令行参数:
--config, -c config.json 路径 --stats stats.json 路径 --web-dir, -d WebUI 目录 --http HTTP 监听地址 --agent Agent TCP 监听地址 --verbose, -v 详细请求日志 --version 输出构建版本
旧参数 --bind/-b 和 --port/-p 仍可用于设置 Agent TCP 监听地址。
--bind/-b
--port/-p
管理接口使用 Bearer Token:
Authorization: Bearer <ADMIN_TOKEN>
无需认证:
GET
/api/health
/api/schema
/api/openapi.json
/json/stats.json
需要认证:
GET/PUT
/api/config
GET/POST
/api/servers
PUT/DELETE
/api/servers/{username}
POST
/api/servers/{username}/reset-traffic
/api/monitors
/api/monitors/{index-or-name}
/api/sslcerts
/api/sslcerts/{index-or-name}
/api/watchdog
/api/watchdog/{index-or-name}
/api/reload
/api/restart
配置修改采用“校验 → 备份 → 持久化 → 原子切换”的顺序。成功后现有 Agent 连接会被关闭,Python 客户端约 3 秒后自动重连并获取新的 monitors。/api/restart 不退出 Go 进程,因此 Docker 和手动运行方式具有一致语义。
monitors
常用调用:
TOKEN='请替换为 ADMIN_TOKEN' curl http://127.0.0.1:8080/api/health curl -H "Authorization: Bearer ${TOKEN}" \ http://127.0.0.1:8080/api/config curl -X POST http://127.0.0.1:8080/api/servers \ -H "Authorization: Bearer ${TOKEN}" \ -H 'Content-Type: application/json' \ -d '{"username":"s05","name":"node5","type":"kvm","host":"host5","location":"SG","password":"change-me","monthstart":1}' curl -X DELETE \ -H "Authorization: Bearer ${TOKEN}" \ http://127.0.0.1:8080/api/servers/s05
请求体最大为 1 MiB。AI Agent 可直接导入 /api/openapi.json;轻量客户端也可以先读取 /api/schema,再根据返回的集合字段调用 CRUD 接口。
1 MiB
{ "servers": [ { "username": "s01", "name": "node1", "type": "kvm", "host": "host1", "location": "CN", "password": "USER_DEFAULT_PASSWORD", "monthstart": 1, "disabled": false } ], "monitors": [ { "name": "example", "host": "https://example.com", "interval": 600, "type": "https" } ], "sslcerts": [ { "name": "example", "domain": "https://example.com", "port": 443, "interval": 7200, "callback": "https://example.net/push?message=" } ], "watchdog": [ { "name": "offline warning", "rule": "online4=0&online6=0", "interval": 600, "callback": "https://example.net/push?message=" } ] }
约束:
servers.username
monthstart
1-28
port
1-65535
interval
config.json.bak-*
rename
使用 Docker 单文件挂载时,配置备份位于容器 /app/config 的可写层;如需长期保留历史版本,建议同时在宿主机备份 server/config.json。
/app/config
server/config.json
rule 由 Go expr 引擎执行,并兼容旧版 Exprtk 的常用写法。Go 服务会把字符串外的单个操作符自动转换:
rule
expr
& -> && | -> || = -> ==
例如以下两种写法等价:
cpu>90&load_1>5&username!='s01' cpu>90 && load_1>5 && username!='s01'
字符串值支持中文、Emoji 和其他 Unicode 字符,例如:
username='节点一号'&name='上海节点'&location='中国 🇨🇳'&type='云主机'
字段名必须使用系统定义的英文名称。可用字段包括:username、name、type、host、location、load_1、load_5、load_15、cpu、memory_total、memory_used、swap_total、swap_used、hdd_total、hdd_used、network_rx、network_tx、network_in、network_out、last_network_in、last_network_out、ping_10010、ping_189、ping_10086、time_10010、time_189、time_10086、tcp_count、udp_count、process_count、thread_count、io_read、io_write、online4、online6。
username
name
type
host
location
load_1
load_5
load_15
cpu
memory_total
memory_used
swap_total
swap_used
hdd_total
hdd_used
network_rx
network_tx
network_in
network_out
last_network_in
last_network_out
ping_10010
ping_189
ping_10086
time_10010
time_189
time_10086
tcp_count
udp_count
process_count
thread_count
io_read
io_write
online4
online6
客户端断开 25 秒后仍未重连,服务端才计算离线规则,避免短暂网络波动触发告警。每个节点、每条规则分别记录冷却时间。
证书检查使用 Go crypto/tls,不再调用外部 openssl。服务端记录到期时间、剩余天数和域名匹配状态,并保留原来的 7/3/1 天通知档位与冷却时间。
crypto/tls
openssl
回调默认校验 HTTPS 证书。仅在必须兼容自签名回调服务时设置:
INSECURE_CALLBACK_TLS=true
需要 Go 1.25 或更高版本:
1.25
cd server go mod download go test ./... go build -trimpath -ldflags='-s -w' -o serverstatus .
从 server/ 目录启动:
server/
ADMIN_TOKEN='请替换为高强度随机字符串' \ ./serverstatus \ --config=config.json \ --stats=../web/json/stats.json \ --web-dir=../web \ --http=:8080 \ --agent=:35601
访问 http://127.0.0.1:8080/。发送 SIGHUP 可以重新读取配置:
SIGHUP
kill -HUP "$(pgrep -x serverstatus)"
Systemd 示例位于 service/status-server.service。一键脚本 status.sh 也已切换到 Go 构建,但 Docker 仍是推荐部署方式。
service/status-server.service
status.sh
Go 测试需要 Go 1.25+;WebUI 行为测试需要 Node.js 20+ 和 pnpm。
1.25+
20+
# Go 单元、协议、API、TLS 和回调测试 cd server go test ./... go test -race ./... go vet ./... # Python 客户端指标、参数与平台识别测试 cd .. python3 -m unittest discover -s clients -p 'test_*.py' # WebUI Chromium 行为测试 pnpm install --frozen-lockfile pnpm exec playwright install chromium pnpm test:webui # Docker 镜像 docker build -f Dockerfile.server -t cppla/serverstatus:server . docker build -f Dockerfile.client -t cppla/serverstatus:client . # 服务端与客户端真实连接、认证和指标上报 SERVER_IMAGE=cppla/serverstatus:server \ CLIENT_IMAGE=cppla/serverstatus:client \ tests/docker-smoke.sh # Compose 配置 docker compose -f docker-compose-server.yml config docker compose -f docker-compose-client.yml config
Docker 联通测试在 Linux 上覆盖客户端的 host 网络和 pid 模式;Docker Desktop 未启用 Host Networking 时会明确提示并使用隔离 bridge 完成本地协议测试。
pid
CI 还会运行 Chromium 行为测试、Docker 服务端/客户端联通测试,并验证客户端镜像可同时构建为 AMD64 和 ARM64。
config.json
web/json/stats.json
/app/data
manage_api.py
sergate
stats.json 会按节点的 name/type/host/location 恢复月流量基线。修改这些身份字段会被视为新节点。
stats.json
name/type/host/location
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ServerStatus 中文版
ServerStatus 是一个轻量的服务器探针和云监控面板,支持多节点在线状态、资源占用、三网延迟、服务监测、SSL 证书检查、Watchdog 告警、HTTP API 和 Web 配置管理。
在线演示:https://tz.cloudcpp.com
一、服务端
启动后访问:
35601/tcpADMIN_TOKEN不设置时,监控页面仍可读取,管理 API 返回503,WebUI 的“配置”页不能修改数据。二、客户端
USER是常见的宿主机环境变量名。如果没有显式传递或传递方式错误,Compose 可能会把系统中的$USER解析成本机用户名,而不是默认的s01。推荐优先级:USER=s01docker-compose-client.yml中的USER默认值USERSERVER127.0.0.1USERs01PORT35601PASSWORDUSER_DEFAULT_PASSWORDINTERVAL1PROBEPORT80PROBE_PROTOCOL_PREFERipv4ipv4、ipv6PING_PACKET_HISTORY_LEN100CUcu.tz.cloudcpp.comCTct.tz.cloudcpp.comCMcm.tz.cloudcpp.comCLIENTpsutilpsutil、linux服务端参数
Docker 镜像中的默认路径为:
CONFIG_PATH/app/config/config.jsonSTATS_PATH/app/data/stats.jsonWEB_DIR/app/webHTTP_ADDR:80AGENT_ADDR:35601ADMIN_TOKENADMIN_CORS_ORIGININSECURE_CALLBACK_TLSfalseVERBOSEfalseTZAsia/Shanghai对应命令行参数:
旧参数
--bind/-b和--port/-p仍可用于设置 Agent TCP 监听地址。HTTP 管理 API
管理接口使用 Bearer Token:
无需认证:
GET/api/healthGET/api/schemaGET/api/openapi.jsonGET/json/stats.json需要认证:
GET/PUT/api/configGET/POST/api/serversPUT/DELETE/api/servers/{username}POST/api/servers/{username}/reset-trafficGET/POST/api/monitorsPUT/DELETE/api/monitors/{index-or-name}GET/POST/api/sslcertsPUT/DELETE/api/sslcerts/{index-or-name}GET/POST/api/watchdogPUT/DELETE/api/watchdog/{index-or-name}POST/api/reloadPOST/api/restart配置修改采用“校验 → 备份 → 持久化 → 原子切换”的顺序。成功后现有 Agent 连接会被关闭,Python 客户端约 3 秒后自动重连并获取新的
monitors。/api/restart不退出 Go 进程,因此 Docker 和手动运行方式具有一致语义。常用调用:
请求体最大为
1 MiB。AI Agent 可直接导入/api/openapi.json;轻量客户端也可以先读取/api/schema,再根据返回的集合字段调用 CRUD 接口。配置文件
约束:
servers.username必须唯一。monthstart自动限制在1-28。port自动限制在1-65535。interval最小为 1 秒;Watchdog 中表示通知冷却时间,不是客户端采集间隔。config.json.bak-*,最多保留 10 份。rename覆盖时,服务端会在完成备份后安全地写回原 inode。使用 Docker 单文件挂载时,配置备份位于容器
/app/config的可写层;如需长期保留历史版本,建议同时在宿主机备份server/config.json。Watchdog 表达式
rule由 Goexpr引擎执行,并兼容旧版 Exprtk 的常用写法。Go 服务会把字符串外的单个操作符自动转换:例如以下两种写法等价:
字符串值支持中文、Emoji 和其他 Unicode 字符,例如:
字段名必须使用系统定义的英文名称。可用字段包括:
username、name、type、host、location、load_1、load_5、load_15、cpu、memory_total、memory_used、swap_total、swap_used、hdd_total、hdd_used、network_rx、network_tx、network_in、network_out、last_network_in、last_network_out、ping_10010、ping_189、ping_10086、time_10010、time_189、time_10086、tcp_count、udp_count、process_count、thread_count、io_read、io_write、online4、online6。客户端断开 25 秒后仍未重连,服务端才计算离线规则,避免短暂网络波动触发告警。每个节点、每条规则分别记录冷却时间。
SSL 证书
证书检查使用 Go
crypto/tls,不再调用外部openssl。服务端记录到期时间、剩余天数和域名匹配状态,并保留原来的 7/3/1 天通知档位与冷却时间。回调默认校验 HTTPS 证书。仅在必须兼容自签名回调服务时设置:
源码编译和运行
需要 Go
1.25或更高版本:从
server/目录启动:访问 http://127.0.0.1:8080/。发送
SIGHUP可以重新读取配置:Systemd 示例位于
service/status-server.service。一键脚本status.sh也已切换到 Go 构建,但 Docker 仍是推荐部署方式。构建和测试
Go 测试需要 Go
1.25+;WebUI 行为测试需要 Node.js20+和 pnpm。Docker 联通测试在 Linux 上覆盖客户端的
host网络和pid模式;Docker Desktop 未启用 Host Networking 时会明确提示并使用隔离 bridge 完成本地协议测试。CI 还会运行 Chromium 行为测试、Docker 服务端/客户端联通测试,并验证客户端镜像可同时构建为 AMD64 和 ARM64。
从旧服务端迁移
config.json和web/json/stats.json。/app/config/config.json和/app/data。manage_api.py、sergate启动或监督配置。/api/health,再观察客户端自动重连。stats.json会按节点的name/type/host/location恢复月流量基线。修改这些身份字段会被视为新节点。致谢