Files
wizwar6e/deploy/README.md
T
Eric WagonerandClaude Opus 5.5 811d5f84cb Wiz-War's host follows the hall's shared layout: its own Caddy site file, its own access log, a memory cap for a shared box
The host's Caddyfile gathers each game's site from /etc/caddy/sites/;
Wiz-War's is rendered from deploy/Caddyfile.tmpl and logs to
wizwar-access.log, which the rollup and the pulse read. The server's memory
cap drops from 700M to 350M (it runs in about 125M), so a runaway cannot
starve other games sharing the box. Applied on the live droplet with its
logs renamed in place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-29 12:37:06 -04:00

54 lines
2.4 KiB
Markdown

# Deploying Wiz-War
The game runs on a single DigitalOcean droplet: one Node process serves the
built client and the websocket on port 8787; Caddy in front terminates TLS
with automatic certificates. Room files persist in /var/lib/wizwar/rooms and
survive deploys and reboots.
## Current production
- Droplet: `wizwar` (nyc3, s-1vcpu-1gb, tag `wizwar`), IP 104.236.96.198
- URLs: https://wizwar.kestrelsnest.social
and https://wizwar.104.236.96.198.sslip.io (always works, zero DNS).
Caddy serves both; NOTE: kestrelsnest.social's authoritative DNS is at
HOVER (ns1/ns2.hover.com), not DigitalOcean — records must be added there.
A matching record also sits in the DO zone in case nameservers ever move.
## Everyday deploys
deploy/deploy.sh 104.236.96.198
Builds the client locally, rsyncs the repo (minus node_modules, data/, .git,
research), installs dependencies on the droplet, and restarts the service.
Games in progress survive: state lives in room files, and clients reconnect
automatically.
Before any deploy that touches the engine, run the determinism gate:
deploy/verify-ledgers.sh 104.236.96.198
It fetches every production ledger and strictly replays it against the local
engine; a single refused command fails the check. A room whose ledger no
longer replays becomes unreachable after restart, so this is not optional.
## New droplet from scratch
1. `doctl compute droplet create wizwar --region nyc3 --size s-1vcpu-1gb \
--image ubuntu-24-04-x64 --ssh-keys <your-key-ids> --tag-name wizwar --wait`
2. `scp deploy/setup-droplet.sh deploy/Caddyfile.tmpl root@<ip>:/root/ && ssh root@<ip> \
"bash /root/setup-droplet.sh 'wizwar.<ip>.sslip.io'"` (the host's Caddyfile
gathers each game's site from /etc/caddy/sites/, so the host can be shared)
3. `deploy/deploy.sh <ip>`
## Operations
- Logs: `ssh root@<ip> journalctl -u wizwar -f`
- Restart: `ssh root@<ip> systemctl restart wizwar`
- Nightly backups: `wizwar-backup.sh` runs from root's crontab at 07:17 UTC,
pushing /var/lib/wizwar to the `kestrel-wizwar-backups` Space (nyc3) via
rclone. It is installed at /usr/local/bin/wizwar-backup.sh on the droplet;
`setup-droplet.sh` does NOT install it — on a fresh droplet, copy the
script, configure rclone (the script refuses to run while the config still
holds its CHANGE_ME placeholder), and add the cron entry by hand.
- One-off backup: `scp -r root@<ip>:/var/lib/wizwar/rooms ./rooms-backup`