Docker compose is the recommended way to deploy:
git clone https://github.com/accius/openhamclock.git
cd openhamclock
docker compose up -dor you can also use traditional docker commands:
docker run -d -p 3000:3000 --name openhamclock ghcr.io/accius/openhamclock:latestThis will pull the latest container image and start the OpenHamClock container
Open http://localhost:3000 — that's it. OpenHamClock runs with sensible defaults.
Copy the quick-start env file and edit it:
cp stack.env.example stack.envSet your callsign, grid square, and timezone:
CALLSIGN=K0CJH
LOCATOR=FN20
TZ=America/New_York
TZis optional — if omitted, each visitor's browser timezone is used for the local-time display. Setting it is still recommended so that server-side timestamps (logs, cache TTLs, etc.) match your local time.
Restart to apply:
docker compose down && docker compose up -dTip:
stack.envcontains only the essentials. For the full list of 50+ options (WSJT-X, N1MM, weather APIs, DX cluster, propagation, etc.), see.env.example.
If deploying via Portainer:
- Paste the
docker-compose.ymlcontents into a new Stack - Use the Environment tab to add variables from
stack.env.example - Or upload
stack.envin the env file section
The compose file loads both stack.env and .env automatically (both optional).
| Port | Protocol | Service |
|---|---|---|
| 3000 | TCP | Web UI |
| 2237 | UDP | WSJT-X / JTDX |
| 12060 | UDP | N1MM / DXLog contest logger |
To change the web UI port on the host:
ports:
- '8080:3000' # Access at http://localhost:8080If running behind nginx/Caddy/Traefik, you may want to override the health check endpoint:
HEALTH_ENDPOINT=http://localhost:3000/api/healthTo persist stats and settings across container rebuilds you can either use volumes or bind mounts
services:
openhamclock:
volumes:
- ohc-data:/data
volumes:
ohc-data:services:
openhamclock:
volumes:
- ./ohc-data:/dataPull the latest image:
# If using compose
docker compose pull
# If using plain docker cli
docker pull ghcr.io/accius/openhamclock:latestor build from the main branch:
git pull
docker compose build --no-cachethen restart container with latest image:
# If using compose
docker compose up -d
# If using plain docker cli
docker rm -f openhamclock
docker run -d -p 3000:3000 --name openhamclock ghcr.io/accius/openhamclock:latestOpenHamClock reads configuration from multiple sources. Later sources override earlier ones:
- Built-in defaults (in
config.jsandserver.js) stack.envfile (loaded by docker-compose, optional).envfile (loaded by docker-compose, optional)environment:block indocker-compose.yml- UI settings (saved in browser or via Settings Sync)
See .env.example for the complete list with descriptions. Key sections:
- Station Info —
CALLSIGN,LOCATOR,LATITUDE,LONGITUDE - Display —
THEME,UNITS,TIME_FORMAT,LAYOUT - Features —
SHOW_POTA,SHOW_SATELLITES,SHOW_DX_PATHS - DX Cluster —
DX_CLUSTER_SOURCE,SPOT_RETENTION_MINUTES - WSJT-X —
WSJTX_ENABLED,WSJTX_UDP_PORT,WSJTX_RELAY_KEY - N1MM —
N1MM_UDP_ENABLED,N1MM_UDP_PORT - Weather —
OPENWEATHER_API_KEY,VITE_AMBIENT_* - Advanced —
ITURHFPROP_URL,HEALTH_ENDPOINT,CORS_ORIGINS
You can also self-host other microservices, check their respective documentation for details: