最近给手头几台小服务器补了一套统一监控。之前每台机器各跑各的服务,状态靠临时 SSH 上去看:有的跑博客,有的跑 Docker 服务,有的跑机器人,有的跑 API 网关。机器数量不多,但一旦分散到不同云厂商、不同架构、不同端口策略里,就会很容易出现一种尴尬局面:明明都是自己的机器,却没有一个一眼能看到全局健康状态的地方。
这次最后选了 Komari。它的思路比较简单:一个自托管面板,加若干轻量 agent。面板负责展示,agent 负责上报 CPU、内存、磁盘、网络、在线状态等指标。整体足够轻,适合塞进 1G 内存级别的小机器里。
本文记录一下这次部署的完整流程。所有真实域名、IP、SSH 用户、密钥名和 token 都会做脱敏处理,只保留架构、命令形态和踩坑过程,方便以后自己复盘,也给类似场景的人一个参考。
最终效果
部署完成后的形态大概是这样:
监控面板:https://monitor.example.com面板部署:Docker Compose公网入口:Nginx + Let's Encrypt HTTPS后端端口:127.0.0.1:25774Agent 数量:5 台服务器Agent 权限:禁用 web ssh,只做监控上报被监控节点覆盖了几类环境:
| 节点 | 系统 | 架构 | 用途 |
|---|---|---|---|
| Node A | Ubuntu 24.04 | amd64 | Docker 服务 |
| Node B | Ubuntu 24.04 | amd64 | Blog / Komari 面板 |
| Node C | Ubuntu 24.04 | arm64 | Bot 服务 |
| Node D | Ubuntu 24.04 | amd64 | API / Docker 服务 |
| Node E | Alibaba Cloud Linux 3 | amd64 | 额外云服务器 |
真实 IP 和 SSH 信息没有写进文章。实际运维时我另外保存在本地私有记录里,和公开博客分开。
预览地址:黎明の鸡窝

