Aryan SinghandClaude Fable 5 deeeaf0042 Security page, admin quick controls, and whitelist reload self-healing
- RCON client retries once on a fresh connection after stale-socket
  timeouts (panel idle overnight held dead sockets, so 'whitelist
  reload' silently failed and approvals needed a server restart)
- Auth watcher verifies pending players against the LIVE whitelist every
  5s and re-writes/reloads if the server missed it, refunding lost
  window time
- Log watcher records blocked join attempts (name + IP) with rate-
  limited notifications — scanner bots are now visible in the panel
- New Security page: blocked-attempt log with one-click IP ban, banned
  players/IPs management, kick-everyone lockdown
- Player detail modal: ban, op/deop, gamemode switching
- Overview quick controls: time/weather/difficulty, gamerule toggles
  (keepInventory, mobGriefing, PvP...), broadcast box
- Settings toggles for blocked-attempt notifications (panel + Discord)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
deeeaf0042 · 2026-07-11 11:50:27 -05:00
6 Commits

Minecraft 26.2 Fabric Server + CraftDeck Panel

A production-quality, self-hosted Minecraft Java 26.2 server for friends:

  • Fabric loader with invisible server-side performance mods — any vanilla client (including TLauncher) can join, no client mods needed
  • Offline mode + gated authentication: only usernames you approve can join, each must register a password within a short window, and log in on every visit
  • CraftDeck, a full web management panel: live console, players & stats, lag diagnostics, performance graphs, mod manager with Modrinth search, backups & restore, file browser/editor, config editor, scheduled tasks, Discord alerts
  • Automatic backups with retention, one-command deployment, everything in Docker
Minecraft 26.2 (change one line to upgrade)
Loader Fabric (NeoForge/Forge/vanilla supported via config)
Server mods Fabric API, EasyAuth, spark, Lithium, FerriteCore — auto-updated
Panel Next.js, port 8080, LAN/VPN only
Host needs Linux x86_64, Docker + Compose, ~10 GB RAM

Quick start

git clone <this-repo> minecraft && cd minecraft
./scripts/setup.sh          # creates .env with generated secrets, prints your panel login
docker compose up -d        # first start downloads the server + mods (a few minutes)

Then open http://<server-ip>:8080, log in (admin / password printed by setup.sh), change the password, and you're live:

  • Minecraft: <server-ip>:25565
  • Dashboard: http://<server-ip>:8080

No setup.sh? Copy .env.example to .env and fill in RCON_PASSWORD, PANEL_SESSION_SECRET, PANEL_ADMIN_PASSWORD yourself.

Letting a friend join (the auth flow)

  1. Panel → Access & Auth → type their Minecraft username → Approve & open window
  2. Tell them to join <server-ip>:25565 right away (TLauncher: any username works, but it must match the approved name exactly)
  3. In game they run /register <password> <password> before the countdown ends (default 2 minutes — configurable in Settings)
  4. Done. On every future visit they just /login <password>

If the window lapses, the name is auto-removed from the whitelist — re-approve when they're ready. Full details: docs/auth-flow.md.

Everyday operations

Task Where
Start / stop / restart Overview page (or docker compose restart mc)
Watch console, run commands Console page
See who's lagging (them vs you) Performance & Lag page
Add/remove mods Mods page (Modrinth search built in)
Back up / restore Backups page
Change version, memory, MOTD… Configuration page → Save → Apply
Auto-restarts & scheduled backups Schedules page
Discord alerts Settings page

Documentation

Architecture

docker-compose.yml
├── mc         itzg/minecraft-server  (Fabric 26.2, offline mode, whitelist enforced,
│              RCON on the internal network only, mods resolved from Modrinth at start)
├── backup     itzg/mc-backup         (scheduled world tars + retention pruning)
└── dashboard  ./dashboard            (CraftDeck: Next.js + node:sqlite; talks to the
                                       Docker socket, RCON, and the server files)
data/
├── mc/        world, configs, mods, logs      (bind mount → survives everything)
├── backups/   world-*.tgz
└── dashboard/ panel database

The panel's registration-window enforcement, activity feed, metrics sampler, and scheduler run inside the dashboard container; state lives in data/dashboard/ and the .env file is the single source of truth for server configuration.

Security model (read this once)

  • The Minecraft port (25565) is the only thing that should ever be internet-exposed.
  • online-mode=false means Mojang doesn't verify usernames — the whitelist + EasyAuth passwords are what keep strangers out. Keep registration windows short.
  • The dashboard can start/stop containers and edit server files (it mounts the Docker socket), so treat it like root on the host: LAN or VPN only, never port-forward 8080. See docs/networking.md for the Tailscale setup.
  • RCON is not published outside the Docker network.
S
Description
No description provided
Readme
364 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 96.2%
Python 1.8%
Shell 1.2%
Dockerfile 0.5%
CSS 0.3%