Home · Docs · On-site box

On-site box

One LAN IP. That is the product.

Displays poll this machine. Give it a DHCP reservation, keep it on, and do not forward port 8090 to the internet.

What you are installing

A Docker Compose stack: the Dutywall panel/renderer, optional MediaMTX for live cameras, and a data volume. It serves:

URLWho
http://<LAN-IP>:8090/Admin panel (browser login)
/playerReal screen: enroll code if it has no id
/player?demo=1Smoke test, no enroll
/roku-config.jsonWhat every display polls
/healthzstandalone or managed

Hardware

MinimumComfortable
CPU2 cores (x86_64 or Pi 4/5)4 cores if you remux YouTube or several cameras
RAM4 GB8 GB
Disk16 GBSSD; Pi prefers USB SSD over SD for the data volume
NetworkSame L2/L3 as the screensStatic DHCP lease for this host

Platform steps: Linux · Windows · Raspberry Pi · macOS

.env (every platform)

Copy .env.standalone.example to .env. The helper scripts fill the LAN IP; you still set a real panel password.

VariableWhat to put
DUTYWALL_BASE_URLhttp://<this-machine-LAN-IP>:8090, the address screens will use, not localhost
DUTYWALL_PANEL_USER / PASSWORDPanel login. Default password changeme is refused
DUTYWALL_LAT / LON / RADAR_SITEYour site. Radar is K + 3 letters (e.g. KMRX)
DUTYWALL_NWS_UAApp name + a real email; NWS requires it
DUTYWALL_ALERT_TOKENOptional long random string to enable the panic webhook
DUTYWALL_CLOUD_URL / SITE_ID / SITE_TOKENOptional. Paste from the cloud panel. Blank = air-gap

After it is up

curl -sS http://127.0.0.1:8090/healthz
# {"ok":true,"mode":"standalone"}  or  "managed" if cloud env is set

Open the panel, then enroll screens. Keep :8090 on the LAN only.

Live cameras

docker compose --profile camera up -d

Linux (including Pi as box) can use host networking, best for RTSP over VPN/WireGuard. Windows and macOS Docker Desktop publish MediaMTX ports instead; LAN cameras Docker can route to still work.

Air-gap

On a connected build machine: ./scripts/package-standalone.sh --with-image. Copy the tarball, docker load -i dutywall-image.tar, start compose without --build. Video, slideshows, panic, and enrollment work offline. NWS will not update without HTTPS to api.weather.gov.

Backup and upgrade

The volume dutywall-data is the site (inventory, media, schedules). Upgrade by replacing the files and docker compose up -d --build. The volume stays. Stop with docker compose down (volume is kept).