Files
DorkNet/docs/advanced-setup.md
T
Alexa d1cc50622b main: branch-aware README + BRANCHES.md + versions.json
Rewrites main as a docs-only landing branch. Adds:
- BRANCHES.md — per-branch chart (client build, status, notes)
- versions.json — machine-readable manifest the Easy launcher reads
- Branch-picking step + Easy-app/Docker URLs updated in README +
  docs/advanced-setup.md

Drops the per-folder README stubs (server/, admin-ui/, client-mod/,
docker/, easy-app/, tools/) — the actual code lives on per-version
branches now, not on main.
2026-05-26 01:17:14 +03:00

4.8 KiB

Advanced mode — Docker stack

For hosts running a community server (more than ~10 concurrent players), doing custom modding work, or contributing to DorkNet itself.

If you just want to play with friends, the easy-setup desktop app is what you want.

What you get

  • server: the ASP.NET Core backend
  • postgres: the canonical store (the desktop app uses SQLite; for >10 concurrent players, Postgres is what you want)
  • redis: cross-replica presence cache (skip with REDIS_URL= empty to fall back to in-memory; loses presence on restart but otherwise fine)
  • nginx: TLS termination + multi-subdomain routing (api.*, auth.*, accounts.*, match.*, chat.*, cdn.*, commerce.*, img.*, leaderboard.*, notify.*)

Behind a proper TLS certificate (Let's Encrypt via Caddy or Cloudflare Tunnel) this should comfortably run 50+ concurrent players on a $20/mo VPS.

Prerequisites

  • A Linux VPS (Debian 12 / Ubuntu 22.04 / etc.)
  • A domain you control with wildcard DNS pointing at the VPS (*.your-server.example.com → 1.2.3.4)
  • Docker + Docker Compose

Setup

1. Pick the branch matching your client build

DorkNet keeps one branch per supported Rec Room build. See ../BRANCHES.md for the full chart. Quick map:

Your Rec Room install Branch to clone
2020.12.18 (most common DorkNet target) december-2020-12-18
2020.03.10 (or 2020.03.06) march-2020-03-10

2. Clone + configure

# Replace the branch in --branch with the row that matched above.
git clone --branch december-2020-12-18 https://github.com/DorkSquadRR/DorkNet
cd DorkNet/docker

cp .env.example .env
$EDITOR .env  # fill in the values noted below

Required .env values

# Your domain. Server expects to find itself at *.DORKNET_DOMAIN.
DORKNET_DOMAIN=your-server.example.com

# A long random string. Used to sign JWTs.
JWT_SECRET=$(openssl rand -base64 64)

# Postgres password. Random, written once, kept in this file.
POSTGRES_PASSWORD=$(openssl rand -base64 32)

# Photon Cloud AppIds. Free tier at https://dashboard.photonengine.com
PHOTON_APP_ID=your-photon-realtime-appid
PHOTON_VOICE_APP_ID=your-photon-voice-appid  # optional
PHOTON_CLOUD_REGION=eu  # eu, us, asia, jp, sa, kr, in, au, etc.

# Steam Web API key — only needed if you want Steam logins to work.
# Free at https://steamcommunity.com/dev/apikey
STEAM_API_KEY=

TLS

The bundled nginx config terminates TLS but expects certificates to exist on the host. You have two reasonable paths:

  1. Caddy in front (recommended for new hosts) — replace the nginx service with a Caddyfile; Caddy auto-fetches Let's Encrypt certs.
  2. Cloudflare Tunnel — DNS your wildcard at Cloudflare, run cloudflared as another container, never expose port 443 to the internet. The repo includes a sample docker-compose.cloudflared.yml.

Run it

docker compose up -d
docker compose logs -f server

First boot does:

  1. Schema initialization (EnsureCreated from the entity classes)
  2. Legacy data upgrades (no-op on a fresh install)
  3. Seeds RR-Original rooms + store catalog
  4. Applies canonical room overrides (Crescendo, Paintball merge, etc.)
  5. Downloads the bundled room thumbnail images

You should see [boot] migrations complete within ~3 seconds. Then the server is ready at https://api.your-server.example.com/healthz.

Patching the client to point here

Same patcher as Easy mode, but you'll run it from the command line:

.\tools\install-plugin.ps1 `
  -RecRoomPath "C:\path\to\Recroom_Release_Data" `
  -PhotonAppId "<your-photon-realtime-app-id>" `
  -PhotonVoiceAppId "<your-photon-voice-app-id>"

The installer drops the DorkNet BepInEx plugin into the client's BepInEx/plugins/ and writes its config under BepInEx/config/.

Admin UI

https://admin.your-server.example.com — log in with the first account you create (it auto-promotes to admin) or with the bootstrap credentials in your .env if you set BOOTSTRAP_ADMIN_*.

Backups

Postgres is the only stateful service.

docker compose exec postgres pg_dump -U dorknet dorknet > backup.sql

data/images/ on the host is the image blob store. Back that up too.

Updating

cd DorkNet
git pull
docker compose pull
docker compose up -d

The server runs all idempotent migrations on boot, so version upgrades are zero-downtime as long as the schema changes are additive.

⚠️ git pull only fetches updates for your current branch. DorkNet branches are independent — updates on december-2020-12-18 don't flow to march-2020-03-10 and vice versa. If you've checked out the wrong branch for your client, switching is a fresh git clone --branch ... (the schema and Photon AppId requirements differ).