Customer-facing network dashboard powered by:
FastAPI backend (reads Observium data)React frontend (admin selector + customer dashboard view)Docker Compose deploymentThe dashboard is designed to sit behind your existing reverse proxy and HTTPS domain under /dashboard/.
frontend serves the app at /dashboard/api serves backend endpoints at /dashboard/api/*/data/rpc_dashboard.db (Docker volume)From docker-compose.yml:
api
rpc_dashboard_api127.0.0.1:18000 -> 8000/dashboard/apiapi_data:/datafrontend
rpc_dashboard_frontend127.0.0.1:18001 -> 80observium_default (external)edge (external)Set these in your compose environment (or .env used by compose):
OBS_DB_HOST (default: mariadb)OBS_DB_USER (default: observium)OBS_DB_PASSWORD (default: observium)OBS_DB_NAME (default: observium)OBS_DB_CONNECT_TIMEOUT (default: 5)OBS_TBL_DEVICES (default: devices)OBS_TBL_PORTS (default: ports)OBS_TBL_IPV4 (default: ipv4_addresses)ADMIN_TOKEN (required; no insecure default)SELECTION_DB_PATH is already set to /data/rpc_dashboard.db in compose/dashboard//dashboard/admin/devices/dashboard/apiX-Admin-Token: <ADMIN_TOKEN>customer query paramtoken query param (per-customer token stored with selection config)No customer can access another customer's data unless they have the correct customer token.
GET /dashboard/api/healthGET /dashboard/api/observium/devices?subnet=192.168.67.0/24sql_used and resolved table names for audit/debug (tables).device_id, hostname, sysName, location, first_matching_ip, matching_ips.GET /dashboard/api/admin/selection?customer=<customer_key>
X-Admin-TokenPUT /dashboard/api/admin/selection
X-Admin-Token{
"customer": "acme",
"display_name": "ACME",
"subnet": "192.168.67.0/24",
"selected_device_ids": [12, 45, 77],
"customer_token": "optional-custom-token"
}
If customer_token is omitted/blank:
GET /dashboard/api/customer/dashboard?customer=<customer_key>&token=<customer_token>/dashboard/admin/devicesAdmin token, Customer key, Display name, SubnetLoad devicesSave Selectioncustomer_token/dashboard/?customer=<customer_key>&token=<customer_token>Recommended sync sequence:
GET /dashboard/api/admin/selection?customer=<key> with X-Admin-TokenGET /dashboard/api/observium/devices?subnet=<cidr>PUT /dashboard/api/admin/selectionGET /dashboard/api/customer/dashboard?customer=<key>&token=<token>Current implementation reads Observium community edition data directly from DB tables:
devicesportsipv4_addressesIf Observium API availability changes, DB-query fallback remains usable.
# Health
curl -sS "https://client.resilientpathconsulting.net/dashboard/api/health"
# Discover devices in subnet
curl -sS "https://client.resilientpathconsulting.net/dashboard/api/observium/devices?subnet=192.168.67.0/24"
# Read customer selection (admin)
curl -sS \
-H "X-Admin-Token: YOUR_ADMIN_TOKEN" \
"https://client.resilientpathconsulting.net/dashboard/api/admin/selection?customer=acme"
# Save customer selection (admin)
curl -sS -X PUT \
-H "Content-Type: application/json" \
-H "X-Admin-Token: YOUR_ADMIN_TOKEN" \
-d '{"customer":"acme","display_name":"ACME","subnet":"192.168.67.0/24","selected_device_ids":[12,45]}' \
"https://client.resilientpathconsulting.net/dashboard/api/admin/selection"
# Customer dashboard data
curl -sS \
"https://client.resilientpathconsulting.net/dashboard/api/customer/dashboard?customer=acme&token=CUSTOMER_TOKEN"
Use .env.example as the starting point for .env values (especially ADMIN_TOKEN).