Self-Hosting LibreNMS with Docker Compose
What Is LibreNMS?
LibreNMS is a fully-featured network monitoring system that auto-discovers devices on your network via SNMP, CDP, LLDP, and other protocols. It monitors bandwidth, CPU, memory, disk, environmental sensors, and more across 1,500+ device types out of the box — switches, routers, firewalls, servers, printers, UPS units. It’s the self-hosted alternative to paid monitoring tools like PRTG, SolarWinds, and Datadog’s infrastructure monitoring.
Official site: librenms.org
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 2 GB of free RAM (4 GB+ for 50+ devices)
- 20 GB of free disk space
- Network access to devices you want to monitor (SNMP)
- A domain name (optional, for remote access)
Docker Compose Configuration
LibreNMS runs as a multi-container stack: the web interface, a dispatcher for SNMP polling, a database, and Redis for caching.
Create a project directory:
mkdir -p ~/librenms && cd ~/librenms
Create docker-compose.yml:
services:
librenms:
image: librenms/librenms:24.11.0
container_name: librenms
ports:
- "8000:8000"
volumes:
- librenms-data:/data
environment:
TZ: UTC
PUID: "1000"
PGID: "1000"
DB_HOST: mariadb
DB_PORT: "3306"
DB_NAME: librenms
DB_USER: librenms
DB_PASSWORD: change-this-password # CHANGE THIS
DB_TIMEOUT: "60"
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_DB: "0"
MEMORY_LIMIT: 256M
UPLOAD_MAX_SIZE: 16M
depends_on:
mariadb:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
dispatcher:
image: librenms/librenms:24.11.0
container_name: librenms-dispatcher
volumes:
- librenms-data:/data
environment:
TZ: UTC
PUID: "1000"
PGID: "1000"
DB_HOST: mariadb
DB_PORT: "3306"
DB_NAME: librenms
DB_USER: librenms
DB_PASSWORD: change-this-password # MUST MATCH above
DB_TIMEOUT: "60"
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_DB: "0"
SIDECAR_DISPATCHER: "1"
DISPATCHER_NODE_ID: dispatcher-1
depends_on:
mariadb:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
snmptrapd:
image: librenms/librenms:24.11.0
container_name: librenms-snmptrapd
ports:
- "162:162/udp"
volumes:
- librenms-data:/data
environment:
TZ: UTC
PUID: "1000"
PGID: "1000"
DB_HOST: mariadb
DB_PORT: "3306"
DB_NAME: librenms
DB_USER: librenms
DB_PASSWORD: change-this-password # MUST MATCH above
REDIS_HOST: redis
SIDECAR_SNMPTRAPD: "1"
depends_on:
- librenms
restart: unless-stopped
mariadb:
image: mariadb:10.11
container_name: librenms-db
environment:
MYSQL_ROOT_PASSWORD: change-root-password # CHANGE THIS
MYSQL_DATABASE: librenms
MYSQL_USER: librenms
MYSQL_PASSWORD: change-this-password # MUST MATCH above
volumes:
- librenms-db:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: librenms-redis
volumes:
- librenms-redis:/data
restart: unless-stopped
volumes:
librenms-data:
librenms-db:
librenms-redis:
Start the stack:
docker compose up -d
Wait 1–2 minutes for database initialization and schema creation.
Initial Setup
- Open
http://your-server-ip:8000in your browser - Create an admin account through the web UI
- Navigate to Devices → Add Device
- Enter your first device’s hostname or IP
- Set the SNMP community string (default is usually
public— change this on your devices) - LibreNMS will poll the device and auto-discover its interfaces, sensors, and metrics
Adding Devices via CLI
# Add a device with SNMP v2c
docker compose exec librenms lnms device:add 192.168.1.1 --v2c --community public
# Add with SNMP v3
docker compose exec librenms lnms device:add 192.168.1.1 --v3 --authlevel authPriv --authname user --authpass pass --cryptopass pass
Key Capabilities
| Feature | Details |
|---|---|
| Autodiscovery | SNMP, CDP, LLDP, OSPF, BGP, ARP-table scanning |
| Device support | 1,500+ device types (Cisco, Juniper, Ubiquiti, Arista, Dell, HP, Linux, Windows) |
| Metrics | Bandwidth, CPU, memory, disk, temperature, humidity, power draw |
| Alerting | 40+ transports: Slack, Discord, PagerDuty, Telegram, email, webhooks |
| Dashboards | Customizable with real-time graphs |
| API | Full REST API for automation |
| Maps | Automatic network topology maps |
| Weathermap | Visual bandwidth utilization maps |
| Syslog | Centralized syslog collection and alerting |
| SNMP traps | Receive and process device traps |
Configuration
SNMP Settings
Configure your network devices to allow SNMP polling from the LibreNMS server. At minimum:
- Enable SNMP v2c or v3 on each device
- Set a community string (v2c) or authentication credentials (v3)
- Allow SNMP traffic from the LibreNMS server IP
Alert Rules
LibreNMS includes default alert rules. Customize them at Alerts → Alert Rules. Common rules:
- Device down (no SNMP response)
- Interface utilization above threshold
- CPU/memory above threshold
- BGP session down
- Environmental sensor out of range
Alert Transports
Configure where alerts go at Alerts → Alert Transports. Popular options:
- Email (requires SMTP setup)
- Slack webhook
- Discord webhook
- Telegram bot
- PagerDuty
Reverse Proxy
LibreNMS serves on port 8000. Place it behind a reverse proxy for HTTPS:
server {
listen 443 ssl;
server_name librenms.yourdomain.com;
location / {
proxy_pass http://127.0.0.1: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 $scheme;
}
}
See the Reverse Proxy Setup guide for more options.
Backup
Back up these volumes:
- librenms-data — application data, RRD graphs, plugins
- librenms-db — MariaDB database (device configs, alert history)
docker compose stop
docker run --rm -v librenms-data:/data -v $(pwd):/backup alpine tar czf /backup/librenms-data.tar.gz -C /data .
docker run --rm -v librenms-db:/data -v $(pwd):/backup alpine tar czf /backup/librenms-db.tar.gz -C /data .
docker compose up -d
See the Backup Strategy guide.
Troubleshooting
Devices not being polled
Symptom: Devices show as added but graphs stay empty.
Fix: The dispatcher sidecar must be running. Check:
docker compose logs dispatcher
Look for “poller” messages. If the dispatcher isn’t running, polling doesn’t happen — the web container alone won’t poll devices.
Permission errors on /data volume
Symptom: Container fails to start with permission denied errors.
Fix: The /data volume ownership must match PUID:PGID values. Fix with:
docker compose exec librenms chown -R 1000:1000 /data
SNMP timeouts
Symptom: “SNMP transport: no response” when adding devices.
Fix: Verify SNMP is enabled on the target device. Test from the LibreNMS container:
docker compose exec librenms snmpget -v2c -c public 192.168.1.1 sysDescr.0
If this times out, the issue is network connectivity or SNMP configuration on the device, not LibreNMS.
Resource Requirements
| Scale | Devices | RAM | CPU | Disk |
|---|---|---|---|---|
| Homelab | 1–20 | 2 GB | 2 cores | 20 GB |
| Small business | 20–100 | 4 GB | 2–4 cores | 40 GB |
| Medium | 100–500 | 8–16 GB | 4–8 cores | 100 GB |
| Large | 500+ | 16–32 GB | 8+ cores | 200+ GB |
RRD graph storage is the main disk consumer. For 100 devices with 50 ports each, expect ~10 GB of RRD data after a month.
Verdict
LibreNMS is the most capable self-hosted network monitoring tool available. If you have managed switches, routers, or any SNMP-enabled infrastructure, LibreNMS gives you visibility that’s on par with commercial tools costing thousands per year. It’s overkill for monitoring a few Docker containers — use Uptime Kuma or Beszel for that. But for genuine network infrastructure monitoring, nothing self-hosted comes close.
Related
Get self-hosting tips in your inbox
New guides, comparisons, and setup tutorials — delivered weekly. No spam.