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.

FieldDefaultMeaning
tcp_port5000Main socket port — every game server's BackendClient connects here.
update_port5001Socket-based manifest/claim-code protocol port used by RKUpdater. Distinct from any HTTP port — this is the handshake side, not the file-download side.
iplocalhostBackend host, as sent back to a newly-claimed server so it knows where to reach this backend.
max_connections10Reserved for future connection-limit enforcement.
throttle_max_failures5Rejected handshakes from one IP within the window before it's throttled.
throttle_window_seconds60Rolling window throttle_max_failures is measured over.
throttle_cooldown_seconds300How 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.

FieldDefaultMeaning
admin_port8000/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_port8001This documentation site. Safe to expose publicly — read-only, nothing sensitive.
updates_http_port8002The 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_port80Port ReverseProxyHttpServer binds for Host-header subdomain routing. Typically 80 so a configured subdomain resolves with no port in the address bar.
logHttpfalseReserved — not yet consulted anywhere. Intended for future per-request HTTP logging.
reverseProxyEnabledfalseMaster 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.
subdomainRoutingsee belowMap of subdomain name → route config.

subdomainRouting entries

Each key is a subdomain (e.g. "documentation" matches Documentation.<your-domain>). Default config ships two entries:

FieldMeaning
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).
contextThe 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.
targetFull 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.
deniedPagePath 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: documentationaccess: "any" (fully public). adminaccess: "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

FieldDefaultMeaning
gridSize3N×N server grid size, drives the /admin dashboard's grid layout.
maxSectors1Sectors per server axis. -1 means infinite world, no borders.
sectorSize8192Blocks per sector.
push_interval60000msHow often server state pushes out.
transfer_cooldown_ms5000msMinimum time between a player's cross-server transfers.
landing_offset32 blocksSpawn offset from the border on arrival at a new server.

Admin.json

FieldDefaultMeaning
admin_usernameadminHTTP Basic Auth username for /admin.
admin_passwordchangemeHTTP 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.

ValueMeaning
OFFLine is never built for this category.
CONSOLEPrinted to stdout only.
FILEWritten to Logs/rkbackend-<date>.log only.
BOTHBoth console and file.
FieldDefault
override_loggingOFF
logConnectionsBOTH
logHandshakesBOTH
logPacketsOFF
logPlayerDataBOTH
logTransfersBOTH
logDatabaseOFF
logServerRoutingBOTH
logConfigLoadingBOTH
logErrorsBOTH
logReconnectionBOTH
logUpdaterBOTH
logRegistrationBOTH
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.

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.

FieldDefaultMeaning
onlineColorr0 g0.8 b0 a0.8Border color for an online neighbor server.
offlineColorr0.8 g0 b0 a0.8Border color for an offline neighbor.
unknownColorr0.8 g0.65 b0 a0.8Border color for an unclaimed/unknown grid cell.
fadeRampDistance96Distance over which the border fades in.
fadeMaxAlpha0.75Maximum border opacity.
engineBuffer16Engine-side buffer contributing to the effective fire threshold.
mathSafetyBuffer2Extra safety margin, same threshold calculation.
edgeBufferBlocks3Edge buffer, same threshold calculation.
recheckIntervalSeconds1.0How often border proximity is rechecked.
cornerZoneLength64Corner-zone detection length.
borderStripThickness8Visual 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.

FieldDefaultMeaning
timeSyncIntervalSeconds60How often time syncs out.
timeSyncIgnoreThresholdMinutes5Drift under this threshold is ignored rather than corrected, to avoid a visible time jump.
weatherInstanttrueControls Server.setWeather's transition animation on the receiving end.