No description
Find a file
2026-05-07 22:35:28 +01:00
docs docs: shop system research + decision (ExcellentShop or split) 2026-05-07 22:35:28 +01:00
live-server lp: audit trail for default-group essentials.* + homestead.user grant 2026-05-07 18:53:42 +01:00
scripts backup: phase 1 + phase 2 scripts; daily script repaired and deployed 2026-05-07 18:29:30 +01:00
staging/chatchat feat(chat): stage ChatChat migration bundle (jar + configs + swap scripts) 2026-05-07 22:23:11 +01:00
.gitignore feat(chat): stage ChatChat migration bundle (jar + configs + swap scripts) 2026-05-07 22:23:11 +01:00
AUDIT-2026-05-07.md audit P0 quick-wins: H2 container hardening, H3 Xmx tuning, H1 staged 2026-05-07 17:51:58 +01:00
BACKUP-HUNT-2026-05-07.md docs: 2026-05-07 incident audit + backup strategy 2026-05-07 17:33:24 +01:00
BACKUP-STRATEGY.md docs: 2026-05-07 incident audit + backup strategy 2026-05-07 17:33:24 +01:00
CROSS-REFERENCE-2026-05-07.md docs: 2026-05-07 incident audit + backup strategy 2026-05-07 17:33:24 +01:00
docker-compose.yml audit P0 quick-wins: H2 container hardening, H3 Xmx tuning, H1 staged 2026-05-07 17:51:58 +01:00
INTERIM-MITIGATIONS.md audit P0 quick-wins: H2 container hardening, H3 Xmx tuning, H1 staged 2026-05-07 17:51:58 +01:00
LICENSE License: switch to AGPL-3.0-or-later 2026-04-30 19:32:06 +01:00
MISSION.md Initial commit: racked.ru Minecraft server config snapshot 2026-04-30 18:33:38 +01:00
README.md Initial commit: racked.ru Minecraft server config snapshot 2026-04-30 18:33:38 +01:00
RULES.md docs: canonical philosophy + moderation; tighten RULES 2026-05-07 19:30:10 +01:00
TELEMETRY_AUDIT.md Initial commit: racked.ru Minecraft server config snapshot 2026-04-30 18:33:38 +01:00
THANKS.md Initial commit: racked.ru Minecraft server config snapshot 2026-04-30 18:33:38 +01:00
VIBE.md docs: add VIBE + RULES — server philosophy + enforcement 2026-05-02 04:05:37 +01:00

racked.ru — Minecraft server

experience the game the way it should have always been

Self-hosted Purpur Minecraft server powering racked.ru. Microsoft-free, privacy-first, fully open source. Deployed via Docker on Debian (nullstone, 192.168.0.100), public at mc.racked.ru:25565.

Companion projects:

  • server-client-launcher — one-click connect, no manual modpack juggling. (Separate repo.)
  • client — performance-optimized client (separate repo).

This repo is the server half. Configs, plugin manifest, deploy scripts. No plugin jars committed — acquired at boot from FOSS sources (see PLUGINS.md).

all software should be free and open-source — see MISSION.md, THANKS.md

Stack

Layer Choice Why
Server jar Purpur (latest stable build) Paper fork w/ extra config knobs
Container itzg/minecraft-server:latest Auto-DL of jar + plugins via env
Host OS Debian 13 nullstone server
Network Docker proxy external network Shared w/ Traefik for future TLS reverse-proxy
Backup tar.gz daily 02:00 via host cron 7-day retention to /opt/backups/

Quick start

