Production deployment#
Production requires persistent storage, HTTPS for the browser surface and a separate TCP route for Telnet.
Before you start#
- A strong
NODEHOUSE_SYSOP_PASSWORDfor the first boot. - Persistent storage for the database and file library.
- A reverse proxy and certificate for the web hostname.
- A direct TCP forwarding path if Telnet will be public.
- A recent backup and rollback image for upgrades.
Docker Compose#
- Copy
.env.exampleto.env. - Set
NODE_ENV=productionand the SysOp password. - Edit
compose.yamland replace the committed example values forNODEHOUSE_ALLOWED_ORIGINS,NODEHOUSE_PUBLIC_WEB_URL,NODEHOUSE_PUBLIC_TELNET_HOST, andNODEHOUSE_PUBLIC_TELNET_PORT. Those service-level values override matching entries in.env. - Start with
docker compose up -d --build. - Route HTTPS to host port 8088 with WebSocket upgrades intact.
- Route public TCP 23 directly to the Telnet listener if offered.
The Compose service mounts ./data and ./files. Do not replace them with an
ephemeral container filesystem.
Managed hosting#
Use one service replica because active nodes and session coordination are held
in the process. Mount a persistent volume at /app/data, set
NODEHOUSE_DB_PATH=/app/data/nodehouse.db, expose HTTP using the platform's
PORT, and configure a separate TCP service for Telnet.
Verify#
npm run smoke
Also verify the public /healthz, browser terminal, WebSocket connection and
Telnet banner from outside the host network. Sign in as SysOp and confirm recent
call data is written to the persistent database.
If it does not work#
| Symptom | Check | Recovery |
|---|---|---|
npm run smoke fails against the deployed host |
Whether it also fails locally | A local pass with a remote failure points at exposure, not the build |
Public /healthz is unreachable while local is fine |
The proxy and published ports | The service being up is not the same as it being reachable |
| The browser WebSocket is refused in production only | The site origin the deployment presents | See The browser loads but the terminal does not connect |
| Telnet is reachable from the public internet unintentionally | Which ports are actually published | Close it before announcing the board — see Security |
| The wrong database opened after an upgrade | The data path the new revision resolved | See The wrong database opened after an upgrade |