Zum Hauptinhalt springen

Was ist der Controller?

Der Controller ist das Gehirn von SimpleCloud - ein verteilter Orchestrierungsdienst, der den gewünschten Zustand deiner Minecraft-Infrastruktur verwaltet. Er koordiniert Serverhosts, pflegt Konfigurationen und stellt APIs für die Verwaltung bereit.

Hauptaufgaben

Zustandsverwaltung

Der Controller pflegt den autoritativen Zustand von:
  • Networks - Registrierte Minecraft-Netzwerke mit Credentials
  • Blueprints - Server-Konfigurationsvorlagen
  • Groups - Skalierbare Server-Sammlungen mit Auto-Scaling-Regeln
  • Servers - Laufende Server-Instanzen und deren Status
  • Persistent Servers - Langlebige dedizierte Server
  • Serverhosts - Verbundene Ausführungsagenten
  • Plugins - Plugin-Definitionen und Zuweisungen

Reconciliation Loop

Der Controller gleicht kontinuierlich gewünschten mit aktuellem Zustand ab:
  1. Vergleicht alle 5 Sekunden Konfiguration mit laufenden Servern
  2. Bestimmt, welche Server gestartet oder gestoppt werden müssen
  3. Wählt optimale Serverhosts basierend auf Kapazität und Präferenzen
  4. Sendet Befehle an Serverhosts via NATS-Messaging
  5. Verarbeitet Status-Updates von Serverhosts

API-Dienste

Der Controller stellt eine REST-API auf Port 1337 bereit:
EndpointBeschreibung
/v0/server-groupsGruppen-Verwaltung
/v0/serversServer-Operationen
/v0/persistent-serversPersistente Server-Verwaltung
/v0/blueprintsBlueprint-Konfiguration
/v0/serverhostsServerhost-Registrierung
/v0/pluginsPlugin-Verwaltung
/v0/networksNetzwerk-Registrierung
API-Dokumentation ist verfügbar unter http://localhost:1337/swagger/index.html.

Architektur

Verteiltes Design

Leader Election

Mehrere Controller-Instanzen können gleichzeitig für Hochverfügbarkeit laufen:
  • Datenbankgestützte Konsensbildung mit 30-Sekunden-Lease
  • Nur der Leader führt Netzwerkzuweisungen und kritische Operationen durch
  • Automatisches Failover, wenn der Leader nicht verfügbar wird
  • Alle Instanzen können API-Anfragen bedienen

Netzwerk-Zuweisung

Netzwerke werden über Controller verteilt:
  • Jedes Netzwerk wird einem Controller für Lifecycle-Management zugewiesen
  • Zuweisung berücksichtigt Controller-Last und Serverhost-Konnektivität
  • Automatische Neuzuweisung, wenn ein Controller inaktiv wird

Server-Lebenszyklus

Server folgen dieser Zustandsmaschine:
ZustandBeschreibung
QUEUEDWartet auf Scheduling
PREPARINGServerhost bereitet Dateien vor
STARTINGServer-Prozess startet
AVAILABLEBereit für Spieler
INGAMELäuft mit Spielern
STOPPINGGraceful Shutdown
CLEANUPRessourcen werden entfernt
STOPPEDServer beendet

Auto-Scaling

Der Controller unterstützt automatische Skalierung basierend auf:

Slot-basierte Skalierung

Skalierung basierend auf verfügbaren Spieler-Slots:
scaling:
  mode: SLOTS
  min_servers: 1
  max_servers: 5
  player_threshold: 0.8  # Skaliert hoch bei 80% Auslastung

Server-basierte Skalierung

Feste Anzahl von Servern beibehalten:
scaling:
  mode: SERVER
  min_servers: 2
  max_servers: 2

Kommunikation

NATS Topics

Der Controller nutzt NATS für Serverhost-Kommunikation:
Topic-MusterZweck
{networkId}.serverhost.{id}.startServer-Start-Anfrage
{networkId}.server.{id}.statusServer-Status-Updates
{networkId}.server.{id}.stoppedServer-gestoppt-Events
{networkId}.internal.serverhost.{id}.keep-aliveHealth Checks

Keep-Alive Protokoll

Serverhosts senden periodische Keep-Alive-Nachrichten:
  • Controller verfolgt letzten Heartbeat pro Serverhost
  • Inaktive Serverhosts werden als nicht verfügbar markiert
  • Controller kann Serverhost-Updates anfordern

Infrastruktur-Anforderungen

KomponenteZweckErforderlich
PostgreSQLZustandspersistenzJa
NATSServerhost-MessagingJa
Valkey/RedisMetriken-CachingOptional
ClickHouseLog-SpeicherungOptional

Zugriff auf den Controller

Via CLI

# Controller-Status prüfen
sc status

# Controller-Logs anzeigen
sc logs controller

# An Controller-Konsole anhängen
sc attach controller

Via API

# Alle Gruppen auflisten
curl -H "X-Network-ID: dein-netzwerk" \
     -H "X-Network-Secret: dein-secret" \
     http://localhost:1337/v0/server-groups

# Server starten
curl -X POST \
     -H "X-Network-ID: dein-netzwerk" \
     -H "X-Network-Secret: dein-secret" \
     -H "Content-Type: application/json" \
     -d '{"group_id": "lobby"}' \
     http://localhost:1337/v0/servers

Hochverfügbarkeit

Für Produktionsumgebungen:
  • Mehrere Controller-Instanzen hinter einem Load Balancer betreiben
  • Managed PostgreSQL mit Replikation verwenden
  • NATS-Clustering für Nachrichtenzuverlässigkeit konfigurieren
  • Valkey/Redis für verteiltes Caching aktivieren
Der Controller muss laufen, damit neue Server starten können. Bestehende Server laufen weiter, wenn der Controller temporär offline ist.