NodehouseDocs

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_PASSWORD for 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#

  1. Copy .env.example to .env.
  2. Set NODE_ENV=production and the SysOp password.
  3. Edit compose.yaml and replace the committed example values for NODEHOUSE_ALLOWED_ORIGINS, NODEHOUSE_PUBLIC_WEB_URL, NODEHOUSE_PUBLIC_TELNET_HOST, and NODEHOUSE_PUBLIC_TELNET_PORT. Those service-level values override matching entries in .env.
  4. Start with docker compose up -d --build.
  5. Route HTTPS to host port 8088 with WebSocket upgrades intact.
  6. 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