Switch Minecraft server to FTB StoneBlock 4 (name + modpack metadata)
All checks were successful
Deploy GSM / deploy (push) Successful in 43s

config.json, discordBot.js, serverUpdates.js and ServerCard.jsx updated from Biohazard to FTB StoneBlock 4. Docs (infrastructure/gsm/CLAUDE) updated and docs/minecraft-modpack-install.md added. No Discord update notification is triggered (minecraft supportsUpdate=false).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 19:44:09 +02:00
parent 33011056c2
commit 5ab3154351
8 changed files with 227 additions and 8 deletions

View File

@@ -13,7 +13,7 @@ The homelab consists of:
- **Proxmox Server (192.168.2.20)**: Virtualization host running LXC containers and VMs
- **Gameserver Monitor (192.168.2.30)**: React/Node.js webapp for monitoring game servers (LXC)
- **Factorio Server (192.168.2.50)**: Docker-based game server (LXC)
- **Minecraft Server (192.168.2.51)**: Biohazard: Project Genesis modded server running via screen (VM)
- **Minecraft Server (192.168.2.51)**: FTB StoneBlock 4 modded server (MC 1.21.1 / NeoForge) running via screen (VM)
- **V Rising Server (192.168.2.52)**: Dedicated server (LXC)
- **Palworld Server (192.168.2.53)**: Dedicated server with systemd (LXC)
- **Project Zomboid Server (10.0.30.66)**: Dedicated server (external VM)

View File