部署时间线
这次过程不算复杂,但中间有几个坑比较典型:DNS 刚开始没解析、Nginx Basic Auth 会影响 agent、自动发现 key 的配置格式、固定 token 启动方式、以及某台国内云服务器下载 GitHub release 卡住。
架构设计
最终的流量关系非常朴素:
核心原则是:
- Komari 后端不直接暴露公网端口:容器只绑定
127.0.0.1:25774。 - 公网只开放 80/443:统一由 Nginx 接入和终结 TLS。
- Agent 走 HTTPS 上报:每个 agent 使用自己的 token。
- 禁用 web ssh:面板不承担远程命令入口,只做监控。
为什么不直接暴露 25774?监控面板本身不应该裸露在公网随机端口上。即使应用有登录鉴权,也建议通过 Nginx 统一处理 HTTPS、日志、限流、证书续期和未来可能的访问控制。后端监听
127.0.0.1是一个很低成本但很有效的边界。
一、选择部署方式:Docker
Komari 支持源码、二进制和 Docker 部署。这里选 Docker,理由很直接:
- 面板所在机器已经有 Nginx,Docker 可以把 Komari 和博客环境隔离开;
- 升级时只需要
docker compose pull && docker compose up -d; - 数据目录明确,备份只需要盯住
/opt/komari/data;
源码部署不是不行,但需要关心 Go、Node、构建产物和 systemd 服务。我的目标是稳定跑面板,不是开发 Komari 本体,所以 Docker 更合适。
二、部署 Komari 面板
面板目录放在:
/opt/komariCompose 文件形态如下,密码处用占位符代替:
services: komari: image: ghcr.io/komari-monitor/komari:latest container_name: komari restart: unless-stopped ports: - "127.0.0.1:25774:25774" environment: ADMIN_USERNAME: "admin" ADMIN_PASSWORD: "<INITIAL_ADMIN_PASSWORD>" volumes: - ./data:/app/data启动:
cd /opt/komarisudo docker compose pullsudo docker compose up -d验证本机访问:
curl -s -D - http://127.0.0.1:25774/ -o /tmp/komari.htmlhead -20 /tmp/komari.html此时公网还访问不到 25774,这是预期行为。
三、Nginx 反代与 HTTPS
DNS 里添加一个子域名,例如:
monitor.example.com -> 面板服务器公网 IPNginx 配置大致如下:
server { server_name monitor.example.com;
location ^~ /.well-known/acme-challenge/ { root /var/www/html; }
location / { proxy_pass http://127.0.0.1:25774; proxy_http_version 1.1; 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 Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }}启用站点并签证书:
sudo ln -s /etc/nginx/sites-available/komari /etc/nginx/sites-enabled/komarisudo nginx -tsudo systemctl reload nginx
sudo certbot --nginx -d monitor.example.com --redirect签完后确认:
curl -I https://monitor.example.com/curl -I http://monitor.example.com/预期结果:
HTTPS:200HTTP:301 -> HTTPSBasic Auth 最后为什么去掉了
一开始我在 Nginx 外层加了 Basic Auth,思路是“面板登录前再挡一层”。这对浏览器访问没问题,但会让 agent 上报和 WebSocket 连接多一层认证适配成本。
后来考虑到 Komari 本身已经有登录,agent 也使用 token 鉴权,而这个面板不是公众注册服务,最后去掉了 Nginx Basic Auth,只保留:
HTTPS + Komari 登录 + Agent token + 后端端口不公网暴露如果未来要再加强,可以考虑只对管理后台路径加访问控制,或使用 Tailscale / WireGuard 做内网访问。
四、批量接入 Agent
Komari agent 的基本安装方式是下载二进制,然后用 systemd 常驻运行。为了批量接入多台服务器,我先临时启用了自动发现 key。
第一次注册时的启动参数类似:
/opt/komari-agent/agent \ -e https://monitor.example.com \ --auto-discovery <TEMP_AD_KEY> \ --disable-web-ssh \ --interval 5.0 \ --info-report-interval 15注册成功后,agent 会在本地生成:
/opt/komari-agent/auto-discovery.json里面包含该节点自己的 uuid 和 token。这个文件需要保护好,恢复 agent 时很有用。
之后我把 systemd 改成固定 token 启动:
ExecStart=/opt/komari-agent/agent -e https://monitor.example.com -t <NODE_TOKEN> --disable-web-ssh --interval 5.0 --info-report-interval 15并清空服务端的自动发现 key。这样以后即使临时注册 key 泄露,也不能再新增节点。
不要长期保留自动发现 Key自动发现 key 是为了快速注册节点,不适合作为长期开放入口。批量接入完成后,应该清空服务端 key,并让每个 agent 使用自己的固定 token 启动。
五、踩坑记录
坑 1:DNS 还没解析,证书不能急着签
刚开始子域名还没有解析到面板服务器。这个时候如果直接跑 Certbot,会因为 ACME 验证失败而中断。
比较稳的顺序是:
- 先部署 Komari 容器,只监听
127.0.0.1; - 配好 Nginx 站点模板;
- 等 DNS 查询能返回正确 IP;
- 再启用站点并签证书。
检查命令:
getent hosts monitor.example.comWindows 本地也可以:
Resolve-DnsName monitor.example.com坑 2:Nginx Basic Auth 文件权限导致 500
外层 Basic Auth 初次配置后,浏览器带认证访问却返回 500。Nginx 错误日志显示:
open() "/etc/nginx/.htpasswd-komari" failed (13: Permission denied)原因是 .htpasswd 文件权限太紧,Nginx worker 用户读不到。
修复方式:
sudo chgrp www-data /etc/nginx/.htpasswd-komarisudo chmod 640 /etc/nginx/.htpasswd-komarisudo nginx -tsudo systemctl reload nginx后来我移除了 Basic Auth,这个坑也就不再影响最终架构。但它很典型:Nginx 配置正确不等于运行时权限正确。
坑 3:自动发现 Key 写进数据库时必须是 JSON 字符串
为了临时启用自动发现,我直接改了 Komari SQLite 里的配置项。第一次把 key 写成了裸字符串:
auto_discovery_key = abcdef...结果 agent 注册时报错:
Failed to get AutoDiscovery Key: invalid character 'x' after top-level value后来发现 Komari 的 configs.value 存的是 JSON 字面量,字符串值应该带 JSON 引号:
auto_discovery_key = "abcdef..."如果通过脚本写入,应该使用 json.dumps() 之类的方法,而不是手搓字符串。
坑 4:移除 auto-discovery 参数后,Agent 变成空 token
注册完成后,我一开始想“把启动参数里的自动发现 key 删掉,更安全”。于是直接移除了:
--auto-discovery <TEMP_AD_KEY>结果面板里所有节点都显示离线。服务端日志里全是:
GET /api/clients/report?token= 401POST /api/clients/uploadBasicInfo?token= 401也就是说,agent 没有自动读取本地 auto-discovery.json 里的 token,而是用空 token 上报。
正确做法是从本地配置取出 token,然后显式写进 systemd:
-t <NODE_TOKEN>修完后,日志恢复为:
Basic info uploaded successfullyWebSocket connected面板在线数也恢复正常。
坑 5:国内云服务器下载 GitHub Release 卡住
其中一台国内云服务器直连 GitHub 下载 agent release 时卡住,只下载了几 MB 就一直不动。
解决思路不是硬等,而是复用已经下载好的同架构二进制:
已有 amd64 节点 /opt/komari-agent/agent -> scp 到本地 -> scp 到下载困难的节点 -> chmod +x -> 手动创建 systemd service这个办法很适合小规模自用环境。agent 是单文件二进制,只要架构一致,就很方便迁移。
六、常用运维命令
面板状态:
cd /opt/komarisudo docker compose pssudo docker compose logs -fsudo docker stats komariNginx 检查:
sudo nginx -tsudo systemctl reload nginx证书检查:
sudo certbot certificatesAgent 状态:
systemctl is-active komari-agentjournalctl -u komari-agent -n 80 --no-pagergrep '^ExecStart=' /etc/systemd/system/komari-agent.service检查面板端口是否只监听本机:
ss -tulpn | grep 25774预期:
127.0.0.1:25774七、备份重点
面板所在机器需要重点备份:
/opt/komari/docker-compose.yml/opt/komari/data/etc/nginx/etc/letsencrypt每个 agent 节点建议备份:
/etc/systemd/system/komari-agent.service/opt/komari-agent/auto-discovery.json其中最关键的是面板的 SQLite 数据和每台 agent 的 token 配置。agent 二进制本身可以重新下载或从同架构机器复制。
恢复优先级真正重要的是数据和身份:面板数据库、证书、Nginx 配置、agent token。Docker 镜像、agent 二进制、安装脚本都可以重建。
总结
这次 Komari 部署本身并不难,真正容易出问题的是“边界条件”:
- 面板端口应该只绑定本机;
- Nginx 反代 WebSocket 需要保留
Upgrade和Connection头; - DNS 生效前不要急着签证书;
- 自动发现 key 注册后要及时关闭;
- agent 最终最好用固定 token 启动;
- 国内云服务器下载 GitHub release 不稳定时,可以复制已有二进制。
最终这套监控系统的复杂度很低,但带来的收益很直接:几台机器的在线状态、资源负载、磁盘空间、网络流量都能在一个页面里看到。对个人小规模服务器来说,这已经足够实用。
以后再加机器时,流程也很明确:临时开自动发现,注册成功,改固定 token,清空自动发现 key,最后补进备份文档。这样既方便扩容,也不会把长期入口留在外面。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时


















