← all epics

Server instance

ops

repo: land-of-lor · depends on: server-architecture

Where this stands (2026-09-13)

The droplet has been live since 2026-08-02, behind HTTPS since 2026-08-04, and serving spellgrove.com since 2026-09-03. Decided (Q001, 2026-08-02): the credentials Kris supplies for provisioning, with its two scope gaps worked around. Reshaped by the 2026-09-13 security audit — two sandboxed service users, the DigitalOcean cloud firewall, daily database dumps, quiet-hours updates: ops/droplet/README.md is the box’s current shape, deliverable #4 the 2026-08 original. hello@spellgrove.com forwards to Kris through Namecheap; the box sends no mail yet. Open issues: epic:server-instance — #1 send-only mail from the box, for verification and password-reset emails from spellgrove.com. Past task files (to 2026-09-13): workshop/historic-docs/epics/server-instance/tasks/. The question file: workshop/historic-docs/epics/server-instance/questions/.

What this is

Getting an actual instance of the game server running somewhere reachable: hosting choice, deployment process, and environment separation (at minimum, a dev/staging environment distinct from whatever eventually serves real players).

Why it exists

server-architecture designs what the server is; this epic makes one exist and run. Given the December 2026 release target, there needs to be a real, iterable server environment well before launch — not just a local dev loop — so that client work (whichever engine is chosen) has something live to talk to.

Scope

Decided (2026-08-02 architecture conversation, written up as deliverable #4)

Hosting is chosen: a single DigitalOcean droplet. Ubuntu 24.04 LTS, Sydney region (syd1 — nearest DO region to Brisbane), 2 GB RAM / 1 vCPU regular droplet. Godot 4 headless world-server processes and a director service run on it under systemd, Postgres alongside, Caddy in front for TLS and WebSocket reverse-proxying. The complete, exact-commands runbook is deliverables/004-server-setup-guide.md — that document is this epic’s hosting decision, not a separate summary of it.

What’s not yet decided: the director service’s own runtime (Go vs. Node/TS, leaning Node) — tracked as server-architecture’s one remaining open question, not this epic’s. This epic can provision the box and run everything deliverable #4 describes regardless of which way that lands.

Done: provisioned via the DigitalOcean API (2026-08-02)

Kris wanted the droplet stood up by an agent calling the DO API directly — not by hand — using deliverable #4 as the executable spec. server-instance/001 did exactly that: lor-game-server-01 (209.38.29.22, syd1, 2 GB/1 vCPU) is live, hardened, and running Postgres, Godot 4.7.1 headless, Caddy, and systemd-managed lor-director/lor-world@1 units, verified end-to-end with a real WebSocket connection through Caddy to the world instance. Full provisioning record, deviations from the guide as written, and follow-ups (DO project assignment, git deploy credentials on the box, TLS once a domain exists) are in server-instance/001’s dated note, written up for external reading as deliverables/005-server-instance-live-and-how-to-deploy.md.

DNS (2026-08-04)

The game server has a hostname: lor-server.cocreations.com.au → A 209.38.29.22 (TTL 200). It’s a dev/server hostname only — it deliberately does not preempt naming-and-brand’s still-open public-domain question (Q002).

The cocreations.com.au zone is not managed at the domain’s registrar — its nameservers are iFastNet’s (ns101/ns201.ifastnet.com), and the zone is edited in Kris’s byethost cPanel: drawonthe.net:2083 → Zone Editor → cocreations.com.au. Kris added this record by hand on 2026-08-04; any future record changes happen there.

This hostname is what lets Caddy hold a real Let’s Encrypt certificate, which the Godot web client requires (web exports refuse to run outside a Secure Context — the plain-HTTP-on-bare-IP /play/ link failed in a real browser for exactly this reason).

Firewall, users, email (2026-09-13)

The security audit before the store launch reshaped the box: two unprivileged service users (lorgame for the director and the Areas, lorweb for the Builder and the site build), every unit sandboxed, a DigitalOcean cloud firewall beside ufw (22, 80, 443 and nothing else), daily database dumps, quiet-hours updates with an automatic reboot. The current shape of the box, and the script that applies it, is ops/droplet/README.md in the game repo — read that before touching the droplet; deliverable #4 below is the 2026-08 original, kept for the record. hello@spellgrove.com forwards to Kris through Namecheap; the box itself sends no mail yet (the send-only mail server for verification and reset emails is a task of its own).

Non-goals

Relevant docs

Deliverables (3)

Work on this epic

The granular work is GitHub Issues, one label per epic: epic:server-instance (private repository — sign-in required). The dated Where this stands section above names the open ones. The task files that carried this epic until 2026-09-13 are kept in the repo: task files to 2026-09-13 .

Ask an agent about this epic

    Also available as raw markdown.