@@ -190,7 +190,7 @@ Frontend Backend
"servers": [
{
"id": "minecraft",
"name": "Biohazard: Project Genesis | Minecraft",
"name": "FTB StoneBlock 4 | Minecraft",
"host": "192.168.2.51",
"type": "minecraft",
"runtime": "screen",

View File

@@ -138,7 +138,7 @@ Internet
| Eigenschaft | Wert |
|-------------|------|
| Modpack | Biohazard: Project Genesis (Beta 0.4.5) |
| Modpack | FTB StoneBlock 4 (1.15.3, MC 1.21.1, NeoForge 21.1.233) |
| Runtime | screen |
| Screen Name | minecraft |
| Game Port | 25565 |

View File

@@ -0,0 +1,219 @@
# Minecraft Modpack installieren / wechseln (FTB / CurseForge)
Diese Anleitung beschreibt, wie auf dem Minecraft-Server (VM 100, `192.168.2.51`,
`/opt/minecraft`, screen `minecraft`) ein **FTB-Modpack** installiert oder gegen ein
anderes ausgetauscht wird. Sie ist generisch — am Beispiel **FTB StoneBlock 4** —, gilt
aber für jedes FTB-Pack. Damit muss das nicht jedes Mal neu recherchiert werden.
> **Quelle der Wahrheit für Versionen ist die FTB-API**, nicht CurseForge (CurseForge zeigt
> oft veraltete „latest"-Stände). Siehe Schritt 1.
## Zugang
VM ist eine QEMU-VM auf Proxmox. Ist sie aus, erst starten:
```bash
ssh alex@192.168.2.10 "ssh root@192.168.2.20 'qm start 100; qm status 100'"
```
SSH zur VM läuft **über den GSM-Monitor (.30)** als Jump-Host (dort liegt der passende Key
`/root/.ssh/id_ed25519`), nicht direkt über den Pi:
```bash
ssh alex@192.168.2.10 "ssh root@192.168.2.30 'ssh root@192.168.2.51 \"BEFEHL\"'"
```
> Tipp: Bei mehrfach verschachteltem SSH + komplexen Befehlen die innerste Befehlskette
> base64-kodieren und remote mit `echo <b64> | base64 -d | bash` ausführen — spart das
> Quoting-Chaos über drei Shell-Ebenen.
## Voraussetzungen auf der VM (bereits erfüllt)
- Debian 13, **OpenJDK 21** installiert (`java -version` → 21.x). FTB-Packs ab MC 1.20.5
brauchen **Java 21**.
- `screen`, `curl` vorhanden.
- GSM startet den Server fest mit `cd /opt/minecraft && screen -dmS minecraft ./run.sh`
(siehe `gsm-backend/services/ssh.js`). **Es wird kein `nogui` angehängt** → die
`run.sh` des Packs muss `nogui` enthalten (FTB/NeoForge-`run.sh` tut das standardmäßig).
## Schritt 1: Pack-ID und Version-ID über die FTB-API ermitteln
FTB-Packs haben eine numerische **Pack-ID** (in der FTB-URL, z. B.
`feed-the-beast.com/modpacks/130-ftb-stoneblock-4` → ID `130`).
Alle Versionen + IDs auflisten:
```bash
curl -s https://api.feed-the-beast.com/v1/modpacks/public/modpack/130 | \
python3 -c 'import sys,json; d=json.load(sys.stdin); print(d["name"]); [print(v["id"], v["name"], v["type"]) for v in d["versions"]]'
```
Die höchste `release`-Version nehmen (Beispiel StoneBlock 4: Version `1.15.3` =
Version-ID `100372`, MC `1.21.1`, NeoForge `21.1.233`).
## Schritt 2: FTB-Server-Installer herunterladen
FTB liefert ein eigenständiges (statisches Go-)Installer-Binary pro Pack/Version:
```
https://api.feed-the-beast.com/v1/modpacks/public/modpack/<PACK_ID>/<VERSION_ID>/server/linux
```
In ein **frisches** Verzeichnis installieren (altes `/opt/minecraft` bleibt unangetastet,
bis das neue Pack verifiziert ist):
```bash
mkdir -p /opt/sb4_new && cd /opt/sb4_new
curl -fsSL -o serverinstall \
"https://api.feed-the-beast.com/v1/modpacks/public/modpack/130/100372/server/linux"
chmod +x serverinstall
./serverinstall --help # Flags ansehen
```
Wichtige Flags: `-auto` (keine Rückfragen), `-force` (nötig, wenn Zielordner nicht leer ist
— z. B. weil das Installer-Binary schon drinliegt), `-accept-eula`, `-no-java` (System-Java
21 nutzen statt ein eigenes JRE mitzuinstallieren), `-dir`, `-pack`, `-version`.
## Schritt 3: Installer laufen lassen
Lädt NeoForge + alle Mods (StoneBlock 4: ~6900 Dateien / 378 Mods, ~1,2 GB). Wegen der
Laufzeit per `nohup` im Hintergrund starten und das Log pollen:
```bash
cd /opt/sb4_new
nohup ./serverinstall -auto -force -accept-eula -no-java -no-colours \
-pack 130 -version 100372 -dir /opt/sb4_new > install.log 2>&1 &
# Fortschritt:
tr '\r' '\n' < install.log | tail -5
```
Erfolg = Logzeilen `SUCCESS: NeoForge installed successfully` und
`SUCCESS: Modpack installed successfully`. Danach existieren u. a.: `run.sh` (enthält
`nogui`), `user_jvm_args.txt` (Heap, Default `-Xmx8192M`), `eula.txt` (=true),
`libraries/`, `mods/`, `config/`, `defaultconfigs/` und eine **`default-server.properties`**
(Pack-Empfehlung — siehe Stolperfalle unten).
## Schritt 4 (WICHTIG): `default-server.properties` korrekt befüllen
> ⚠️ **Stolperfalle / der Grund, warum RCON / Whitelist / MOTD beim ersten Start „verschwinden":**
> StoneBlock 4 (und viele FTB-Packs) bringen den Mod **`default-server-properties`** mit. Der
> **erzwingt bei *jedem* Serverstart** die Werte aus `default-server.properties` in die
> `server.properties` und setzt den Rest auf Vanilla-Defaults zurück. Eine selbst geschriebene
> `server.properties` allein **überlebt den Start daher nicht** — alles außer den in
> `default-server.properties` gelisteten Keys wird auf Default zurückgesetzt
> (z. B. `enable-rcon=false`, `motd=A Minecraft Server`, `white-list=false`).
Deshalb alle **erzwungenen Betriebs-Settings in `default-server.properties` eintragen** (das
ist die vom Pack vorgesehene Quelle). Mindestens nötig für GSM-Betrieb:
```properties
# vom Pack vorgegeben (behalten!)
allow-flight=true
allow-nether=false
difficulty=normal
enable-command-block=true
generate-structures=true
level-type=minecraft\:normal
spawn-protection=512
# für GSM / Betrieb ergänzen:
enable-rcon=true
rcon.port=25575
rcon.password=gsm-mc-2026
broadcast-rcon-to-ops=true
white-list=true
enforce-whitelist=true
motd=FTB StoneBlock 4
server-port=25565
query.port=25565
max-players=20
online-mode=true
pvp=true
view-distance=7
simulation-distance=10
```
- **`enable-command-block=true`** ist bei StoneBlock 4 Pflicht — ohne Command-Blöcke
funktionieren Strukturen/Quests im Pack nicht korrekt (steht so in der CurseForge-Beschreibung
und ist bereits in der `default-server.properties` des Packs gesetzt).
- **`rcon.password=gsm-mc-2026`** + **`rcon.port=25575`** müssen mit
`gsm-backend/config.json` (Server `minecraft`) übereinstimmen, sonst funktionieren
GSM-Spielerzählung, Konsole und Whitelist-Verwaltung nicht.
Zur Sicherheit zusätzlich eine vollständige `server.properties` mit denselben Werten schreiben
(vermeidet ein kurzes Fenster falscher Werte beim allerersten Start).
## Schritt 5: Spieler/Icon übernehmen + Swap
```bash
# bestehende Spieler & Icon übernehmen (gleicher Zugang wie vorher)
cp /opt/minecraft/whitelist.json /opt/sb4_new/whitelist.json
cp /opt/minecraft/ops.json /opt/sb4_new/ops.json
cp /opt/minecraft/server-icon.png /opt/sb4_new/server-icon.png
# Swap (altes Pack als Backup behalten)
screen -S minecraft -X quit 2>/dev/null || true
mv /opt/minecraft /opt/minecraft_<altespack>_backup
rm -f /opt/sb4_new/serverinstall /opt/sb4_new/*.log # Installer-Reste
mv /opt/sb4_new /opt/minecraft
chmod +x /opt/minecraft/run.sh
```
## Schritt 6: Starten + verifizieren
```bash
cd /opt/minecraft && screen -dmS minecraft ./run.sh
# auf "Done (" warten:
grep 'Done (' logs/latest.log
# Pflicht-Checks:
ss -tlnp | grep -E ':25565|:25575' # beide Ports müssen lauschen (25575 = RCON!)
grep -E '^(enable-rcon|motd|white-list|enable-command-block)' server.properties
grep -i 'RCON running' logs/latest.log # "RCON running on 0.0.0.0:25575"
```
Erststart lädt alle Mods + generiert die Welt (StoneBlock 4: „Done" nach ~75 s). Das alte
Welt-Save ist mit einem neuen Pack **inkompatibel** — es wird eine neue Welt erzeugt.
### Bekannte, harmlose Logmeldungen
`DataMapLoader ... Object with ID <mod>:<item> ... doesn't exist` (ERROR) und
`LootJS: Skipping unexpected loot action` (WARN) sind **nicht fatal** — sie kommen so mit dem
offiziellen Pack (Datamaps referenzieren Items optionaler/umbenannter Mods). Server erreicht
trotzdem „Done".
### RAM
VM hat 12 GB (real ~11 GiB nutzbar). Heap in `user_jvm_args.txt`; **8 GB (`-Xmx8192M`)** ist
ein sicherer Wert mit Headroom fürs OS + Off-Heap. 10 GB Heap auf 11 GiB ist OOM-gefährdet.
## Schritt 7: GSM / Discord auf den neuen Namen anpassen
Code-Änderungen **nur über Git** (commit → push → CI/CD deployt automatisch). **Niemals per
SCP!** Anzupassen sind:
| Datei | Änderung |
|-------|----------|
| `gsm-backend/config.json` | `servers[minecraft].name``"<Pack> | Minecraft"` |
| `gsm-backend/services/discordBot.js` | `serverDisplay.minecraft.name` (+ ggf. `color`) |
| `gsm-backend/services/serverUpdates.js` | `updateHandlers.minecraft.gameName` |
| `gsm-frontend/src/components/ServerCard.jsx` | `serverInfo.minecraft.links` (Label + CurseForge-URL) |
| `docs/infrastructure.md`, `docs/gsm.md`, `CLAUDE.md` | Modpack-Name/Version |
> **Discord-Update-Meldung:** Ein Modpack-Wechsel löst **keine** automatische Discord-Meldung
> aus — `updateHandlers.minecraft.supportsUpdate` ist `false`, und Meldungen werden nur durch
> `performUpdate()` (manuelle Update-Aktion) oder den internen Endpoint
> `POST /api/servers/discord/internal-update` versendet. Den Endpoint bei einem Modpack-Wechsel
> bewusst **nicht** aufrufen, wenn keine „Update"-Benachrichtigung gewünscht ist. Der
> Status-Embed des Bots zeigt nach dem Deploy einfach den neuen Namen — das ist normale
> Statusanzeige, keine Update-Benachrichtigung.
## Referenz: konkrete Werte StoneBlock 4 (Stand 2026-06)
| | |
|-|-|
| FTB Pack-ID | `130` |
| Version | `1.15.3` (Version-ID `100372`) |
| Minecraft | `1.21.1` |
| Modloader | NeoForge `21.1.233` |
| Java | 21 |
| Heap | `-Xmx8192M` |
| Pflicht | `enable-command-block=true` |

View File

@@ -3,7 +3,7 @@
"servers": [
{
"id": "minecraft",
"name": "Biohazard: Project Genesis | Minecraft",
"name": "FTB StoneBlock 4 | Minecraft",
"host": "192.168.2.51",
"type": "minecraft",
"runtime": "screen",

View File

@@ -16,7 +16,7 @@ const previousPlayerLists = new Map();
// Server display config
const serverDisplay = {
minecraft: { name: 'Biohazard: Project Genesis', icon: '⛏️', color: 0x4A7A2E, address: 'minecraft.zeasy.dev' },
minecraft: { name: 'FTB StoneBlock 4', icon: '⛏️', color: 0x8B8B8B, address: 'minecraft.zeasy.dev' },
factorio: { name: 'Factorio', icon: '⚙️', color: 0xF97316, address: 'factorio.zeasy.dev' },
zomboid: { name: 'Project Zomboid', icon: '🧟', color: 0x4ADE80, address: 'pz.zeasy.dev:16261' },
vrising: { name: 'V Rising', icon: '🧛', color: 0xDC2626, address: 'vrising.zeasy.dev' },

View File

@@ -545,10 +545,10 @@ const updateHandlers = {
}
},
// Minecraft Biohazard - Manual update required (modpack)
// Minecraft FTB StoneBlock 4 - Manual update required (modpack)
minecraft: {
supportsUpdate: false, // Modpacks need manual update
gameName: "Biohazard: Project Genesis"
gameName: "FTB StoneBlock 4"
},
// OpenTTD - Manual update required

View File

@@ -7,7 +7,7 @@ const serverInfo = {
address: 'minecraft.zeasy.dev',
logo: '/minecraft.png',
links: [
{ label: 'Biohazard Modpack', url: 'https://www.curseforge.com/minecraft/modpacks/biohazard-project-genesis' }
{ label: 'FTB StoneBlock 4', url: 'https://www.curseforge.com/minecraft/modpacks/ftb-stoneblock-4' }
]
},
factorio: {