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
54 lines
2.4 KiB
Markdown
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`
|