Deploy Nomax (web app + relay) on any VPS with a single command. Optional HTTPS via Traefik and Let's Encrypt.
-
Copy the config and open
.env:cp .env.example .env nano .env
-
Disable Traefik: remove the line
COMPOSE_PROFILES=traefikor setCOMPOSE_PROFILES=. -
Start:
docker compose up -d
-
Done. Open in browser:
- web app:
http://server-IP:8080 - relay:
http://server-IP:4560
- web app:
-
Copy the config and open
.env:cp .env.example .env nano .env # or any editor -
Fill in three fields:
ACME_EMAIL— your email (for Let's Encrypt)CLIENT_HOST— web app domain (e.g.app.example.com)RELAY_HOST— relay domain (e.g.relay.example.com)
-
Configure DNS: create A records for
CLIENT_HOSTandRELAY_HOSTpointing to your VPS IP. Wait for DNS to propagate. -
Start:
docker compose up -d
-
Done. Open
https://your-CLIENT_HOSTin the browser.
| Mode | Needed |
|---|---|
| Without Traefik (option A) | Docker, Docker Compose v2; ports 4560 and 8080 open |
| With Traefik (option B) | Docker, Docker Compose v2; domains with A records on VPS; ports 80 and 443 open |
| Variable | Description | Example |
|---|---|---|
COMPOSE_PROFILES |
Enable Traefik: traefik. Empty — no Traefik. This is a Compose variable, read from .env automatically |
traefik |
ACME_EMAIL |
Email for Let's Encrypt (required with Traefik) | admin@example.com |
CLIENT_HOST |
Web app domain (for Traefik) | app.example.com |
RELAY_HOST |
Relay domain (for Traefik) | relay.example.com |
CLIENT_PORT |
Web app port on host (without Traefik) | 8080 |
RELAY_PORT |
Relay port on host (without Traefik) | 4560 |
TRAEFIK_HTTP_PORT |
Traefik HTTP port (if 80 is in use) | 80 |
TRAEFIK_HTTPS_PORT |
Traefik HTTPS port (if 443 is in use) | 443 |
Do not commit .env (already in .gitignore).
The Traefik service in docker-compose.yml has profiles: [traefik]. Such services do not start until the profile is active. The COMPOSE_PROFILES variable sets active profiles: without traefik, Compose does not create the Traefik container — only relay and client start.
- With Traefik: external access — ports 80 and 443 only. Relay and client still listen on
RELAY_PORTandCLIENT_PORT— useful for debugging; in production you can block them with a firewall. - Without Traefik: access only via
RELAY_PORTandCLIENT_PORT.
Certificates are stored in Docker volume traefik-acme. When changing domains or frequently recreating containers, respect Let's Encrypt rate limits. For testing you can use the staging server.