mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
mobile wallpaper 5
mobile wallpaper 6
1631 字
5 分钟
搭建“黎明の鸡窝”
2026-05-24 20:20:40
2026-07-17 18:14:40

手头几台小鸡散在不同云、不同架构上:有的跑博客,有的跑 Docker,有的跑机器人,有的跑网关。平时想看状态就 SSH 上去瞟一眼——机器不多,但已经够烦。

后来选了 Komari:一个自托管面板 + 若干轻量 agent,上报 CPU、内存、磁盘、网络和在线状态。够轻,1G 内存的机器也能塞。

下面是这次从部署到踩坑的记录。域名、IP、密钥、token 都做了脱敏,只留架构、命令形态和坑本身。


跑起来长什么样#

监控面板:https://monitor.example.com
面板部署:Docker Compose
公网入口:Nginx + Let's Encrypt HTTPS
后端端口:127.0.0.1:25774
Agent 数量:5 台服务器
Agent 权限:禁用 web ssh,只做监控上报

节点大致是这些角色:

节点系统架构用途
Node AUbuntu 24.04amd64Docker 服务
Node BUbuntu 24.04amd64Blog / Komari 面板
Node CUbuntu 24.04arm64Bot 服务
Node DUbuntu 24.04amd64API / Docker 服务
Node EAlibaba Cloud Linux 3amd64额外云服务器

真实连接信息放在本地私有记录里,不写进公开文章。

预览:黎明の鸡窝

image-20260524200841421


那天大概怎么走的#

整体不复杂,但坑挺典型:DNS 没好就急着签证书、Nginx Basic Auth 挡 agent、自动发现 key 的 JSON 格式、去掉 --auto-discovery 后变空 token、国内机下载 GitHub 卡住。

gantt title Komari 监控部署时间线 (2026-05-23) dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 面板准备 服务器资源与端口检查 :done, p1, 2026-05-23 18:03, 8m Docker 与 Compose 安装 :done, p2, 2026-05-23 18:13, 4m Komari 容器部署 :done, p3, 2026-05-23 18:17, 3m section HTTPS 暴露 子域名 DNS 解析 :done, n1, 2026-05-23 18:18, 1m Nginx 反代配置 :done, n2, 2026-05-23 18:19, 2m Certbot 证书签发 :done, n3, 2026-05-23 18:19, 2m section Agent 接入 自动发现批量注册 :done, a1, 2026-05-23 18:27, 3m 修复 AD Key JSON 格式 :done, a2, 2026-05-23 18:28, 2m 固定 token 启动 :done, a3, 2026-05-23 18:35, 3m 新增额外云服务器 :done, a4, 2026-05-23 18:40, 6m section 收尾 清空自动发现 Key :done, s1, 2026-05-23 18:44, 1m 本地文档记录 :done, s2, 2026-05-23 18:50, 8m

流量怎么走#

flowchart TD User[浏览器访问 monitor.example.com] --> DNS[DNS A 记录] DNS --> Nginx[Nginx 443 / HTTPS] Nginx --> Komari[Komari 容器<br>127.0.0.1:25774] Komari --> DB[(SQLite<br>/opt/komari/data)] NodeA[Node A Agent] -->|HTTPS + token| Nginx NodeB[Node B Agent] -->|HTTPS + token| Nginx NodeC[Node C Agent] -->|HTTPS + token| Nginx NodeD[Node D Agent] -->|HTTPS + token| Nginx NodeE[Node E Agent] -->|HTTPS + token| Nginx

几条边界我钉死了:

  1. Komari 不直接暴露公网:只绑 127.0.0.1:25774
  2. 公网只开 80/443:TLS 和入口交给 Nginx
  3. Agent 走 HTTPS + 各自 token
  4. 禁用 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/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"
environment:
ADMIN_USERNAME: "admin"
ADMIN_PASSWORD: "<INITIAL_ADMIN_PASSWORD>"
volumes:
- ./data:/app/data

启动:

cd /opt/komari
sudo docker compose pull
sudo docker compose up -d

本机探一下:

curl -s -D - http://127.0.0.1:25774/ -o /tmp/komari.html
head -20 /tmp/komari.html

这时候公网还打不到 25774,是对的。

关于 latest

latest 只在你 pull 的那一刻是最新。容器跑几个月不更新,标签还叫 latest,里面完全可能是旧版。后来因此踩过一次版本漂移,见 续文


Nginx 反代与 HTTPS#

DNS 加一条,例如:

monitor.example.com -> 面板服务器公网 IP

Nginx 大致这样(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/komari
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d monitor.example.com --redirect

确认:

curl -I https://monitor.example.com/
curl -I http://monitor.example.com/

预期:

HTTPS:200
HTTP:301 -> HTTPS

Basic 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

里面是该节点的 uuidtoken,恢复时很有用,权限收紧一点。

随后改成固定 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 直接失败。比较稳的顺序:

  1. 先起 Komari,只听 127.0.0.1
  2. 写好 Nginx 站点模板
  3. 等 DNS 查到正确 IP
  4. 再启用站点、签证书
getent hosts monitor.example.com

Windows 本地:

Terminal window
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-komari
sudo chmod 640 /etc/nginx/.htpasswd-komari
sudo nginx -t
sudo 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 value

configs.value 存的是 JSON 字面量,字符串要带引号:

auto_discovery_key = "abcdef..."

脚本写入时用 json.dumps(),别手搓。

坑 4:去掉 --auto-discovery 变成空 token#

注册完我想「把自动发现参数删掉更安全」,于是直接去掉:

--auto-discovery <TEMP_AD_KEY>

结果全员离线。服务端日志:

GET /api/clients/report?token= 401
POST /api/clients/uploadBasicInfo?token= 401

Agent 不会自动去读 auto-discovery.json 里的 token,而是空 token 上报。要从本地配置取出 token,写进 systemd:

-t <NODE_TOKEN>

修完:

Basic info uploaded successfully
WebSocket connected

面板在线数才回来。这坑当时差点把我绕晕——参数删了更「干净」,上报却全 401。

坑 5:国内机下 GitHub Release 卡住#

某台国内云直连 GitHub 下 agent,下了几 MB 就不动。不等了,从已有 amd64 节点拷二进制:

已有 amd64 节点 /opt/komari-agent/agent
-> scp 到本地
-> scp 到下载困难的节点
-> chmod +x
-> 手动创建 systemd service

小规模自用很够用:单文件、架构一致就能搬。


常用命令#

面板:

cd /opt/komari
sudo docker compose ps
sudo docker compose logs -f
sudo docker stats komari

Nginx / 证书:

sudo nginx -t
sudo systemctl reload nginx
sudo certbot certificates

Agent:

systemctl is-active komari-agent
journalctl -u komari-agent -n 80 --no-pager
grep '^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 重启过程写在:

Komari 节点在线但数据全是 0:Server/Agent 版本漂移与 1.2.7 升级实录

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

搭建“黎明の鸡窝”
https://github.com/Dawn6666666/MyBlog
作者
黎明
发布于
2026-05-24 20:20:40
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录