The BepInEx client patcher is gone; document the MelonLoader installer (install-melon.ps1 on the version branch) dropping DorkNet.ClientMod into Mods/ instead of a BepInEx plugin into BepInEx/plugins/.
4.9 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:
- Caddy in front (recommended for new hosts) — replace the nginx service with a Caddyfile; Caddy auto-fetches Let's Encrypt certs.
- Cloudflare Tunnel — DNS your wildcard at Cloudflare, run
cloudflaredas another container, never expose port 443 to the internet. The repo includes a sampledocker-compose.cloudflared.yml.
Run it
docker compose up -d
docker compose logs -f server
First boot does:
- Schema initialization (
EnsureCreatedfrom the entity classes) - Legacy data upgrades (no-op on a fresh install)
- Seeds RR-Original rooms + store catalog
- Applies canonical room overrides (Crescendo, Paintball merge, etc.)
- 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. The
CLI installer ships on the version-specific branch (e.g.
december-2020-12-18):
.\tools\install-melon.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 MelonLoader mod (DorkNet.ClientMod)
into the client's Mods/ folder and writes its config under
MelonLoader/UserData/.
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 pullonly fetches updates for your current branch. DorkNet branches are independent — updates ondecember-2020-12-18don't flow tomarch-2020-03-10and vice versa. If you've checked out the wrong branch for your client, switching is a freshgit clone --branch ...(the schema and Photon AppId requirements differ).