Backend
Settings
Every field in RKServer's 7 Settings/*.json files, what it does, and its default. Each file loads independently — a missing or malformed file falls back to that section's defaults on its own, without affecting the other 6. Editing any of these needs a restart to take effect; Config.logSettings() prints everything actually loaded at startup, which is the fastest way to confirm a change took.
Connection.json
Raw socket settings only — nothing HTTP-related lives here. Renamed from Network.json/NetworkSettings once Http.json split out — "network" read as all-encompassing once HTTP had its own file.
| Field | Default | Meaning |
tcp_port | 5000 | Main socket port — every game server's BackendClient connects here. |
update_port | 5001 | Socket-based manifest/claim-code protocol port used by RKUpdater. Distinct from any HTTP port — this is the handshake side, not the file-download side. |
ip | localhost | Backend host, as sent back to a newly-claimed server so it knows where to reach this backend. |
max_connections | 10 | Reserved for future connection-limit enforcement. |
throttle_max_failures | 5 | Rejected handshakes from one IP within the window before it's throttled. |
throttle_window_seconds | 60 | Rolling window throttle_max_failures is measured over. |
throttle_cooldown_seconds | 300 | How long a throttled IP is refused at accept() before it's eligible again. |
Http.json
Every HTTP port RKServer binds, plus the reverse proxy config that fronts them. Consolidated from Network.json's HTTP fields and a separate ReverseProxy.json — "which port is HTTP on" and "how the proxy routes to it" are one concern, not two. See RKServer's HTTP routes table for the full port/route/auth/exposure breakdown.
| Field | Default | Meaning |
admin_port | 8000 | /admin dashboard/API only. Named admin_port (not http_port, its old name from before the other HTTP ports existed) for clarity. Firewalled/local-only — never expose this one directly. |
documentation_port | 8001 | This documentation site. Safe to expose publicly — read-only, nothing sensitive. |
updates_http_port | 8002 | The whole Updates/ tree over HTTP, byte-range downloads for RKUpdater. No auth by design — needs to be reachable with zero credentials to bootstrap. |
reverse_proxy_port | 80 | Port ReverseProxyHttpServer binds for Host-header subdomain routing. Typically 80 so a configured subdomain resolves with no port in the address bar. |
logHttp | false | Reserved — not yet consulted anywhere. Intended for future per-request HTTP logging. |
reverseProxyEnabled | false | Master on/off for the reverse proxy. When false, ReverseProxyHttpServer never starts — every port above keeps working directly either way, this only ever adds an extra front door, never removes direct access. |
subdomainRouting | see below | Map of subdomain name → route config. |
subdomainRouting entries
Each key is a subdomain (e.g. "documentation" matches Documentation.<your-domain>). Default config ships two entries:
| Field | Meaning |
type | "internal" dispatches straight into the target's own handler in-process — no network hop, since these servers already live in this JVM. "external" proxies over real HTTP via HttpClient, for targets outside this process (not used by either default route yet). |
context | The target's own direct-port context path (e.g. /documentation). Informational for internal routes — the target's own ProxyableHandler.handleProxied() owns the actual routing logic, not consulted from here. |
target | Full base URL for an external route (e.g. http://localhost:9000). Unused for internal routes. |
access | "any" (default) — reachable from anywhere. "local" — only forwarded for loopback/private-network (RFC1918) requesters; anyone else gets deniedPage instead. |
deniedPage | Path relative to Web/, served (as real HTML) when access: "local" blocks a non-local request. The default admin route uses restricted-admin.html. |
Default routing: documentation → access: "any" (fully public). admin → access: "local" with its own denied page — the admin dashboard stays local-only even if the proxy is enabled and publicly reachable on port 80.
Cluster.json
| Field | Default | Meaning |
gridSize | 3 | N×N server grid size, drives the /admin dashboard's grid layout. |
maxSectors | 1 | Sectors per server axis. -1 means infinite world, no borders. |
sectorSize | 8192 | Blocks per sector. |
push_interval | 60000ms | How often server state pushes out. |
transfer_cooldown_ms | 5000ms | Minimum time between a player's cross-server transfers. |
landing_offset | 32 blocks | Spawn offset from the border on arrival at a new server. |
Admin.json
| Field | Default | Meaning |
admin_username | admin | HTTP Basic Auth username for /admin. |
admin_password | changeme | HTTP Basic Auth password. Travels base64-encoded, not encrypted — fine on a trusted/local network, put TLS in front of this before ever exposing it publicly (tracked as a follow-up, not solved by this field). |
Logging.json
Every log category as a destination rather than a plain on/off — each can go to just the console, just the log file, both, or be silenced entirely. Renamed from Debug.json/DebugSettings — despite the old name, every field here has always just been a log-category toggle feeding Logger, nothing broader.
| Value | Meaning |
OFF | Line is never built for this category. |
CONSOLE | Printed to stdout only. |
FILE | Written to Logs/rkbackend-<date>.log only. |
BOTH | Both console and file. |
| Field | Default |
override_logging | OFF |
logConnections | BOTH |
logHandshakes | BOTH |
logPackets | OFF |
logPlayerData | BOTH |
logTransfers | BOTH |
logDatabase | OFF |
logServerRouting | BOTH |
logConfigLoading | BOTH |
logErrors | BOTH |
logReconnection | BOTH |
logUpdater | BOTH |
logRegistration | BOTH |
override_logging is a master switch, same 4 values as every category. OFF (default) means no override — each category uses its own setting above. Anything else forces every category to that exact destination, no per-category exceptions — set it to BOTH for full verbosity without hand-flipping 12 fields, or to CONSOLE/FILE to force everything to just one output.
Navigation.json
Cluster-wide navigation/border defaults, sent to every server at handshake time via ClusterDefaultsPacket instead of hand-editing each server's local config. Defaults match RKClient's own NavigationConfig.java defaults, so a fresh install behaves identically whether or not this section is customized.
| Field | Default | Meaning |
onlineColor | r0 g0.8 b0 a0.8 | Border color for an online neighbor server. |
offlineColor | r0.8 g0 b0 a0.8 | Border color for an offline neighbor. |
unknownColor | r0.8 g0.65 b0 a0.8 | Border color for an unclaimed/unknown grid cell. |
fadeRampDistance | 96 | Distance over which the border fades in. |
fadeMaxAlpha | 0.75 | Maximum border opacity. |
engineBuffer | 16 | Engine-side buffer contributing to the effective fire threshold. |
mathSafetyBuffer | 2 | Extra safety margin, same threshold calculation. |
edgeBufferBlocks | 3 | Edge buffer, same threshold calculation. |
recheckIntervalSeconds | 1.0 | How often border proximity is rechecked. |
cornerZoneLength | 64 | Corner-zone detection length. |
borderStripThickness | 8 | Visual border strip thickness. |
engineBuffer + mathSafetyBuffer + edgeBufferBlocks is the effective fire threshold, logged directly at startup for convenience.
WorldState.json
Weather/time sync (WeatherChangeListener + TimeSyncManager, home server only). Weather is event-driven (WeatherChangeEvent) so it has no interval setting of its own — only weatherInstant applies. Time stays interval-based with a correction threshold to avoid visibly jumping time for a few minutes of natural drift.
| Field | Default | Meaning |
timeSyncIntervalSeconds | 60 | How often time syncs out. |
timeSyncIgnoreThresholdMinutes | 5 | Drift under this threshold is ignored rather than corrected, to avoid a visible time jump. |
weatherInstant | true | Controls Server.setWeather's transition animation on the receiving end. |