Docker 部署 Observium 网络监控

2025-06-25 00:12:06
This post is also available in English and alternative languages.

背景

为了实现对家中网络资产(比如路由/交换、AP、NAS 和打印机)的状态监控和告警,需要在 QNAP NAS 上搭建一套部署简易、低依赖的系统。这类轮子有很多:

  • Observium:功能强大,社区版(CE)半年更新一次,商业版好像也不贵。文档有点烂,部分内容对不上。
  • LibreNMS:是 Observium 的 fork,纯社区驱动(开源拖拉机)。文档也有点烂,部分内容对不上。
  • Zabbix:功能强大,太重。
  • Prometheus + Grafana:功能强大,太重。

在 LibreNMS 上折腾了 N 个小时,最终还是无法成功部署到 QTS,时间成本实在太高,果断放弃。最终方案如下:

五分钟部署

首先解决国内 DockerHub 的访问问题:修改 QNAP Container Station 的配置文件,指向局域网的 HTTP 代理。注意修改存储池 CACHEDEV1_DATA 为 Container Station 的安装位置。

1
/share/CACHEDEV1_DATA/.qpkg/container-station/script/run-docker.sh

根据实际情况修改下面内容,插入到文件末尾的 exec dockerd $DOCKER OPTS 上方。

1
2
3
export http_proxy="http://IP:PORT"
export https_proxy="http://IP:PORT"
export no_proxy= "localhost,127.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8"

重启 Container Station 使设置生效。

1
/etc/init.d/container-station.sh restart

随后创建容器网络,使得 Observium 和 MariaDB 可以通过 Docker 内部网络通信。

1
docker network create observium-net

按需修改数据库路径,使用下面的命令部署 MariaDB 数据库。

1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
--name=observiumdb \
--network observium-net \
-e PUID=1000 \
-e PGID=1000 \
-e MYSQL_ROOT_PASSWORD='observium' \
-e MYSQL_DATABASE='observium' \
-e MYSQL_USER='observium' \
-e MYSQL_PASSWORD='observium' \
-v /share/Public/observium/data:/config \
--restart unless-stopped \
lscr.io/linuxserver/mariadb:latest

按需修改下列命令,部署 Observium。考虑到 QTS Web UI 已经占用 TCP 8080,这里将 Observium bind 至 TCP 8000。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run -d \
--name observiumapp \
--network observium-net \
-v /share/Public/observium/logs:/opt/observium/logs \
-v /share/Public/observium/rrd:/opt/observium/rrd \
-e OBSERVIUM_ADMIN_USER=admin \
-e OBSERVIUM_ADMIN_PASS=admin \
-e OBSERVIUM_DB_HOST=observiumdb \ # MariaDB 容器名
-e OBSERVIUM_DB_USER=observium \
-e OBSERVIUM_DB_PASS=observium \
-e OBSERVIUM_DB_NAME=observium \
-e OBSERVIUM_BASE_URL=http://{IP}:{PORT} \ # 修改为外部访问地址及端口
-p {PORT}:80 \ # 映射至外部的端口,需要和 OBSERVIUM_BASE_URL 保持一致
--restart unless-stopped \
mbixtech/observium

建议使用 docker logs -f observiumapp 观察 Observium 是否正常启动。若一切正常,访问 http://NAS_IP:8000 即可进入 Observium 的 Web UI,添加设备进行监控。

SNMP 采集的数值存储在主机对应的 RRD 文件,Observium 全局配置均保存在数据库,且数据库连接参数采用环境变量注入。因此 Observium 容器不依赖任何文件形式的配置文件,比较干净,可以独立更新 Observium 和 MariaDB。

局限性和思考

SNMP 协议在实际中用的不多,也不被重视,所以不是所有厂商都能提供很好的支持:

  1. Aruba Instant 6.x 集群中每个 Instant AP 都支持 SNMP,但不支持 LLDP。统计信息仅局限于 AP 的资源占用,但不涉及 Wi-Fi 业务的统计。可能是故意阉割了此功能,以免影响 Aruba Central 的商业价值。
  2. ArubaOS 的 WLC 支持 SNMP 的 Wi-Fi 业务统计,但 Campus AP 不支持 SNMP
  3. Cisco Mobility Express 仅 vWLC 支持 SNMP 和 CDP,但 subordinate APs 不支持 SNMP。vWLC 可以 Wi-Fi 业务等信息,例如所有子节点的 radio 状态(频道、已连接设备数等)、uptime 和 model 等。但无法显示频道宽度、信道利用率等深层信息。
  4. QNAP/Synology NAS 支持 SNMP,但不支持 LLDP。
  5. 某些 HP DeskJet 设置中启用 SNMPv1/v2c,但仅能通过 SNMPv1 接入。

思考:

  1. Observium 的仪表盘只能看个全局 error/alert message,和 Grafana 差距太大,但内置的图表也能满足基本需求。
  2. Aruba Instant 的 MIB 定义与固件一起发布,可以在 HPE Networking Support 获取。但 Observium 添加 MIB 的流程实在是繁琐,还需要手搓 PHP。
  3. Observium 原则上仅支持 MySQL/MariaDB。如果能接入 Cloudflare D1 或者 PostgreSQL,可玩性会更高。

以 Aruba Instant 为例导入自定义 MIB

埋个坑,等有空再填––如果半年后还没更新,请发邮件催更。

注意

SNMP 业务基于 UDP,经常被滥用为 DDoS 反射攻击的载体,所以不建议向公网暴露 SNMP 服务。

Prev
2025-06-25 00:12:06