Deploy to a DigitalOcean droplet: wizwar is on the internet

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>
This commit is contained in:
Eric Wagoner
2026-08-16 00:54:15 -04:00
co-authored by Claude Fable 5
parent 002dbd2547
commit 23bdd009a0
7 changed files with 145 additions and 3 deletions
+17
View File
@@ -0,0 +1,17 @@
[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