本文记录了一次基于 Docker 的 LibreNMS 实际部署过程,从系统时区、Docker 环境准备开始,…
这周在整理监控系统方案时,AI 给我推荐了一个工具—— LibreNMS。
评价很直接:一套完全开源免费的 IT 网络监控系统,功能全面,个人能用,企业也能用,对网络工程师、弱电工程师都比较友好。
从功能上看,LibreNMS 覆盖了网络运维中最常用的监控指标,包括服务器、交换机、路由器等设备的接口流量、CPU、内存、接口状态以及 Ping 可达性等。基本上日常排障和运行状态关注的内容,都可以在一个界面里看到。
比较有价值的是它的 Network Map(网络拓扑) 功能,可以自动识别设备之间的连接关系,并根据接口流量、状态变化实时变色。接口 UP / Down 一眼可见,排查问题时不需要在设备列表里反复翻,非常直观。
一、部署思路
快速上线、结构清晰、访问安全、后期维护成本低。
使用官方 Docker 镜像部署 LibreNMS
通过 Docker Compose 一键启动完整环境,避免手动安装依赖,结构清晰,升级也相对可控。
使用 Nginx 作为 TLS 反向代理
LibreNMS 默认是 HTTP 明文访问,账号密码在网络中是裸奔的。现在的网络环境里,各种流量分析设备很多,HTTPS 已经是最低要求。
宿主机只开放必要端口
只暴露访问和日志相关端口,其余全部关闭,避免容器被直接访问。
- 18000/tcp:LibreNMS Web(Nginx 反代)
- 514/udp:Syslog
- 162/udp:SNMP Trap
其余端口保持关闭,外部无法直接访问容器,整体安全性更可控。

二、基础环境准备
2.1 修改系统时区
提前修改系统时区,如果不修改后面安装 LibreNMS 时 cron 会因为时区不一致而报错。
timedatectl set-timezone Asia/Shanghai
2.2 Docker安装
确保Ubuntu系统有完整的 “根 CA 证书集合”ca-certificates存在,确保gnupg工具集合存在。
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release添加 Docker 官方 GPG key
为了安装 最新版的 Docker Engine,我们需要使用 Docker 官方软件源。
这个软件源不是 Ubuntu 默认信任的,必须先添加 Docker 的 GPG 公钥,让Ubuntu知道“这个来源可靠”。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg添加 Docker 仓库
给 Ubuntu 系统添加 Docker 官方的第三方软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新并安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin三、LibreNMS安装
① 创建 LibreNMS 工作目录
mkdir -p /opt/librenms
cd /opt/librenms② 下载 LibreNMS 官方 Docker 项目
官方把 Docker 部署模板放在 GitHub 上,我们直接下载 master 分支的 zip 包
wget https://github.com/librenms/docker/archive/refs/heads/master.zip
unzip master.zip解压以后会得到一个docker-master文件夹:
- examples/ 目录是我们需要的
- 其他文件主要用于构建官方镜像,用不上

