Files
Aryan SinghandClaude Fable 5 279d137ce5 Minecraft 26.2 Fabric server stack with CraftDeck management panel
- docker-compose: itzg/minecraft-server (Fabric, offline mode, whitelist
  enforced, Modrinth-managed mods), itzg/mc-backup sidecar, custom dashboard
- Gated auth for offline mode: approve username -> whitelisted with a short
  registration window -> EasyAuth /register + /login; auto-revoke on expiry
- CraftDeck panel (Next.js 16, zero native deps): live console (SSE), players
  & stats, lag diagnostics (server TPS vs player ping via spark), performance
  graphs, Modrinth mod search/manager, backups & restore, sandboxed file
  browser/editor, .env config editor with compose apply, cron schedules,
  Discord alerts, scrypt-hashed panel login
- scripts/setup.sh generates secrets; docs/ covers auth, mods, updating,
  backups, networking (Tailscale), troubleshooting

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:07:07 -05:00

65 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Authentication flow
The server runs with `online-mode=false` so offline launchers (TLauncher, etc.) can
join. That disables Mojang's account verification, so this stack layers two gates on
top:
1. **Whitelist** (vanilla) — only approved usernames can connect at all
2. **EasyAuth** (Fabric mod) — every player must `/register` a password once, then
`/login` on every join. Unauthenticated players are frozen, invisible to the world,
and kicked after a timeout.
## The approval lifecycle
```
you approve a name ──► whitelisted + "pending" + countdown starts (default 2 min)
│
├─ player joins and /register-s in time ──► "registered" (permanent access)
│
└─ countdown lapses ──► whitelist entry removed ──► "expired"
(re-approve any time to restart the window)
```
The panel enforces this automatically: a background watcher reconciles the pending list
against EasyAuth's registered accounts every 5 seconds and revokes lapsed windows.
### Why the short window matters
While a name is whitelisted but unregistered, anyone who knows the name could join and
claim it. The window shrinks that exposure to a couple of minutes, and you control
exactly when it opens — approve while your friend is sitting in the launcher. If someone
does sneak in and register a name that isn't theirs, just **Revoke** it (removes the
account + whitelist entry) and approve again.
## In-game commands (players)
| Command | What it does |
|---|---|
| `/register <pass> <pass>` | Create your password (first join only) |
| `/login <pass>` | Log in (every join) |
| `/account` | Change password, manage sessions |
| `/logout` | Log out manually |
## Panel actions (Access & Auth page)
| Action | Effect |
|---|---|
| Approve | Whitelist + open registration window |
| Re-open window | Same, for an expired/revoked name |
| Reset password | Sets a temporary password (shown once) and kicks them to re-login |
| Revoke | Whitelist entry + EasyAuth account deleted, player kicked |
| Import whitelist | Adopt names whitelisted outside the panel |
## Storage
EasyAuth stores password hashes in its own database under
`data/mc/mods/EasyAuth/` (included in backups). The panel's approval state lives in
`data/dashboard/craftdeck.db`. The two are reconciled via RCON (`auth list`,
`auth remove`, `auth update`), so there's no fragile file coupling.
## Tuning
- **Window length**: Settings → "Player registration window" (0.5–120 minutes)
- **EasyAuth options** (kick timeout, session lifetime, password rules):
Files → `config/EasyAuth/` — edit and restart the server