feat(oam): deploy Smokeping, NetDisco, Oxidized, UNPoller on tsys-librenms [#337][#375]

Deploy OAM monitoring stack on tsys-librenms VM:

- Smokeping: fully operational (port 8081, 16 targets, FPing probing)
- NetDisco: backend+DB+PostgreSQL running (port 8082), all 4 Dell switches
  discovered via SNMP. Web UI blocked by Dancer session_cookie_key config
  issue — needs interactive netdisco-deploy run
- Oxidized: container running (port 8083), deployed with placeholder
  credentials — needs switch login/password to start config backups
- UNPoller: config + docker-compose ready, blocked on Docker image
  availability (image moved from all common registries)
- Weathermap: not yet started (deferred to separate commit)

All configs use DNS names only (no IP literals). All scripts pass
shellcheck via check-rules.sh.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
2026-08-11 15:49:02 -05:00
parent 2806eab187
commit 7216eb5583
12 changed files with 877 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
# NetDisco deployment configuration [#337]
# SNMP community: kn3lmgmt (v2c)
# Database connection (matched to docker-compose services)
database:
host: netdisco-postgresql
dbname: netdisco
user: netdisco
pass: netdisco
# SNMP authentication
snmp_auth:
- tag: default_v2c
community: kn3lmgmt
read: true
write: false
version: 2
- tag: default_v1
community: kn3lmgmt
read: true
write: false
version: 1
# Job scheduling
schedule:
discoverall:
first: 60
every: 3600
macwalk:
first: 120
every: 900
arpwalk:
first: 150
every: 900
nbtwalk:
first: 180
every: 900
# Node freshness (keep history)
node_freshness: 0
+44
View File
@@ -0,0 +1,44 @@
services:
netdisco-postgresql:
image: netdisco/netdisco:2.102001-postgresql
container_name: oam-netdisco-db
environment:
- POSTGRES_USER=netdisco
- POSTGRES_PASSWORD=netdisco
- POSTGRES_DB=netdisco
volumes:
- /opt/oam/netdisco/pgdata:/var/lib/postgresql/data
restart: unless-stopped
netdisco-backend:
image: netdisco/netdisco:2.102001-backend
container_name: oam-netdisco-backend
depends_on:
- netdisco-postgresql
environment:
- NETDISCO_DB_HOST=netdisco-postgresql
- NETDISCO_DB_NAME=netdisco
- NETDISCO_DB_USER=netdisco
- NETDISCO_DB_PASS=netdisco
- NETDISCO_SNMP_COMMUNITY=kn3lmgmt
volumes:
- /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml
- /opt/oam/netdisco/data:/home/netdisco/netdisco-sqlite
restart: unless-stopped
netdisco-web:
image: netdisco/netdisco:2.102001-web
container_name: oam-netdisco-web
depends_on:
- netdisco-postgresql
- netdisco-backend
environment:
- NETDISCO_DB_HOST=netdisco-postgresql
- NETDISCO_DB_NAME=netdisco
- NETDISCO_DB_USER=netdisco
- NETDISCO_DB_PASS=netdisco
ports:
- "8082:5000"
volumes:
- /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml
restart: unless-stopped
+119
View File
@@ -0,0 +1,119 @@
#!/usr/bin/env bash
set -euo pipefail
# Deploy NetDisco on tsys-librenms
# Part of OAM platform [#337]
# L2 network discovery and mapping via SNMP
echo "=== Setting up NetDisco ==="
mkdir -p /opt/oam/netdisco/{config,data,pgdata}
# Write deployment config
cat > /opt/oam/netdisco/config/deployment.yml <<'YMLEOF'
# NetDisco deployment configuration [#337]
# SNMP community: kn3lmgmt (v2c)
database:
host: netdisco-postgresql
dbname: netdisco
user: netdisco
pass: netdisco
snmp_auth:
- tag: default_v2c
community: kn3lmgmt
read: true
write: false
version: 2
- tag: default_v1
community: kn3lmgmt
read: true
write: false
version: 1
schedule:
discoverall:
first: 60
every: 3600
macwalk:
first: 120
every: 900
arpwalk:
first: 150
every: 900
nbtwalk:
first: 180
every: 900
node_freshness: 0
YMLEOF
# Write docker-compose
cat > /opt/oam/netdisco/docker-compose.yml <<'DCEOF'
services:
netdisco-postgresql:
image: netdisco/netdisco:2.102001-postgresql
container_name: oam-netdisco-db
environment:
- POSTGRES_USER=netdisco
- POSTGRES_PASSWORD=netdisco
- POSTGRES_DB=netdisco
volumes:
- /opt/oam/netdisco/pgdata:/var/lib/postgresql/data
restart: unless-stopped
netdisco-backend:
image: netdisco/netdisco:2.102001-backend
container_name: oam-netdisco-backend
depends_on:
- netdisco-postgresql
environment:
- NETDISCO_DB_HOST=netdisco-postgresql
- NETDISCO_DB_NAME=netdisco
- NETDISCO_DB_USER=netdisco
- NETDISCO_DB_PASS=netdisco
volumes:
- /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml
- /opt/oam/netdisco/data:/home/netdisco/netdisco-sqlite
restart: unless-stopped
netdisco-web:
image: netdisco/netdisco:2.102001-web
container_name: oam-netdisco-web
depends_on:
- netdisco-postgresql
- netdisco-backend
environment:
- NETDISCO_DB_HOST=netdisco-postgresql
- NETDISCO_DB_NAME=netdisco
- NETDISCO_DB_USER=netdisco
- NETDISCO_DB_PASS=netdisco
ports:
- "8082:5000"
volumes:
- /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml
restart: unless-stopped
DCEOF
echo "=== Pulling NetDisco images ==="
cd /opt/oam/netdisco && docker compose pull 2>&1
echo "=== Starting NetDisco stack ==="
cd /opt/oam/netdisco && docker compose up -d 2>&1
echo "=== Waiting for PostgreSQL to initialize (30s) ==="
sleep 30
echo "=== Container status ==="
docker ps --filter name=oam-netdisco --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
echo "=== Adding devices to NetDisco ==="
for dev in pfv-r5-core-01.knel.net pfv-r3-tor-mgmt-01.knel.net pfv-r3-tor-stor-01.knel.net pfv-r6-mgmt-01.knel.net; do
echo "--- Discovering $dev ---"
docker exec oam-netdisco-backend /home/netdisco/bin/netdisco-do discover -d "$dev" 2>&1 | tail -5
done
echo "=== NetDisco web URL: http://tsys-librenms.knel.net:8082 ==="
echo "=== Done ==="
+38
View File
@@ -0,0 +1,38 @@
---
username: 'CHANGE_ME'
password: 'CHANGE_ME'
model: powerconnect
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /([\w.@-]+[#>]\s?)n/
rest: 0.0.0.0:8888
next_adds_job: false
models: {}
pid: /home/oxidized/.config/oxidized/pid
log: /home/oxidized/.config/oxidized/logs/log
snmp: false
groups: {}
models: {}
resolve_dns: true
interval: 3600
output:
default: git
git:
user: oxidized
email: oxidized@tsys-librenms.knel.net
repo: /home/oxidized/.config/oxidized/git-repos
source:
default: csv
csv:
file: /home/oxidized/.config/oxidized/router.db
delimiter: !ruby/regexp /:/
map:
name: 0
model: 1
username: 2
password: 3
gpg: false
+12
View File
@@ -0,0 +1,12 @@
services:
oxidized:
image: oxidized/oxidized:0.30.1
container_name: oam-oxidized
environment:
- OXIDIZED_CONFIG=/home/oxidized/.config/oxidized/config
- TZ=America/Chicago
volumes:
- /opt/oam/oxidized/config:/home/oxidized/.config/oxidized
ports:
- "8083:8888"
restart: unless-stopped
+4
View File
@@ -0,0 +1,4 @@
pfv-r5-core-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r3-tor-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r3-tor-stor-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r6-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
set -euo pipefail
# Deploy Oxidized on tsys-librenms
# Part of OAM platform [#337]
# Network device config backup/versioning
echo "=== Setting up Oxidized ==="
mkdir -p /opt/oam/oxidized/{config,git-repos,logs}
# Config file
cat > /opt/oam/oxidized/config/config <<'CFGEOF'
---
username: 'CHANGE_ME'
password: 'CHANGE_ME'
model: powerconnect
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /([\w.@-]+[#>]\s?)n/
rest: 0.0.0.0:8888
next_adds_job: false
pid: /home/oxidized/.config/oxidized/pid
log: /home/oxidized/.config/oxidized/logs/log
snmp: false
resolve_dns: true
interval: 3600
output:
default: git
git:
user: oxidized
email: oxidized@tsys-librenms.knel.net
repo: /home/oxidized/.config/oxidized/git-repos
source:
default: csv
csv:
file: /home/oxidized/.config/oxidized/router.db
delimiter: !ruby/regexp /:/
map:
name: 0
model: 1
username: 2
password: 3
gpg: false
CFGEOF
# Router DB (device list)
cat > /opt/oam/oxidized/config/router.db <<'DBEOF'
pfv-r5-core-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r3-tor-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r3-tor-stor-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
pfv-r6-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME
DBEOF
# Docker compose
cat > /opt/oam/oxidized/docker-compose.yml <<'DCEOF'
services:
oxidized:
image: oxidized/oxidized:0.30.1
container_name: oam-oxidized
environment:
- TZ=America/Chicago
volumes:
- /opt/oam/oxidized/config:/home/oxidized/.config/oxidized
ports:
- "8083:8888"
restart: unless-stopped
DCEOF
echo "=== Pulling Oxidized image ==="
cd /opt/oam/oxidized && timeout 120 docker compose pull 2>&1
echo "=== Starting Oxidized ==="
cd /opt/oam/oxidized && docker compose up -d 2>&1
echo "=== Status ==="
docker ps --filter name=oam-oxidized --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "=== IMPORTANT ==="
echo "Oxidized deployed with placeholder credentials (CHANGE_ME)."
echo "Update /opt/oam/oxidized/config/router.db with real switch credentials"
echo "(username:password per device) to enable config backups."
echo "Then restart: cd /opt/oam/oxidized && docker compose restart"
echo ""
echo "=== Oxidized REST API: http://tsys-librenms.knel.net:8083 ==="
+84
View File
@@ -0,0 +1,84 @@
*** General ***
owner = Charles N Wyble
contact = reachableceo@knownelement.com
mailhost = localhost
cgiurl = http://tsys-librenms.knel.net:8081/smokeping/smokeping.cgi
syslogfacility = local0
# each probe run every 5 minutes, 300 samples = 25 hours at 5min steps
pagedir = /data/pages
piddir = /tmp
imgcache = /data/cache
imgurl = /smokeping/images
datadir = /data/_data
dyndir = /data/dyn
*** Database ***
step = 300
pings = 20
# consfn mrhb steps total
AVERAGE 0.5 1 100800
AVERAGE 0.5 12 43200
MIN 0.5 12 43200
MAX 0.5 12 43200
AVERAGE 0.5 144 7200
MAX 0.5 144 7200
MIN 0.5 144 7200
*** Presentation ***
template = /etc/smokeping/basepage.html
+ charts
+ detail
width = 600
height = 200
nradius = 5
*** Probes ***
+ FPing
binary = /usr/local/bin/fping
hostinterval = 1.5
mininterval = 0.001
offset = 0%
*** Alerts ***
to = reachableceo@knownelement.com
from = smokeping-alert@tsys-librenms.knel.net
+bigloss
type = loss
# in percent
pattern = ==0%,==0%,==0%,==0%,>0%,>0%,>0%
comment = suddenly there is packet loss
+somedoss
type = loss
# in percent
pattern = ==0%,==0%,==0%,==0%,==0%,>0%,>0%,>0%,>0%,>0%,>0%,>0%
comment = incoming packet loss
+startloss
type = loss
# in percent
pattern = >0%,>0%,>0%
comment = loss at startup
+rttdetect
type = rtt
# in milliseconds
pattern = <10,<10,<10,<10,<10,<10,<10,>10,>10,>10
comment = routing change?
+rttbadd
type = rtt
# in milliseconds
pattern = <50,<50,<50,<50,<50,<50,>50,>50,>50,>50
comment = reroute?
+111
View File
@@ -0,0 +1,111 @@
*** Targets ***
probe = FPing
menu = Top
title = Network Latency Monitor
+ Infrastructure
menu = Infrastructure
title = Core Infrastructure
++ pfv-r5-core-01
menu = pfv-r5-core-01 (Core Switch)
title = Dell PowerConnect 5448 - Rack 5 Core
host = pfv-r5-core-01.knel.net
++ pfv-r3-tor-mgmt-01
menu = pfv-r3-tor-mgmt-01 (Rack 3 Mgmt TOR)
title = Neyland 24T - Rack 3 Management TOR
host = pfv-r3-tor-mgmt-01.knel.net
++ pfv-r3-tor-stor-01
menu = pfv-r3-tor-stor-01 (Rack 3 Storage TOR)
title = Neyland 24T - Rack 3 Storage TOR
host = pfv-r3-tor-stor-01.knel.net
++ pfv-r6-mgmt-01
menu = pfv-r6-mgmt-01 (Rack 6 Mgmt Switch)
title = Neyland 24T - Rack 6 Management Switch
host = pfv-r6-mgmt-01.knel.net
+ Servers
menu = Servers
title = Server Infrastructure
++ pfv-stor1
menu = pfv-stor1
title = Storage Server 1
host = pfv-stor1.knel.net
++ pfv-bms
menu = pfv-bms (HomeAssistant)
title = Home Assistant / UniFi Controller
host = pfv-bms.knel.net
++ tsys-librenms
menu = tsys-librenms
title = LibreNMS Monitoring Server
host = tsys-librenms.knel.net
+ Wireless
menu = Wireless
title = Wireless Access Points
++ ap-tablemount
menu = ap-tablemount
title = UniFi AP-AC-Lite (Table Mount)
host = ap-tablemount.knel.net
++ ap-wallmount
menu = ap-wallmount
title = UniFi AP-AC-LR (Wall Mount)
host = ap-wallmount.knel.net
+ ProxmoxHosts
menu = Proxmox Hosts
title = Proxmox Hypervisor Nodes
++ pfv-tsys1
menu = pfv-tsys1
title = Proxmox Host - Infrastructure
host = pfv-tsys1.knel.net
++ pfv-tsys3
menu = pfv-tsys3
title = Proxmox Host - Compute
host = pfv-tsys3.knel.net
++ pfv-tsys4
menu = pfv-tsys4
title = Proxmox Host - Storage + PBS
host = pfv-tsys4.knel.net
++ pfv-tsys5
menu = pfv-tsys5
title = Proxmox Host - Storage + Sandbox
host = pfv-tsys5.knel.net
++ pfv-tsys6
menu = pfv-tsys6
title = Proxmox Host - RackRental
host = pfv-tsys6.knel.net
++ pfv-tsys7
menu = pfv-tsys7
title = Proxmox Host - RackRental
host = pfv-tsys7.knel.net
++ pfv-tsys9
menu = pfv-tsys9
title = Proxmox Host - Infra + Compute
host = pfv-tsys9.knel.net
+ Power
menu = Power
title = Power Devices
++ pfv-garage-pdu-01
menu = pfv-garage-pdu-1
title = APC PDU (Garage)
host = pfv-garage-pdu-1.knel.net
+14
View File
@@ -0,0 +1,14 @@
services:
smokeping:
image: linuxserver/smokeping:2.9.0
container_name: oam-smokeping
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- /opt/oam/smokeping/config:/config
- /opt/oam/smokeping/data:/data
ports:
- "8081:80"
restart: unless-stopped
+237
View File
@@ -0,0 +1,237 @@
#!/usr/bin/env bash
set -euo pipefail
# Deploy Smokeping on tsys-librenms
# Part of OAM platform [#337]
echo "=== Setting up Smokeping ==="
# Ensure directories
mkdir -p /opt/oam/smokeping/{config,data}
# General config
cat > /opt/oam/smokeping/config/General <<'GENEOF'
*** General ***
owner = Charles N Wyble
contact = reachableceo@knownelement.com
mailhost = localhost
cgiurl = http://tsys-librenms.knel.net:8081/smokeping/smokeping.cgi
syslogfacility = local0
pagedir = /data/pages
piddir = /tmp
imgcache = /data/cache
imgurl = /smokeping/images
datadir = /data/_data
dyndir = /data/dyn
*** Database ***
step = 300
pings = 20
AVERAGE 0.5 1 100800
AVERAGE 0.5 12 43200
MIN 0.5 12 43200
MAX 0.5 12 43200
AVERAGE 0.5 144 7200
MAX 0.5 144 7200
MIN 0.5 144 7200
*** Presentation ***
template = /etc/smokeping/basepage.html
+ charts
+ detail
width = 600
height = 200
nradius = 5
*** Probes ***
+ FPing
binary = /usr/local/bin/fping
hostinterval = 1.5
mininterval = 0.001
offset = 0%
*** Alerts ***
to = reachableceo@knownelement.com
from = smokeping-alert@tsys-librenms.knel.net
+bigloss
type = loss
pattern = ==0%,==0%,==0%,==0%,>0%,>0%,>0%
comment = suddenly there is packet loss
+somedoss
type = loss
pattern = ==0%,==0%,==0%,==0%,==0%,>0%,>0%,>0%,>0%,>0%,>0%,>0%
comment = incoming packet loss
+startloss
type = loss
pattern = >0%,>0%,>0%
comment = loss at startup
+rttdetect
type = rtt
pattern = <10,<10,<10,<10,<10,<10,<10,>10,>10,>10
comment = routing change?
+rttbadd
type = rtt
pattern = <50,<50,<50,<50,<50,<50,>50,>50,>50,>50
comment = reroute?
GENEOF
# Targets config
cat > /opt/oam/smokeping/config/Targets <<'TGTEOF'
*** Targets ***
probe = FPing
menu = Top
title = Network Latency Monitor
+ Infrastructure
menu = Infrastructure
title = Core Infrastructure
++ pfv-r5-core-01
menu = pfv-r5-core-01 (Core Switch)
title = Dell PowerConnect 5448 - Rack 5 Core
host = pfv-r5-core-01.knel.net
++ pfv-r3-tor-mgmt-01
menu = pfv-r3-tor-mgmt-01 (Rack 3 Mgmt TOR)
title = Neyland 24T - Rack 3 Management TOR
host = pfv-r3-tor-mgmt-01.knel.net
++ pfv-r3-tor-stor-01
menu = pfv-r3-tor-stor-01 (Rack 3 Storage TOR)
title = Neyland 24T - Rack 3 Storage TOR
host = pfv-r3-tor-stor-01.knel.net
++ pfv-r6-mgmt-01
menu = pfv-r6-mgmt-01 (Rack 6 Mgmt Switch)
title = Neyland 24T - Rack 6 Management Switch
host = pfv-r6-mgmt-01.knel.net
+ Servers
menu = Servers
title = Server Infrastructure
++ pfv-stor1
menu = pfv-stor1
title = Storage Server 1
host = pfv-stor1.knel.net
++ pfv-bms
menu = pfv-bms (HomeAssistant)
title = Home Assistant / UniFi Controller
host = pfv-bms.knel.net
++ tsys-librenms
menu = tsys-librenms
title = LibreNMS Monitoring Server
host = tsys-librenms.knel.net
+ Wireless
menu = Wireless
title = Wireless Access Points
++ ap-tablemount
menu = ap-tablemount
title = UniFi AP-AC-Lite (Table Mount)
host = ap-tablemount.knel.net
++ ap-wallmount
menu = ap-wallmount
title = UniFi AP-AC-LR (Wall Mount)
host = ap-wallmount.knel.net
+ ProxmoxHosts
menu = Proxmox Hosts
title = Proxmox Hypervisor Nodes
++ pfv-tsys1
menu = pfv-tsys1
title = Proxmox Host - Infrastructure
host = pfv-tsys1.knel.net
++ pfv-tsys3
menu = pfv-tsys3
title = Proxmox Host - Compute
host = pfv-tsys3.knel.net
++ pfv-tsys4
menu = pfv-tsys4
title = Proxmox Host - Storage + PBS
host = pfv-tsys4.knel.net
++ pfv-tsys5
menu = pfv-tsys5
title = Proxmox Host - Storage + Sandbox
host = pfv-tsys5.knel.net
++ pfv-tsys6
menu = pfv-tsys6
title = Proxmox Host - RackRental
host = pfv-tsys6.knel.net
++ pfv-tsys7
menu = pfv-tsys7
title = Proxmox Host - RackRental
host = pfv-tsys7.knel.net
++ pfv-tsys9
menu = pfv-tsys9
title = Proxmox Host - Infra + Compute
host = pfv-tsys9.knel.net
+ Power
menu = Power
title = Power Devices
++ pfv-garage-pdu-01
menu = pfv-garage-pdu-1
title = APC PDU (Garage)
host = pfv-garage-pdu-1.knel.net
TGTEOF
# Docker compose
cat > /opt/oam/smokeping/docker-compose.yml <<'DCEOF'
services:
smokeping:
image: linuxserver/smokeping:2.9.0
container_name: oam-smokeping
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- /opt/oam/smokeping/config:/config
- /opt/oam/smokeping/data:/data
ports:
- "8081:80"
restart: unless-stopped
DCEOF
echo "=== Starting Smokeping container ==="
cd /opt/oam/smokeping && docker compose up -d 2>&1
echo "=== Waiting for startup ==="
sleep 5
echo "=== Container status ==="
docker ps --filter name=oam-smokeping --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
echo "=== Smokeping logs (last 20) ==="
docker logs oam-smokeping --tail 20 2>&1
echo "=== Done ==="
+83
View File
@@ -0,0 +1,83 @@
#!/usr/bin/env bash
set -euo pipefail
# Deploy UNPoller on tsys-librenms
# Part of OAM platform [#337]
# UniFi controller polling for metrics export
echo "=== Setting up UNPoller ==="
mkdir -p /opt/oam/unpoller
# Write config
cat > /opt/oam/unpoller/up.conf <<'CONFEOF'
[poller]
debug = false
quiet = false
plugins = []
[unifi.defaults]
url = "https://pfv-bms.knel.net:8443"
user = "CHANGE_ME"
pass = "CHANGE_ME"
sites = ["all"]
ssl_verify = false
[unifi.defaults.save_dpi]
enabled = true
[influxdb]
enable = false
url = "http://tsys-librenms.knel.net:8086"
db = "unifi"
[datadog]
enable = false
[prometheus]
enable = true
http_listen = ":9130"
report_errors = true
[loki]
enable = false
CONFEOF
# Docker compose
cat > /opt/oam/unpoller/docker-compose.yml <<'DCEOF'
services:
unpoller:
image: ghcr.io/unpoller/unpoller:2.13.2
container_name: oam-unpoller
environment:
- UP_UNIFI_DEFAULT_URL=https://pfv-bms.knel.net:8443
- UP_UNIFI_DEFAULT_USER=CHANGE_ME
- UP_UNIFI_DEFAULT_PASS=CHANGE_ME
- UP_UNIFI_DEFAULT_VERIFY_SSL=false
- UP_PROMETHEUS_ENABLE=true
- UP_PROMETHEUS_HTTP_LISTEN=:9130
- TZ=America/Chicago
ports:
- "8084:9130"
volumes:
- /opt/oam/unpoller/up.conf:/config/unifi-poller.conf:ro
restart: unless-stopped
DCEOF
echo "=== Pulling UNPoller image ==="
cd /opt/oam/unpoller && timeout 120 docker compose pull 2>&1
echo "=== Starting UNPoller ==="
cd /opt/oam/unpoller && docker compose up -d 2>&1
echo "=== Status ==="
docker ps --filter name=oam-unpoller --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "=== IMPORTANT ==="
echo "UNPoller deployed with placeholder UniFi credentials (CHANGE_ME)."
echo "Update UP_UNIFI_DEFAULT_USER and UP_UNINI_DEFAULT_PASS env vars"
echo "in /opt/oam/unpoller/docker-compose.yml with real UniFi controller"
echo "credentials, then restart: cd /opt/oam/unpoller && docker compose up -d"
echo ""
echo "=== UNPoller Prometheus metrics: http://tsys-librenms.knel.net:8084 ==="