git clone <this-repo> minecraft-server
cd minecraft-server
mkdir -p /opt/docker/minecraft
cp -r config/* /opt/docker/minecraft/        # seed configs
cp docker-compose.yml /opt/docker/minecraft/
chmod -R 777 /opt/docker/minecraft            # see docs/PERMISSIONS.md (userns-remap quirk)
cd /opt/docker/minecraft && docker compose up -d
docker logs -f minecraft-mc                   # watch jar+plugin DL, world gen

First boot: ~3-5 min (Purpur jar DL, ~14 plugin DL, world gen).

Docs

Server config highlights

Setting Value
Difficulty hard
Gamemode survival
Max players 69
View distance 20 chunks
Simulation distance 10 chunks
Online mode false (cracked clients allowed)
Spawn protection 0
RAM 8G min, 16G max (18G hard cap)
RCON enabled, port 25575, password *redacted*

Full settings in config/server.properties.

Network

Port Proto Use
25565 TCP Minecraft client
25575 TCP RCON (LAN-trusted only)

LAN: 192.168.0.100:25565. Tailscale: 100.64.0.2:25565. Future public: mc.s8n.ru via Traefik (label commented out).

Plugins (15 active)

Auto-pulled from Modrinth at boot: LuckPerms, PlaceholderAPI, EssentialsX, WorldEdit, Simple Voice Chat, MiniMOTD, SkinsRestorer, CoreProtect, GrimAC, spark, DiscordSRV, LandClaimPlugin (replaces paid Lands), TAB.

Auto-pulled from Spigot: ProtocolLib (ID 1997), Vault (ID 34315).

Manual install (no Modrinth/Spigot auto-source): LoginSecurity, ComfyWhitelist, MarriageMaster, PhantomSMP, HelpCommand, ProAntiTab.

Premium (skipped, FOSS replacement preferred): Lands (replaced by LandClaimPlugin), CosmicGuard.

See docs/PLUGINS.md for source URLs.

Roadmap / TODO

Living checklist. Priority tags: [P0] blocker / security, [P1] vision-aligned swap, [P2] improvement, [P3] nice-to-have.

Infrastructure

  • Fix loader=purpur boot loop — workaround: TYPE=CUSTOM + direct Purpur jar URL + MODRINTH_LOADER=paper. Permanent fix still pending Phase 2.
  • Pin Purpur version (1.21.10) — no LATEST drift
  • Set MOTD to racked.ru tagline
  • [P1] Public DNS: mc.racked.ru → TCPShield proxy (DDoS protection; do NOT point A record directly to home IP)
  • [P1] Traefik TLS termination for RCON web UI (LAN-only first)
  • [P2] Switch bind mount → named volume to kill chmod 777 userns workaround
  • [P2] dns: block in compose pointing 1.1.1.1 + LAN router (Tailscale ate /etc/resolv.conf precedent)
  • [P2] Bluemap or Squaremap on map.racked.ru (browser map via Traefik)
  • [P2] Prometheus exporter + Grafana dashboard (TPS, MSPT, RAM)
  • [P3] Test instance on port 25566 sharing world snapshot — try plugin upgrades safely

Plugin acquisition (per ROADMAP.md)

  • [P0] Phase 1: pin every plugin to specific version-id (no latest in env)
  • [P1] Phase 2: plugins.yml manifest + fetch-plugins.sh (GH-first, Hangar/Modrinth/Spiget fallback)
  • [P1] Phase 2: plugins.lock w/ sha256 per jar, committed
  • [P2] Phase 3: GH Action — daily upstream check, auto-PR per update, license audit → LICENSES.md

Plugin swaps (per PLUGIN_ALTERNATIVES.md)

High priority — security, FOSS alignment, license clarity:

  • LoginSecurity → AuthMe Reloaded — done. Void auth_limbo END dimension, sealed barrier cell at spawn, teleportUnAuthedToSpawn: true, hideInventory: true, post-login mvtp %p world hook. Base-coord leak fixed.
  • ProAntiTab — Keep (verified: RayzsYT, GPL-2.0-or-later, FOSS, free, GH). Earlier "likely premium" guess was wrong.
  • Claim plugin → Homestead (Apache-2.0, FOSS, 75+ flags, sub-areas, BlueMap integration, free claiming)
  • WorldEdit → FastAsyncWorldEdit (FAWE) — done. v2.15.0, GPL-3.0, drop-in swap, CoreProtect integration auto-detected.
  • Vault → VaultUnlocked — done. TheNewEconomy fork, GH source, modrinth slug vaultunlocked, drop-in Vault API replacement.
  • [P3] (deferred — later project) Add Matrix bridge alongside DiscordSRV — use existing Tuwunel homeserver (txt.s8n.ru) as FOSS comm channel

Medium priority — license/dependency cleanup:

  • CoreProtect-CE — Keep (acknowledged license exception; reliability > purity per operator). Revisit if/when Prism reaches feature parity on sign/container/entity rollback at scale.
  • [P2] Verify license: TAB

Low priority — consolidation to native:

  • [P2] Verify ComfyWhitelist license — keep if FOSS (provides name-based hot-reload whitelist w/o Mojang API; native /whitelist is UUID-based and unsafe on offline-mode). Swap to FOSS name-based alt if license unclear.
  • [P3] Drop HelpCommand → native /help + commands.yml
  • [P3] Drop PhantomSMP → native paper config + vanilla datapack
  • [P3] Audit MarriageMaster usage — drop or fork under FOSS license

Phase 4 — long-term refactor:

  • [P3] EssentialsX split into modular FOSS plugins (HuskHomes for teleport, etc)
  • [P3] Evaluate dropping ProtocolLib in favor of PacketEvents-only stack
  • [P3] PlaceholderAPI → MiniPlaceholders (Adventure-native) when ecosystem catches up
  • [P3] Self-hosted skin server (replace Mojang/MineSkin dependency)

Documentation

  • Per-plugin doc files under docs/plugins/<name>.md — all 18 active plugins documented (license, source, version, notes)
  • [P1] AGREEMENTS.md — high-level overview of any custom dev-rights deals (no NDAs broken)
  • [P1] Cross-link launcher repo in README + MISSION when public
  • [P2] Cross-link client repo in README + MISSION when public
  • [P2] docs/SKIN_HOSTING.md — once skin server self-hosted
  • [P3] mkdocs site auto-built from docs/ for racked.ru

Community / process

  • [P1] Publish to GitHub under racked-rust org (or chosen org name)
  • [P1] CONTRIBUTING.md — describe FOSS-only plugin policy (per MISSION.md)
  • [P2] Issue templates: plugin-suggestion, license-concern, bug, feature
  • [P2] PR template — license check checkbox, vision-alignment checkbox
  • [P3] Discussion category for plugin proposals

Backlog (deferred, low priority)

  • [P3-deferred] Self-host LuckPerms web editor + bytebin on perms.racked.ru — eliminates Cloudflare dep that bit us during a CF outage (web editor failed; in-game /lp commands still worked). Both components are MIT FOSS (github.com/LuckPerms/web, github.com/lucko/bytebin). Workaround for now: use /lp commands only, skip GUI entirely. Revisit when other Phase 4 work is done — small QoL win, big setup cost.

Done

  • Backup old server → _archive/minecraft-old-2026-04-27.tar.gz
  • Migrate Lands (paid) → LandClaimPlugin (FOSS) — see migrations/lands-to-landclaim.md
  • Drop LitePlaytimeRewards (upstream dead since 2021)
  • Drop CosmicGuard (premium, can't audit) — GrimAC covers anti-cheat
  • Document MISSION + THANKS + plugin policy
  • Plugin alternatives audit — see PLUGIN_ALTERNATIVES.md
  • Drop DiscordSRV (Discord = mission-misaligned proprietary platform)
  • Migrate old world (4.2G overworld + nether + end) from archive to new server
  • Restore selective plugin configs from old (LuckPerms perms+groups, CoreProtect history, EssentialsX userdata, MiniMOTD, voicechat, SkinsRestorer, GrimAC, ProAntiTab, WorldEdit, PlaceholderAPI, spark)
  • Restore player state files (ops.json, banned-players, banned-ips, whitelist, usercache)
  • TAB v5 → v6 schema migration (visuals preserved, 0 warnings on reload)
  • Document racked.ru as the project (MISSION.md, THANKS.md w/ author attributions, README rebrand)
  • AuthMe void limbo dimension (auth_limbo) — sealed barrier cell, no coord leaks, post-login TP to overworld
  • Public access confirmed — port forward 25565 → 82.31.156.86 working
  • LandClaimPlugin Wilderness actionbar silenced
  • Disk cleanup — freed 11G+ (old backups, Docker build cache, staging dirs)

License

Configs + scripts in this repo: MIT. Plugin jars are not redistributed here — they're acquired at deploy time from upstream sources, each under its own license. See THANKS.md for per-plugin license attribution.