③ 进入官方的 Compose 示例目录
cd /opt/librenms/docker-master/examples/compose
④ 修改.env
Docker Compose 的基础环境变量(数据库、时区等)
# -------------------------------
# LibreNMS Docker Compose 环境变量
# 官方示例修改为上海时间 + 容器安全用户
# -------------------------------
# 容器内时区,必须正确,否则日志和 RRD 图表时间会错
TZ=Asia/Shanghai
# 容器内运行 LibreNMS 的用户 UID / GID
# 官方示例使用 1000(非 root 安全模式)
# 即使宿主机没有 UID=1000 的用户也可以正常运行
PUID=1000
PGID=1000
# -------------------------------
# MariaDB 数据库初始化
# -------------------------------
# 创建的数据库名称
MYSQL_DATABASE=librenms
# 创建的数据库用户名
MYSQL_USER=librenms
# 数据库用户密码,请务必设置安全密码
MYSQL_PASSWORD=luoziwangluo⑤ 修改librenms.env
LibreNMS 主容器的设置(DB、Redis 等)
# -------------------------------
# LibreNMS 内部配置
# -------------------------------
# PHP 配置:中大型网络建议增加内存和 Opcache
MEMORY_LIMIT=1024M
MAX_INPUT_VARS=5000
UPLOAD_MAX_SIZE=64M
OPCACHE_MEM_SIZE=512
# 如果你使用 NGINX/Traefik 做 HTTPS 反代
REAL_IP_FROM=0.0.0.0/0
REAL_IP_HEADER=X-Forwarded-For
LOG_IP_VAR=remote_addr
# 缓存驱动,使用 Redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_HOST=redis
# SNMP 社区字符串
LIBRENMS_SNMP_COMMUNITY=luoziwangluo
# weathermap 插件配置
LIBRENMS_WEATHERMAP=true
LIBRENMS_WEATHERMAP_SCHEDULE=*/5 * * * *
APP_URL=https://192.168.3.9:18000⑥ 修改 msmtpd.env
发送报警邮件用的 SMTP 配置
# -------------------------------
# msmtpd 配置文件 - 使用 QQ 邮箱 SMTP
# -------------------------------
# QQ 邮箱 SMTP 服务器
SMTP_HOST=smtp.qq.com
# SMTP 端口,587=STARTTLS
SMTP_PORT=587
# 是否启用 TLS
SMTP_TLS=on
# 是否启用 STARTTLS
SMTP_STARTTLS=on
# 是否检查证书合法性
SMTP_TLS_CHECKCERT=on
# 是否需要账号密码认证
SMTP_AUTH=on
# SMTP 用户名(QQ 邮箱账号,不带 @qq.com)
SMTP_USER=你的QQ邮箱账号
# SMTP 授权码(注意:不是登录密码,需要在 QQ 邮箱设置获取授权码)
SMTP_PASSWORD=你的授权码
# 发件人地址(完整邮箱)
SMTP_FROM=你的QQ邮箱@qq.com⑦ 修改 compose.yml
官方打包好的完整服务编排文件
name: librenms
services:
db:
image: mariadb:10
container_name: librenms_db
command:
- "mysqld"
- "--innodb-file-per-table=1"
- "--lower-case-table-names=0"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
volumes:
- "./db:/var/lib/mysql"
environment:
- "TZ=${TZ}"
- "MARIADB_RANDOM_ROOT_PASSWORD=yes"
- "MYSQL_DATABASE=${MYSQL_DATABASE}"
- "MYSQL_USER=${MYSQL_USER}"
- "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
restart: always
redis:
image: redis:7.2-alpine
container_name: librenms_redis
environment:
- "TZ=${TZ}"
restart: always
msmtpd:
image: crazymax/msmtpd:latest
container_name: librenms_msmtpd
env_file:
- "./msmtpd.env"
restart: always
librenms:
image: librenms/librenms:latest
container_name: librenms
hostname: librenms
cap_add:
- NET_ADMIN
- NET_RAW
depends_on:
- db
- redis
- msmtpd
volumes:
- "./librenms:/data"
env_file:
- "./librenms.env"
environment:
- "TZ=${TZ}"
- "PUID=${PUID}"
- "PGID=${PGID}"
- "DB_HOST=db"
- "DB_NAME=${MYSQL_DATABASE}"
- "DB_USER=${MYSQL_USER}"
- "DB_PASSWORD=${MYSQL_PASSWORD}"
- "DB_TIMEOUT=60"
- "SESSION_SECURE_COOKIE=true"
restart: always
dispatcher:
image: librenms/librenms:latest
container_name: librenms_dispatcher
hostname: librenms-dispatcher
cap_add:
- NET_ADMIN
- NET_RAW
depends_on:
- librenms
- redis
volumes:
- "./librenms:/data"
env_file:
- "./librenms.env"
environment:
- "TZ=${TZ}"
- "PUID=${PUID}"
- "PGID=${PGID}"
- "DB_HOST=db"
- "DB_NAME=${MYSQL_DATABASE}"
- "DB_USER=${MYSQL_USER}"
- "DB_PASSWORD=${MYSQL_PASSWORD}"
- "DB_TIMEOUT=60"
- "DISPATCHER_NODE_ID=dispatcher1"
- "SIDECAR_DISPATCHER=1"
restart: always
syslogng:
image: librenms/librenms:latest
container_name: librenms_syslogng
hostname: librenms-syslogng
cap_add:
- NET_ADMIN
- NET_RAW
depends_on:
- librenms
- redis
ports:
- target: 514
published: 514
protocol: tcp
- target: 514
published: 514
protocol: udp
volumes:
- "./librenms:/data"
env_file:
- "./librenms.env"
environment:
- "TZ=${TZ}"
- "PUID=${PUID}"
- "PGID=${PGID}"
- "DB_HOST=db"
- "DB_NAME=${MYSQL_DATABASE}"
- "DB_USER=${MYSQL_USER}"
- "DB_PASSWORD=${MYSQL_PASSWORD}"
- "DB_TIMEOUT=60"
- "SIDECAR_SYSLOGNG=1"
restart: always
snmptrapd:
image: librenms/librenms:latest
container_name: librenms_snmptrapd
hostname: librenms-snmptrapd
cap_add:
- NET_ADMIN
- NET_RAW
depends_on:
- librenms
- redis
ports:
- target: 162
published: 162
protocol: tcp
- target: 162
published: 162
protocol: udp
volumes:
- "./librenms:/data"
env_file:
- "./librenms.env"
environment:
- "TZ=${TZ}"
- "PUID=${PUID}"
- "PGID=${PGID}"
- "DB_HOST=db"
- "DB_NAME=${MYSQL_DATABASE}"
- "DB_USER=${MYSQL_USER}"
- "DB_PASSWORD=${MYSQL_PASSWORD}"
- "DB_TIMEOUT=60"
- "SIDECAR_SNMPTRAPD=1"
restart: always⑧ 启动docker compose
docker /opt/librenms/docker-master/examples/compose/compose up -d
四、Nginx安装
LibreNMS 默认提供 HTTP 服务,请求内容在网络上传输时是明文的,账号密码被抓包看得清清楚楚。
为了避免这种风险,我在前面再挂一层 Nginx + TLS,把整个访问过程加密。
① 创建 Nginx 目录结构
主要包含:证书目录 + 配置目录
mkdir -p /opt/librenms/docker-master/examples/compose/librenms_nginx/certs
cd /opt/librenms/docker-master/examples/compose/librenms_nginx/certs② 生成自签证书(可用 10 年)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048
-keyout librenms.key
-out librenms.crt
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=LibreNMS/OU=IT/CN=librenms.local"生成后会得到:
- librenms.key(私钥)
- librenms.crt(证书)
③ 创建 Nginx 配置目录与配置文件
mkdir -p /opt/librenms/docker-master/examples/compose/librenms_nginx/conf
nano /opt/librenms/docker-master/examples/compose/librenms_nginx/conf/librenms.conf填入以下配置(反向代理到 LibreNMS 容器的 8000 端口):
server {
listen 18000 ssl;
server_name localhost;
ssl_certificate /etc/nginx/certs/librenms.crt;
ssl_certificate_key /etc/nginx/certs/librenms.key;
location / {
proxy_pass http://librenms:8000;
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 https;
proxy_set_header X-Forwarded-Port 18000;
proxy_redirect off;
}
}④ 查看默认网络名称(很重要)

