Production shape: one Node process serves the built client and the websocket on a single port (SPA fallback, same-origin wss in the client), with Caddy terminating auto-TLS in front. The droplet (nyc3, $6/mo) runs it under systemd as an unprivileged user with room files on the persistent disk at /var/lib/wizwar/rooms — deploys and reboots cannot eat a game. deploy/ carries the one-time droplet setup script, the systemd unit, the Caddyfile, an everyday deploy script (build locally, rsync, install, restart), and a README. Live at https://wizwar.104.236.96.198.sslip.io via sslip.io, so TLS needed no DNS setup at all. Verified over the real internet: room created, second player joined, expansion game started, hands dealt, room file persisted. Fixed en route: rsync's unanchored "data" exclude was stripping the engine's card database, and tsx must ship (it is the runtime). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
18 lines
378 B
Desktop File
18 lines
378 B
Desktop File
[Unit]
|
|
Description=Wiz-War game server
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=wizwar
|
|
WorkingDirectory=/opt/wizwar/packages/server
|
|
Environment=PORT=8787
|
|
Environment=WIZWAR_DATA_DIR=/var/lib/wizwar/rooms
|
|
Environment=WIZWAR_STATIC_DIR=/opt/wizwar/packages/web/dist
|
|
ExecStart=/usr/bin/npx tsx src/index.ts
|
|
Restart=always
|
|
RestartSec=3
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|