Mjj 手上 VPS 一多,最先失控的往往不是服务本身,而是入口。博客一个端口、探针一个端口、面板又一个端口,时间一长,连”某个服务到底跑在哪台机器上”都要用终端一个个去查。我实在受不了这种混乱,就把常用入口收敛成一套方案:Komari 管节点状态,Homepage 做统一导航,反代层搞定 HTTPS,Certbot 兜底续期,Telegram 负责告警。
这套东西跑起来之后最大的感受是:不是服务越多越爽,而是”入口统一、证书省心、异常能感知”才真的爽。下面把这些天折腾出来的经验整理一下:
一、先规划域名和端口
别一上来就装软件,先把域名和端口理清楚。我的做法是每个服务单独一个子域名,比如:
•monitor.example.com → Komari
•home.example.com → Homepage
•panel.example.com → 运维面板
•blog.example.com → 博客
容器端口我习惯只绑在 127.0.0.1 上,公网访问全部走反代。以 Komari 为例,docker-compose.yml 我一般这么写:
services:
komari:
image: ghcr.io/komari-monitor/komari:latest
container_name: komari
restart: unless-stopped
ports:
- "127.0.0.1:25774:25774"
volumes:
- ./data:/app/data
这样即使有人扫端口,也扫不到容器内部。域名解析那边加一条 A 记录指向服务器 IP 就行。调试阶段我一般先关 CDN 代理,等证书搞定了、反代验证通过了再开。
二、Komari 装完别急着玩,先做安全
Docker 启动后看日志拿初始密码:
docker compose up -d
docker logs komari
日志里会打印默认管理员账号密码。登录之后我按这个顺序做事:
1.改密码(这个不用说了吧)
2.开 HTTPS
3.确认 WebSocket 能正常工作
Komari 之前曝过一个 WebSocket 来源检查的安全漏洞(CVE-2025-55300),所以别长期裸端口暴露。这个后面反代部分会细说。
三、HTTPS 反代,有三种做法
做法一:Nginx + Certbot(最常用)
服务器上有 Nginx 的话,Certbot 是最顺手的选择。
装 Certbot:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
申请证书:
sudo certbot --nginx -d monitor.example.com
申请完别急着走,先跑一次模拟续期看看有没有问题:
sudo certbot renew --dry-run
没报错就说明链路没问题。然后加一条 crontab 让它自己续:
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/certbot-renew.log 2>&1
每天凌晨三点检查一下,快到期的话自动续,续完自动 reload Nginx。我设了之后基本就忘了这回事。
Komari 需要 WebSocket 支持,Nginx 反代配置里这几行不能省:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_buffering off;
少了这些的话,页面能打开,但节点状态不刷新、延迟曲线出不来,新手很容易在这里卡半天。
做法二:Caddy(懒人首选)
Caddy 的好处是它自己会申请和续期证书,你不用管。Caddyfile 写一行:
monitor.example.com {
reverse_proxy 127.0.0.1:25774
}
就完了。它会自己处理 HTTP 跳转 HTTPS、申请证书、到期续期。如果你懒得折腾证书,Caddy 是最省心的。
不过要注意,如果你要申请泛域名证书,或者域名全程走了 CDN 代理,可能需要用 xcaddy 自己编译带 DNS 插件的版本。
做法三:CDN 代理 + DNS-01 验证
如果你的域名开了 CDN 代理(比如 Cloudflare 的橙色云朵),HTTP-01 验证可能会因为 80 端口不通而失败。这时候改用 DNS-01 验证就行。
以 Cloudflare 为例,先装插件:
sudo apt install python3-certbot-dns-cloudflare -y
创建凭据文件:
sudo mkdir -p /etc/letsencrypt/cloudflare
sudo nano /etc/letsencrypt/cloudflare/cloudflare.ini
写入你的 API Token:
dns_cloudflare_api_token = 你的Cloudflare_API_Token
然后设权限:
sudo chmod 600 /etc/letsencrypt/cloudflare/cloudflare.ini
申请证书时用 DNS 验证:
sudo certbot certonly
--dns-cloudflare
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/cloudflare.ini
-d monitor.example.com
续期还是用之前那条 crontab 就行。这样即使 80 端口不可达,证书也能正常签发和续期。
四、往 Komari 里加节点
在面板里找到”添加节点”,会生成一条 Agent 安装命令。我装 Agent 时主要注意两件事:
1.面板如果用了 HTTPS,Agent 地址也要写 https://,别混用
2.别在同一环境里混用 IP 和域名,容易证书校验失败
把命令粘贴到目标 VPS 执行完,回面板刷新,节点变绿就说明连上了。
如果节点一直离线,排查顺序一般是:
•面板端口防火墙/安全组放行了吗?
•Agent 地址写的对不对(http vs https)?
•域名有没有正确解析?
•如果域名套了 CDN,确认 CDN 支持 WebSocket/gRPC
五、三网延迟监控,别只测一个 IP
刚开始我也就挂几个公共 DNS 随便看看,后来发现这样参考价值真不大。原因有两个:一是很多机房限制 ICMP,二是单个 IP 代表不了整条运营商线路。
我现在用的做法是:
•优先用 TCPing 测 IP:80 或 IP:443(比 ICMP Ping 更靠谱)
•每个运营商至少挂 2-3 个目标
•加上本地运营商的 DNS 地址
•监控间隔设 30-60 秒,太短容易误报
•按省份分组看,别拿一台机器的延迟说全国网络
下面这些 DNS 地址我平时用来做探测目标。不过得说一句,运营商 DNS 会随地区、机房、时间变化,下面这些适合作为参考,真正用的时候最好在自己 VPS 上 ping 或 tcping 一下确认。
全国通用公共 DNS
服务商 IPv4 备注
阿里 DNS 223.5.5.5 / 223.6.6.6 稳定、常用
腾讯 DNSPod 119.29.29.29 / 182.254.116.116 视频、游戏场景常见
114DNS 114.114.114.114 兼容性好
百度 DNS 180.76.76.76 百度系解析较优
CNNIC SDNS 1.2.4.8 / 210.2.4.8 权威机构提供
三大运营商全国通用 DNS
运营商 IPv4 IPv6
中国电信 218.2.2.2 / 218.4.4.4 240e:4c:4008::1 / 240e:4c:4808::1
中国联通 123.123.123.123 / 123.123.123.124 2408:8899::8 / 2408:8888::8
中国移动 211.138.180.2 / 211.138.180.3 2409:8088::a / 2409:8088::b
华东地区常用 DNS
省市 运营商 常用 DNS
江苏 电信 218.2.2.2 / 218.4.4.4 / 61.147.37.1 / 218.2.135.1
江苏 联通 221.6.4.66 / 221.6.4.67
江苏 移动 221.131.143.69 / 112.4.0.55
上海 电信 202.96.209.133 / 116.228.111.118
上海 联通 210.22.70.3 / 210.22.84.3
上海 移动 211.136.112.50 / 211.136.150.66
浙江 电信 202.101.172.35 / 61.153.177.196
浙江 联通 221.12.1.227 / 221.12.33.227
浙江 移动 211.140.13.188 / 211.140.188.188
安徽 电信 61.132.163.68 / 202.102.213.68
安徽 联通 218.104.78.2 / 58.242.2.2
安徽 移动 211.138.180.2 / 211.138.180.3
山东 电信 219.146.1.66 / 219.147.1.66
山东 联通 202.102.128.68 / 202.102.152.3
山东 移动 218.201.96.130 / 211.137.191.26
福建 电信 218.85.152.99 / 218.85.157.99
福建 联通 218.104.128.106
福建 移动 218.138.156.161
江西 电信 202.101.224.69 / 202.101.226.68
江西 联通 220.248.192.12
江西 移动 221.176.3.70 / 221.176.4.6
华北地区常用 DNS
省市 运营商 常用 DNS
北京 电信 219.141.136.10 / 219.141.140.10
北京 联通 123.123.123.123 / 123.123.123.124
北京 移动 211.136.28.228 / 211.136.28.234
天津 电信 219.150.32.132 / 219.146.0.132
天津 移动 211.137.160.50 / 211.137.160.185
河北 电信 222.222.202.202
河北 联通 202.99.160.68 / 202.99.166.4
山西 电信 59.49.49.49
山西 联通 202.99.192.66 / 202.99.192.68
山西 移动 211.138.106.2 / 211.138.106.3
内蒙古 电信 219.148.162.31 / 222.74.39.50
内蒙古 联通 202.99.224.68 / 202.99.224.8
华南地区常用 DNS
省市 运营商 常用 DNS
广东 电信 202.96.128.86 / 202.96.128.166
广东 联通 210.21.196.6 / 221.5.88.88
广东 移动 211.136.192.6 / 211.136.20.204
广西 电信 202.103.225.68 / 202.103.224.68
广西 联通 221.7.128.68
广西 移动 211.136.20.193
海南 电信 202.100.192.68
海南 联通 221.11.132.2
华中地区常用 DNS
省市 运营商 常用 DNS
河南 电信 222.88.88.88 / 222.85.85.85
河南 联通 202.102.224.68 / 202.102.227.68
河南 移动 211.138.30.66 / 211.138.24.71
湖北 电信 202.103.24.68 / 202.103.0.68
湖北 联通 218.104.111.122
湖北 移动 211.137.58.20 / 211.137.64.163
湖南 电信 59.51.78.211 / 59.51.78.210
湖南 联通 58.20.127.238
湖南 移动 211.142.210.98 / 211.142.210.99
西南地区常用 DNS
省市 运营商 常用 DNS
四川 电信 61.139.2.69 / 218.6.200.139
四川 联通 119.6.6.6 / 124.161.87.155
四川 移动 211.137.96.205
重庆 电信 61.128.192.68 / 61.128.128.68
重庆 移动 218.201.4.3 / 218.201.21.132
云南 电信 222.172.200.68 / 61.166.150.123
云南 联通 221.3.131.11
云南 移动 211.137.130.240
贵州 电信 202.98.192.67 / 202.98.198.167
贵州 联通 221.13.30.242
西北地区常用 DNS
省市 运营商 常用 DNS
陕西 电信 218.30.19.40 / 61.134.1.4
陕西 联通 221.11.1.67 / 221.11.1.68
陕西 移动 211.137.130.3 / 211.137.130.19
甘肃 电信 202.100.64.68 / 61.178.0.93
甘肃 联通 221.7.34.11
宁夏 联通 221.199.12.157
新疆 电信 61.128.114.167
新疆 联通 221.7.1.20
东北地区常用 DNS
省市 运营商 常用 DNS
黑龙江 电信 219.147.198.230 / 219.147.198.242
黑龙江 联通 202.97.224.69 / 202.97.224.68
吉林 电信 219.149.194.55 / 219.149.194.56
吉林 联通 202.98.0.68 / 202.98.5.68
辽宁 电信 219.148.204.66
辽宁 联通 202.96.69.38 / 202.96.64.68
西藏地区常用 DNS
省市 运营商 常用 DNS
西藏 联通 221.13.65.34
用的时候按”省份+运营商”分组就行。比如我的节点在华东,就重点加江苏电信、江苏联通、江苏移动,再加上上海、浙江的;华北节点就加北京、天津、河北三家。这样看延迟曲线才有意义。
六、告警配置:别等挂了才想起来
Komari 支持 Telegram、Webhook、邮件告警。我个人最常用 Telegram,配完基本不用管。
流程不复杂:
1.在 Telegram 里找 @BotFather,发 /newbot 创建机器人
2.拿到 Bot Token 记下来
3.给机器人随便发条消息
4.访问 https://api.telegram.org/bot/getUpdates 拿到 Chat ID
5.回到 Komari 通知设置,填上 Token 和 Chat ID
6.勾选触发条件:节点离线、CPU 过高、内存过高、磁盘满了之类的
如果后面想玩得更花,可以通过 Webhook 把告警转发到飞书、钉钉、企业微信,或者自己写个脚本聚合。
七、Homepage:把所有入口收拢到一个页面
服务一多,最怕的就是”记得有这个东西,但死活想不起地址”。Homepage 就是干这个的——把所有服务入口集中到一个页面,还能显示 Docker 容器状态、服务健康情况,甚至加天气、RSS 这些小部件。
它基于 YAML 配置,没有数据库,跑在 Docker 里很轻。
7.1 部署 Homepage
先建目录:
mkdir -p /root/data/docker_data/homepage/config
cd /root/data/docker_data/homepage
写 docker-compose.yml:
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- HOMEPAGE_ALLOWED_HOSTS=127.0.0.1,localhost,home.example.com
启动:
docker compose up -d
然后通过反代把 home.example.com 指向 127.0.0.1:3000,和 Komari 一样申请 HTTPS 证书就行。
注意 docker.sock 的挂载——如果你希望 Homepage 显示 Docker 容器状态,就保留这个挂载;如果只当导航页用,可以去掉它,减少权限暴露。
7.2 配置文件都在 config 目录
Homepage 的配置都在挂载的 config 目录下,常用文件有几个:
•settings.yaml:站点标题、主题、语言、搜索这些基础设置
•services.yaml:服务分组和链接(最核心的文件)
•widgets.yaml:小部件,时间、天气、系统状态等
•bookmarks.yaml:书签
•docker.yaml:Docker 集成配置
7.3 配置 services.yaml
这是你最常改的文件。我的一般结构是按”用途”分组,比如监控、运维、开发、工具:
- 监控:
- Komari:
href: https://monitor.example.com
icon: si-grafana
description: 多节点监控面板
- Komari:
- 运维:
- 运维面板:
href: https://panel.example.com
icon: si-linux
description: 服务器管理入口 - 博客:
href: https://www.example.com
icon: si-hexo
description: 个人博客
- 运维面板:
- 工具:
- 邮箱:
href: https://mail.example.com
icon: si-gmail
description: 邮件入口 - 网盘:
href: https://drive.example.com
icon: si-dropbox
description: 个人网盘
- 邮箱:
保存后 Homepage 会自动热加载,刷新页面就能看到效果。每个服务卡片支持自定义 icon(用 Simple Icons 的图标名)、描述文字、甚至自定义颜色。
7.4 配置 widgets.yaml
Homepage 的首页上方可以放各种小部件,我常用的有:
•时间:显示当前时间,带时区
•天气:显示当地天气(需要 OpenWeatherMap API key)
•系统状态:如果挂载了 docker.sock,可以显示 Docker 容器运行状态
•搜索框:内置 Google/Bing 搜索,直接在首页搜东西
•RSS:订阅几个博客或新闻源,首页直接看摘要
一个简单的 widgets.yaml:
- clock:
text: "本地时间"
time:
hour12: false
format: "HH:mm"
date:
weekday: long
month: long
day: numeric
timezone: Asia/Shanghai
color: "#3b82f6" - search:
provider: google
target: _blank - docker:
host: unix:///var/run/docker.sock
show_info: true
show_network: true
show_storage: true
7.5 自定义主题和样式
Homepage 支持换主题,内置了十几个主题可以直接选。如果你想要更个性化的效果,可以在 config 目录下放一个 custom.css 文件,Homepage 会自动加载。
比如我想把卡片圆角改大一点、加个阴影,可以写:
.card {
border-radius: 16px !important;
box-shadow: 0 4px 12px rgba(0,0,0,0.1) !important;
transition: all 0.2s ease !important;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.15) !important;
}
7.6 用 Homepage 做服务健康检查
Homepage 不只是个链接导航页。它内置了简单的 HTTP/TCP/ICMP 健康检查功能。在 services.yaml 里给服务加上 check 配置,Homepage 就会定期探测服务是否在线,并在卡片上显示绿色(正常)或红色(异常)状态。
比如给 Komari 加健康检查:
- 监控:
- Komari:
href: https://monitor.example.com
icon: si-grafana
description: 多节点监控面板
check:
url: https://monitor.example.com
method: GET
expectedStatus: 200
expectedBody: ""
interval: 60
- Komari:
这样 Homepage 首页上就能看到哪些服务活着、哪些挂了,配合前面的 Telegram 告警,双重保障。
7.7 给 Homepage 加访问控制
Homepage 暴露到公网的话,建议加一层访问控制。最简单的方式是在反代层加 HTTP 基本认证。Nginx 可以用 auth_basic 指令:
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
.htpasswd 文件可以用 htpasswd 命令生成:
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd yourusername
输入密码后就只有你知道入口了。
八、备份与恢复
Komari 后台可以直接导出备份文件,里面包含节点列表、通知配置、延迟监控配置、主题设置等。定期导出存到别的地方(比如另一台服务器或本地),迁移的时候直接导入就行。
如果用 Docker,顺手把挂载目录也打包备份:
tar -czf komari-backup-$(date +%F).tar.gz /root/data/docker_data/komari/data
Homepage 也是同理,config 目录备份好,换服务器恢复就行。
九、Komari 和哪吒探针怎么选
之前也有人问我这两个怎么选。简单说:
•Komari:轻量、部署快、后台表单操作为主、备份恢复方便,适合想快速用起来、不想折腾配置的人
•哪吒探针:功能更丰富、社区生态更成熟、自定义空间大,但部分功能需要 JSON 配置,上手门槛稍高
我后来选 Komari 主要是因为想少折腾配置、快速跑起来。如果你需要更丰富的监控项和更成熟的社区方案,哪吒探针也完全没问题。
十、安全加固清单
部署完别就放着不管了,顺手做这几件事:
•改默认管理员密码
•开 HTTPS,别长期裸用 HTTP
•用域名访问,别暴露 IP+端口
•容器端口绑 127.0.0.1,不直接对外
•用反代(Nginx/Caddy)做入口
•不需要的功能(比如远程命令执行)别开
•定期备份数据
•及时更新到新版本
•面板面向公网的话,加 IP 白名单或访问密码
十一、最后说几句
这套组合跑起来之后,日常维护成本确实降了不少。Komari 看节点健康,Homepage 管入口导航,反代和证书管安全,告警管异常提醒。对个人维护几台 VPS 来说,基本够用。
服务继续增加的话,只需要在 Homepage 的 YAML 里加一行卡片就行,不用每次都去记新端口新地址。证书续期交给 Certbot 或 Caddy,告警交给 Telegram,剩下的就是偶尔上去看看曲线、调调配置。
。

Comments NOTHING