1. 介绍
ServerStatus 威力加强版,保持轻量和简单部署,增加以下主要特性:
- 使用
rust完全重写server、client,单个执行文件部署 - 多系统支持
Linux、MacOS、Windows、Android、Raspberry Pi - 支持上下线和简单自定义规则告警 (
telegram、wechat、email、webhook) - 支持
http协议上报,方便部署到各免费容器服务和配合cf等优化上报链路 - 支持
cloudflare tunnels和mTLS部署 - 支持主机分组动态注册,简化配置
- 支持
vnstat统计月流量,重启不丢流量数据 - 支持
railway快速部署 - 支持
systemd开机自启 - 其它功能,如 🗺️ 见 wiki
演示:ssr.rs | cn dns | 下载:Releases | Changelog | 反馈:Discussions
📚 完整文档迁移至 doc.ssr.rs
🍀 主题
如果你觉得你创造/修改的主题还不错,欢迎分享/PR,前端单独部署方法参考 #37
作者 @JingBh 👉 主题地址 支持快速部署一键命令生成
👉 主题地址 作者 @orilights
Hotaru 主题由 @HinataKato 修改提供,主题地址
ServerStatus-web 主题由 @mjjrock 修改提供,主题地址
2. 安装部署
2.1 快速体验
# for CentOS/Debian/Ubuntu x86_64
&&
# apt install -y unzip / yum install -y unzip
# 部署完毕,打开 http://127.0.0.1:8080/ 或 http://<你的IP>:8080/
# 自定义部署可参照 scripts/one-touch.sh 脚本
2.2 快速部署
👉 快速部署
2.3 服务管理脚本
由 @Colsro & @Yooona-Lim 贡献
# 下载脚本
# 安装 服务端
# 安装 客户端
# or
# eg:
# 更多用法:
CN=true
2.4 Railway 部署
懒得配置 Nginx,SSL 证书?试试
在 Railway 部署 Server
2.5 Heroku 部署
如何在 Heroku 上部署 Rust 版 ServerStatus 云探针
3. 服务端说明
3.1 配置文件 config.toml
# 侦听地址, ipv6 使用 [::]:9394
= "0.0.0.0:9394"
= "0.0.0.0:8080"
# 默认30s无上报判定下线
= 30
# 管理员账号,不设置默认随机生成,用于查看 /detail, /map
= ""
= ""
# hosts 跟 hosts_group 两种配置模式任挑一种配置即可
# name 主机唯一标识,不可重复,alias 为展示名
# notify = false 单独禁止单台机器的告警,一般针对网络差,频繁上下线
# monthstart = 1 没启用vnstat时,表示月流量从每月哪天开始统计
# disabled = true 单机禁用
# location 支持国旗 emoji https://emojixd.com/group/flags
# 或国家缩写,如 cn us 等等,所有国家见目录 web/static/flags
# 自定义标签 labels = "os=centos;ndd=2022/11/25;spec=2C/4G/60G;"
# os 标签可选,不填则使用上报数据,ndd(next due date) 下次续费时间, spec 为主机规格
# os 可用值 centos debian ubuntu alpine pi arch windows linux
= [
{ = "h1", = "p1", = "n1", = "🏠", = "kvm", = "os=arch;ndd=2022/11/25;spec=2C/4G/60G;"},
{ = "h2", = "p2", = "n2", = "🏢", = "kvm", = false},
{ = "h3", = "p3", = "n3", = "🏡", = "kvm", = 1},
{ = "h4", = "p4", = "n4", = "cn", = "kvm", = true, = "ndd=2022/11/25;spec=2C/4G/60G;"},
]
# 动态注册模式,不再需要针对每一个主机做单独配置
# gid 为模板组id, 动态注册唯一标识,不可重复
= [
# 可以按国家地区或用途来做分组
{ = "g1", = "pp", = "🏠", = "kvm", = true},
{ = "g2", = "pp", = "🏢", = "kvm", = true},
# 例如不发送通知可以单独做一组
{ = "silent", = "pp", = "🏡", = "kvm", = false},
]
# 动态注册模式下,无效数据清理间隔,默认 30s
= 30
# 不开启告警,可忽略后面配置,或者删除不需要的通知方式
# 告警间隔默认为30s
= 30
# https://core.telegram.org/bots/api
# https://jinja.palletsprojects.com/en/3.0.x/templates/#if
[]
# 开关 true 打开
= false
= "<tg bot token>"
= "<chat id>"
# host 可用字段见 payload.rs 文件 HostStat 结构, {{host.xxx}} 为占位变量
# 例如 host.name 可替换为 host.alias,大家根据自己的喜好来编写通知消息
# {{ip_info.query}} 主机 ip, {{sys_info.host_name}} 主机 hostname
= "❗<b>Server Status</b>"
= "{{config.title}} \n😆 {{host.location}} {{host.name}} 主机恢复上线啦"
= "{{config.title}} \n😱 {{host.location}} {{host.name}} 主机已经掉线啦"
# custom 模板置空则停用自定义告警,只保留上下线通知
= """
{% if host.memory_used / host.memory_total > 0.5 %}
<pre>😲 {{host.name}} 主机内存使用率超50%, 当前{{ (100 * host.memory_used / host.memory_total) | round }}% </pre>
{% endif %}
{% if host.hdd_used / host.hdd_total > 0.5 %}
<pre>😲 {{host.name}} 主机硬盘使用率超50%, 当前{{ (100 * host.hdd_used / host.hdd_total) | round }}% </pre>
{% endif %}
"""
# wechat, email, webhook 等其它通知方式 配置详细见 config.toml
3.2 服务端运行
# systemd 方式, 参照 scripts/one-touch.sh 脚本 (推荐)
# 💪 手动方式
# help
# 手动运行
# 或
RUST_BACKTRACE=1 RUST_LOG=trace
# 测试配置文件是否有效
# 根据配置发送测试消息,验证通知是否生效
# 🐳 docker 方式
4. 客户端说明
| OS | Release |
|---|---|
| Linux x86_64 | x86_64-unknown-linux-musl |
| Linux arm64 | aarch64-unknown-linux-musl |
| MacOS x86_64 | x86_64-apple-darwin |
| MacOS arm64 | aarch64-apple-darwin |
| Windows x86_64 | x86_64-pc-windows-msvc |
| Raspberry Pi | armv7-unknown-linux-musleabihf |
| Android 64bit | aarch64-linux-android |
| Android 32bit | armv7-linux-androideabi |
4.1 Rust 版 Client
# 公网环境建议 headscale/nebula 组网或走 https, 使用 nginx 对 server 套 ssl 和自定义 location /report
# alpine linux 需要安装相关命令 apk add procps iproute2 coreutils
# 如果 Rust 版客户端在你的系统无法使用,请切换到下面 4.2 Python 跨平台版本
# systemd 方式, 参照 scripts/one-touch.sh 脚本 (推荐)
# 💪 手动方式
# Rust 版本 Client
# 或
# 不同的主机可以运行相同的命令注册到同一组
# rust client 可用参数
# 一些参数说明
# 总流量,网卡流量/网速统计
4.2 Python 版 Client
# Python 版本 Client 依赖安装
## Centos
## Ubuntu/Debian
## Alpine linux
## Windows
# 安装 python 3.10 版本,并设置环境变量
# 命令行执行 pip install psutil requests
# 下载 https://raw.githubusercontent.com/zdz/ServerStatus-Rust/master/client/stat_client.py
5. 开启 vnstat 支持
vnstat 是Linux下一个流量统计工具,开启 vnstat 后,server 完全依赖客户机的 vnstat 数据来显示月流量和总流量,优点是重启不丢流量数据。
# 在client端安装 vnstat
## Centos
## Ubuntu/Debian
# 修改 /etc/vnstat.conf
# BandwidthDetection 0
# MaxBandwidth 0
# 默认不是 eth0 网口的需要置空 Interface 来自动选择网口
# 没报错一般不需要改
# Interface ""
# 确保 version >= 2.6
# 测试查看月流量 (刚安装可能需等一小段时间来采集数据)
# client 使用 -n 参数开启 vnstat 统计
# 或
6. FAQ
更简单的方式 👉 #37
server {
# ssl, domain 等其它 nginx 配置
# 反代 /report 请求
location = /report {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://127.0.0.1:8080/report;
}
# 反代 json 数据请求
location = /json/stats.json {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://127.0.0.1:8080/json/stats.json;
}
# v1.4.0后,同样需要反代 /detail, /map
# 其它 html,js,css 等,走本地文本
location / {
root /opt/ServerStatus/web; # 你自己修改的主题目录
index index.html index.htm;
}
}
# 按提示安装 rust 编译器
|
# 编译好的文件目录 target/release
# 例如自定义移动探测地址,用 --cm 指定地址
# 电信联通参数可以使用 -h 命令查看
之前一直在使用 Prometheus + Grafana + Alertmanager + node_exporter 做VPS监控,这也是业界比较成熟的监控方案,用过一段时间后,发现非生产环境,很多监控指标都用不上,运维成本有点大。
而 ServerStatus 很好,足够简单和轻量,一眼可以看尽所有小机机,只是 c++ 版本很久没迭代过,自己的一些需求在原版上不是很好修改,如自带 tcp 上报对跨区机器不是很友好,也不方便对上报的链路做优化 等等。这是学习 Rust 练手的小项目,所以不会增加复杂功能,保持小而美,简单部署,配合 Uptime Kuma 基本上可以满足个人大部分监控需求。
7. 相关项目
- https://github.com/BotoX/ServerStatus
- https://github.com/cppla/ServerStatus
- https://github.com/mojeda/ServerStatus
- https://github.com/cokemine/ServerStatus-Hotaru
- https://github.com/ToyoDAdoubiBackup/ServerStatus-Toyo
8. 最后
很高兴我的代码能跑在你的服务器上,如果对你有帮助的话,欢迎留下你的 star ⭐ 支持一下