Cluster

Ein Minecraft-Netzwerk über mehrere Server verteilen, verbunden mit einem einzigen Code.

Eine Node ist der Leiter und entscheidet, die anderen sind Worker und führen aus.

Eine Schritt-für-Schritt-Anleitung, wie ein weiterer Server dazukommt, steht unter Eine Node hinzufügen.

Einrichten

Der Leiter muss für die anderen Server erreichbar sein. In seiner mutecloud.toml:

mutecloud.toml (Leiter)
[api]
bind = "0.0.0.0:8770"
token = "..."

Danach gibt ein einziger Befehl auf dem Leiter alles aus, was ein neuer Server braucht:

node join
node join 100.100.20.100

Ohne Adresse wählt der Leiter seine beste eigene, zuerst eine Tailscale-Adresse, dann eine aus dem lokalen Netz. Die Ausgabe ist ein Beitrittscode der Form 10.0.0.1:8770#<token> und je ein fertiger Einzeiler für Linux und für Windows. Auf dem neuen Server reicht dieser Einzeiler: Der Installer lädt MuteCloud herunter, das Setup erkennt den Code, prüft die Verbindung zum Leiter, schlägt die eigene Adresse vor, lehnt bereits vergebene Node-Namen ab, bietet die Gruppen an, die an bestimmte Nodes gebunden sind, und schreibt die Konfiguration als Worker. Läuft der Installer schon, wählst du im Setup „Diese Maschine einem bestehenden Netzwerk hinzufügen“ und fügst den Code ein.

Der Code enthält das Token der Cloud und gehört nur auf Server, die dir gehören. node join verlangt deshalb vollen Zugriff.

Von Hand sieht dasselbe auf dem Worker so aus:

mutecloud.toml (Worker)
host = "10.0.0.2"

[cluster]
role = "worker"
leader = "10.0.0.1:8770"
token = "..."
advertise = "10.0.0.2"

advertise ist die Adresse, unter der die Spielserver dieser Node erreichbar sind. Die Server lauschen darauf, und der Proxy verbindet sich mit dieser Adresse.

Nur privates Netzwerk

Aus Sicherheitsgründen lassen sich Nodes nicht über das offene Internet verbinden. Ein Verbund braucht eine Schnittstelle, über die eine Node Befehle annimmt, Vorlagen samt aller Plugin-Konfigurationen und Passwörter herausgibt und Spielserver startet. Im Internet wäre diese Schnittstelle eine Angriffsfläche, bei der ein einziges abgefangenes oder erratenes Token das ganze Netzwerk öffnet. Dazu kommt, dass der Proxy direkt mit den Spielservern auf den anderen Nodes spricht, und auch diese Server dürfen aus dem Internet nicht erreichbar sein.

MuteCloud setzt das auf beiden Seiten durch. Ein Worker verbindet sich nur mit einem Leiter unter einer privaten Adresse, und schon das Setup lehnt andere Codes bei der Eingabe ab. Der Leiter nimmt Nodes und Vorlagen-Downloads nur aus privaten Netzen an und lehnt auch Anfragen ab, die über einen Reverse Proxy kommen. Privat heißt 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10 und bei IPv6 fc00::/7 und fe80::/10.

Für dieses gemeinsame Netz gibt es viele Wege:

MöglichkeitWann sie passt
Tailscaleam schnellsten eingerichtet, funktioniert durch NAT und an Heimanschlüssen
HeadscaleTailscale mit eigenem Koordinationsserver, ohne Konten bei Dritten
NetBirdoffene Alternative zu Tailscale, lässt sich selbst betreiben
ZeroTiervirtuelles LAN, ebenfalls ohne Portweiterleitung
WireGuardvon Hand eingerichtet, schlank und ohne zusätzliche Dienste, braucht einen offenen UDP-Port
Das private Netz deines Hosting-AnbietersServer beim selben Anbieter, zum Beispiel ein Cloud-Netzwerk oder VLAN
LANalle Server stehen im selben lokalen Netz

Der Steuer-Port 8770 des Leiters wird nur zum privaten Netz hin geöffnet, niemals zum Internet.

Wo was liegt

Dem Leiter gehören Gruppen, Ränge, Rollen, Tokens, Netzwerktexte und der gemeinsame Speicher. Ein Worker leitet jede Anfrage dazu an den Leiter weiter, deshalb lässt sich das Netzwerk von jeder Node aus verwalten.

Vorlagen holt sich jeder Worker selbst. Er vergleicht alle dreißig Sekunden seine Revision mit der des Leiters, lädt nur herunter, was sich geändert hat, entpackt das Archiv neben die vorhandene Kopie und tauscht danach die Verzeichnisse. Schlägt eine Übertragung fehl, bleibt die vorherige Vorlage bestehen.

Platzierung

Gruppen laufen auf jeder Node, sofern nichts anderes festgelegt ist:

nodes = ["node-1"]

Dasselbe zur Laufzeit, von jeder Node aus und ohne Neustart:

groups BedWars set nodes node-1,node-2   genau diese Nodes
groups BedWars set nodes +node-3         eine Node hinzufügen
groups BedWars set nodes -node-3         eine Node entfernen
groups BedWars set nodes all             wieder überall

Wo ein neuer Server startet, richtet sich nach dem freien Arbeitsspeicher. Hat keine Node genug, meldet das Log das höchstens einmal alle fünf Minuten.

node          Zustand dieser Node
node list     alle Nodes mit Arbeitsspeicher und Serverzahl
node reload   die Konfiguration neu einlesen

Verliert eine Node ihre Verbindung, meldet der Webhook das, und die Spieler dieses Proxys werden aus der Spielerliste entfernt.

Auf dieser Seite