⑤ 创建 Nginx 的 docker-compose.yml
nano /opt/librenms/docker-master/examples/compose/librenms_nginx/docker-compose.yml填入以下配置:
version: '3.9'
services:
nginx:
image: nginx:latest
container_name: librenms_nginx
restart: always
ports:
- "18000:18000"
environment:
TZ: Asia/Shanghai
volumes:
- /opt/librenms/docker-master/examples/compose/librenms_nginx/conf:/etc/nginx/conf.d
- /opt/librenms/docker-master/examples/compose/librenms_nginx/certs:/etc/nginx/certs
networks:
- librenms_default
networks:
librenms_default:
external: true- 18000 → HTTPS 访问入口
- 加入 librenms_default 网络 才能 proxy_pass 到 LibreNMS
⑥ 启动 Nginx 容器
docker compose -f /opt/librenms/docker-master/examples/compose/librenms_nginx/docker-compose.yml up -d
五、LibreNMS登录
启动成功后,即可通过:https://192.168.X.X:18000

这些命令我已经多次测试过,在正常环境中执行后,不应该出现报错,登录即可直接使用。如果有不完善的地方,也欢迎指出,系统层面我比较菜鸡,我会继续努力。
基于真实环境整理,如需进一步沟通相关需求,可通过页面右侧方式与我联系。