手头几台小鸡散在不同云、不同架构上:有的跑博客,有的跑 Docker,有的跑机器人,有的跑网关。平时想看状态就 SSH 上去瞟一眼——机器不多,但已经够烦。
后来选了 Komari:一个自托管面板 + 若干轻量 agent,上报 CPU、内存、磁盘、网络和在线状态。够轻,1G 内存的机器也能塞。
下面是这次从部署到踩坑的记录。域名、IP、密钥、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 | 额外云服务器 |
真实连接信息放在本地私有记录里,不写进公开文章。
预览:黎明の鸡窝

那天大概怎么走的
整体不复杂,但坑挺典型:DNS 没好就急着签证书、Nginx Basic Auth 挡 agent、自动发现 key 的 JSON 格式、去掉 --auto-discovery 后变空 token、国内机下载 GitHub 卡住。
流量怎么走
几条边界我钉死了:
- Komari 不直接暴露公网:只绑
127.0.0.1:25774 - 公网只开 80/443:TLS 和入口交给 Nginx
- Agent 走 HTTPS + 各自 token
- 禁用 web ssh:面板只做监控,不当远程 shell
后端只听本机,成本低,比裸开一个随机端口安心得多——即便应用自己有登录。
为什么用 Docker
Komari 支持源码、二进制和 Docker。我选 Docker,原因很土:
- 面板机上已有 Nginx,容器能和博客环境隔开
- 升级基本就是
docker compose pull && docker compose up -d - 数据目录清楚,备份盯住
/opt/komari/data就行
源码部署要伺候 Go、Node、构建产物和 systemd。我只想稳定跑面板,不打算给 Komari 提 PR,Docker 更合适。
部署面板
目录:
/opt/komaridocker-compose.yml 形态如下,密码用占位符:
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,是对的。
关于latest
latest只在你pull的那一刻是最新。容器跑几个月不更新,标签还叫 latest,里面完全可能是旧版。后来因此踩过一次版本漂移,见 续文。
Nginx 反代与 HTTPS
DNS 加一条,例如:
monitor.example.com -> 面板服务器公网 IPNginx 大致这样(WebSocket 相关头别丢):
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 外再挡一层。浏览器访问没问题,但 agent 上报和 WebSocket 多了一层认证适配,折腾成本不划算。
Komari 自己有登录,agent 用 token,面板也不是开放注册服务。最后只保留:
HTTPS + Komari 登录 + Agent token + 后端不公网暴露以后真要加码,可以只挡管理后台路径,或者整机走 Tailscale / WireGuard。
批量接入 Agent
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成功后本地会有:
/opt/komari-agent/auto-discovery.json里面是该节点的 uuid 和 token,恢复时很有用,权限收紧一点。
随后改成固定 token 启动,并清空服务端自动发现 key:
ExecStart=/opt/komari-agent/agent -e https://monitor.example.com -t <NODE_TOKEN> --disable-web-ssh --interval 5.0 --info-report-interval 15批量接完就关自动发现。临时 key 就算泄露,也不能再往面板上挂新机器。
踩过的坑
坑 1:DNS 没好就签证书
子域名还没指到面板机就跑 Certbot,ACME 直接失败。比较稳的顺序:
- 先起 Komari,只听
127.0.0.1 - 写好 Nginx 站点模板
- 等 DNS 查到正确 IP
- 再启用站点、签证书
getent hosts monitor.example.comWindows 本地:
Resolve-DnsName monitor.example.com坑 2:Basic Auth 文件权限导致 500
配了 .htpasswd 后浏览器带认证仍 500,Nginx 日志:
open() "/etc/nginx/.htpasswd-komari" failed (13: Permission denied)配置写对了,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 字符串
为了临时开自动发现,我直接改 SQLite 配置。第一次写成裸字符串:
auto_discovery_key = abcdef...Agent 注册报:
Failed to get AutoDiscovery Key: invalid character 'x' after top-level valueconfigs.value 存的是 JSON 字面量,字符串要带引号:
auto_discovery_key = "abcdef..."脚本写入时用 json.dumps(),别手搓。
坑 4:去掉 --auto-discovery 变成空 token
注册完我想「把自动发现参数删掉更安全」,于是直接去掉:
--auto-discovery <TEMP_AD_KEY>结果全员离线。服务端日志:
GET /api/clients/report?token= 401POST /api/clients/uploadBasicInfo?token= 401Agent 不会自动去读 auto-discovery.json 里的 token,而是空 token 上报。要从本地配置取出 token,写进 systemd:
-t <NODE_TOKEN>修完:
Basic info uploaded successfullyWebSocket connected面板在线数才回来。这坑当时差点把我绕晕——参数删了更「干净」,上报却全 401。
坑 5:国内机下 GitHub Release 卡住
某台国内云直连 GitHub 下 agent,下了几 MB 就不动。不等了,从已有 amd64 节点拷二进制:
已有 amd64 节点 /opt/komari-agent/agent -> scp 到本地 -> scp 到下载困难的节点 -> chmod +x -> 手动创建 systemd service小规模自用很够用:单文件、架构一致就能搬。
常用命令
面板:
cd /opt/komarisudo docker compose pssudo docker compose logs -fsudo docker stats komariNginx / 证书:
sudo nginx -tsudo systemctl reload nginxsudo 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真正要紧的是数据和身份:面板库、证书、Nginx、agent token。镜像和二进制都能重建。
收尾
Komari 本身不难装,烦的是边界:端口别裸奔、WebSocket 头别丢、DNS 好了再签证、自动发现用完就关、systemd 里写死 token、GitHub 下不动就抄同架构二进制。
换来的是一个页面看完几台机的在线、负载、磁盘和流量。个人小规模已经够用。
以后加机器:临时开自动发现 → 注册 → 改固定 token → 清空自动发现 key → 补进备份清单。扩容方便,又不把长期入口晾在外面。
更新(2026-07)
跑了大约两个月,新节点出现「面板在线,CPU/内存/磁盘却是 0」。根因是 Server 还停在 1.2.0,Agent 已经 1.2.60。Docker 升级、1.2.7 迁移向导和 Agent 重启过程写在:
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时