Eternal Cloud
Die Eternal Cloud ist ein eigener Node als Ersatz für CloudNet. Sie steckt im API-Jar (EternalApi-<ver>.jar) und wird in api.yml eingeschaltet (siehe Installation). Sie startet Proxy- und Spielserver aus Templates, verwaltet Server-Versionen und JDKs. Alles Weitere – Tasks, Gruppen, Templates, Versionen, Java, Plugins – läuft im Dashboard unter Cloud.
Die Grund-Einrichtung (JDK, Versionen, „Erste Einrichtung") ist als Schritt 7 in der Installation beschrieben. Diese Seite erklärt die Begriffe und Funktionen dahinter.
Umgebungen und Software
| Umgebung | Software | Plugins/Mods | Hinweis |
|---|---|---|---|
| Minecraft-Server | Paper, Purpur, Folia, Pufferfish, Leaf, Spigot, Vanilla | plugins/ | Eternal-Plugin wird mitgegeben |
| Modded Server | Fabric, Quilt, NeoForge, Forge, SpongeVanilla | mods/ | Pakete von mcjars.app; kein Eternal-Plugin |
| Limbo | LOOHP Limbo | plugins/ | Warte-/Fallback-Server ohne Welt |
| Bedrock-Server | PowerNukkitX | plugins/ | UDP-Port ab 19133, xbox-auth per Task-Property |
| BungeeCord | BungeeCord, Waterfall | plugins/ | Eternal-Proxy-Plugin registriert Backends |
| Velocity | Velocity | plugins/ | Eternal-Plugin wird mitgegeben (dasselbe Eternal.jar), registriert Backends; legacy-Forwarding |
| WaterdogPE | WaterdogPE | plugins/ | Bedrock-Proxy, Backends von Hand in config.yml |
Quellen u. a.: PaperMC Fill (Paper, Folia, Velocity, Waterfall), Purpur-API, Mojang (Vanilla), SpigotMC-Jenkins (BungeeCord), mcjars.app (Spigot, Pufferfish, Leaf, Fabric, Quilt, NeoForge, Forge, Sponge, Limbo), GitHub-Releases (PowerNukkitX, WaterdogPE).
Tasks, Gruppen, Templates
| Begriff | Bedeutung |
|---|---|
| Task | Bauplan für Services: Umgebung, Version, Templates, Gruppen, RAM, Java, Min/Max-Anzahl, Ports, statisch/dynamisch, Auto-Stop, Fallback, Wartung. Services heißen <Task>-<Nr>. |
| Gruppe | Hängt Templates, JVM-Flags und Prozess-Argumente an mehrere Tasks (per Name oder per Umgebung: Global-Server trifft alle Minecraft-Server). |
| Template | Ordner cloud/templates/<Prefix>/<Name>/, wird beim Start in den Service kopiert. Plugins nach plugins/, Welten als Ordner. Dateibrowser und Editor im Dashboard; SFTP geht genauso. |
| Fallback | Task-Schalter. Der Proxy schickt Spieler beim Join, bei Kick/Crash und per /hub, /lobby, /l auf den leersten Fallback-Service. |
| Wartung | Task-Schalter. Betreten nur mit eternal.cloud.maintenance. |
| Sichtweite | Task-Feld (2–32 Chunks) für view-distance, dazu die Simulationsweite; leer = was in server.properties steht. Ab 16 Chunks hebt der Node Papers Nachlade-Tempo an (75 → 400 Chunks/s pro Spieler, nur wenn noch der Paper-Standard eingetragen ist) – sonst dauern 32 Chunks fast eine Minute. |
| Whitelist | Auf Cloud-Servern immer aus: der Node schreibt bei jedem Start white-list=false, das Plugin schaltet sie ab und lehnt /whitelist on ab. Zum Abschließen gibt es Wartung. |
Statisch vs. dynamisch
- Dynamischer Service: Ordner
cloud/services/<Name>/, wird bei jedem Start aus den Templates gebaut und nach dem Stopp gelöscht. - Statischer Service: Ordner
cloud/static/<Task>/<Name>/, bleibt erhalten (wichtig für Welten!). Templates nur beim ersten Start, außer ein Eintrag istalwaysCopy. Im Dashboard unter Services → „Statische Services" mit Dateibrowser.
Setup-Modus (dynamische Tasks)
Nur eine neue Lobby-Karte? Die lädst du einfacher unter Welten → Lobby-Karte hoch, siehe Lobby – ohne Setup-Server.
Dynamische Server (Lobby, Minispiele …) starten jedes Mal frisch aus dem Template. Zum Aufbauen gibt es unter Cloud → Tasks → Task den Setup-Modus:
- Setup starten: Ein zusätzlicher Server
<Task>-Setup-1startet aus den Templates des Tasks. Er behält seinen Ordner, läuft im Wartungsmodus (nur miteternal.cloud.maintenance) und ist kein Fallback. Die normalen Services laufen weiter. - Aufbauen: mit
/server <Task>-Setup-1drauf, bauen, Plugins einstellen, z. B. den Lobby-Spawn setzen. - Setup abschließen: Der Server speichert, stoppt, und sein Ordner (Welten, Plugin-Einstellungen) wird ins Template kopiert. Logs, Server-Jar, Crash-Reports und die Eternal-Datenbank bleiben draußen. Auf Wunsch starten die laufenden Services danach neu.
- Verwerfen stoppt den Setup-Server und löscht ihn, nichts wird übernommen.
Ziel ist das Template, das wie der Task heißt, sonst das letzte des Tasks. Bei mehreren Templates lässt es sich vorher wählen. Proxys, statische Tasks und Spielmodi (die haben ihr eigenes Setup) haben keinen Setup-Modus.
Versionen & Java
- Cloud → Java: JDKs installieren (Adoptium/Temurin). Der Node wählt beim Start automatisch ein passendes Java nach den Versions-Grenzen: 1.8–1.16 → 17 (das Eternal-Plugin braucht Java 17; Paper prüft dann seine Java-Version nicht), 1.17 → 16+, 1.18–1.20.4 → 17+, 1.20.5–1.21 → 21+, 26.x → 25+ (oder die Task-Vorgabe).
- Cloud → Versionen: Server-Software installieren. Paper-Jars werden einmal vorgepatcht (
cache/,versions/,libraries/), ein Service-Start ist danach nur noch Kopieren.
Node: RAM-Budget und Neustart
Oben in der Cloud steht der RAM, den die laufenden Services belegen, neben dem Budget der Node. Mit eternal.web.cloud.manage passt du beides im Dashboard an:
- RAM-Budget: ein Klick auf die RAM-Anzeige. Das Budget gilt für alle Services zusammen, 0 = unbegrenzt. Es wirkt sofort: Neue Starts werden daran gemessen, laufende Services laufen weiter. Gespeichert wird es in der
api.yml(cloud.max-memory-mb), es bleibt also auch nach einem Neustart. - Node neu starten: startet API und Cloud neu. Alle Services dieser Node werden gestoppt, die Spieler fliegen raus, danach kommen die Services mit ihrer Mindestanzahl wieder. Das klappt nur, wenn die API unter einem Dienst-Manager läuft, also systemd mit
Restart=always(wie intools/api/eternal-api.service) oder Docker mit Restart-Policy. Erkennt das Dashboard keinen, warnt es vorher. Unter einem anderen Manager setzt duETERNAL_SUPERVISED=1, dann entfällt die Warnung.
Smart-Skalierung
Im Task-Editor:
preparedServicesbaut Service-Ordner vorab (Status PREPARED, kein JVM) – ein Start ist dann nur noch der JVM-Start.percentOfPlayersForNewServicestartet bei dieser mittleren Auslastung einen weiteren Service (Abstand überstartDelaySeconds).autoStopEmptySecondsstoppt leere Extras, nie unterminServiceCount.replaceIngame: Services im Status INGAME zählen nicht zum Minimum, es wird nachgestartet.
Ingame-Status: /service ingame (Recht eternal.cloud.service) nimmt einen Service aus dem Fallback-Pool; /service lobby gibt ihn frei; /service extra <Text> setzt einen Status-Text.
Deployments & Inclusions
- Deployments: beim Stopp (oder per „Deploy" im Dashboard; vorher
save-all) wird der Service-Ordner in angegebene Templates kopiert. Nie kopiert:server.jar,cache/,libraries/,versions/,logs/,session.lock,server.properties, Eternal-Datenbank; dazu eigene Ausschlüsse (ordner/,datei,*.log). - Inclusions: URLs, die vor dem Start in den Service geladen werden (Karten-Zip, Plugin-Jar);
cachehält sie untertemp/inclusions/. - Nach dem Stopp löschen: relative Pfade, die vor den Deployments entfernt werden.
Cluster (mehrere Nodes)
Mehrere Rechner, ein Dashboard:
- Der Head ist der normale Node mit Dashboard und Datenbank. Er entscheidet, welcher Node welchen Service bekommt.
- Worker führen nur Services aus. Sie haben keinen eigenen HTTP-Port und kein Dashboard.
Einrichten:
- Head: in seiner
api.ymleinschalten, dann die API neu starten. Das Cluster-Secret entsteht incluster-secret.txt.
``yaml cluster: enabled: true role: head ``
- Worker: auf dem neuen Rechner Java 21+ installieren und das API-Jar ablegen.
- api.yml des Heads kopieren. Der Worker braucht dieselbe
database(MySQL) und dasselbeinternal.shared-secret, weil Tasks und Gruppen damit signiert in der Datenbank liegen. - Anpassen:
cloud.node-name- die Adressen (
host-address,backend-address,public-address) cloud.api-url: die API des Heads, so wie die Server sie erreichen- den Block aus Cloud → Nodes → Worker hinzufügen einfügen (mit Head-URL und Secret)
- Starten, am besten als Dienst wie den Head. Der Worker erscheint unter Cloud → Nodes.
So verteilt der Head:
- Neue Services gehen auf den erlaubten Node mit dem meisten freien RAM-Budget. Welche Nodes erlaubt sind, steht im Task unter Nodes (leer = alle).
- Docker-Tasks gehen nur auf Nodes mit Docker.
- Statische Services bleiben auf dem Node, der ihren Ordner hat.
- Was der Worker selbst holt: Templates (nur geänderte, per Hash verglichen),
cloud/Eternal.jarund fehlende Server-Versionen. - Was zum Head zurückgeht: Deployments landen in den Templates des Heads, Dumps und Crash-Reports unter Cloud → Reports.
- Alles im Dashboard: Konsole, Befehle, Stop, Neustart, Kill und Dumps funktionieren für jeden Service wie bei einem lokalen.
- Spieler: Die Server auf Workern melden sich beim Head an. Proxys bekommen alle Backends mit der Backend-Adresse ihres Nodes.
Wenn ein Worker wegbricht:
- Seine Services bleiben 2 Minuten in der Liste, sie laufen ja vermutlich weiter.
- Kommt er zurück, gleicht der Head ab.
- Bleibt er weg, schreibt der Head die Services ab und startet Ersatz auf anderen Nodes.
- Startet ein Node nach einem Absturz neu, beendet er Server-Prozesse, die vom letzten Lauf übrig sind. Das gilt für jeden Node, auch ohne Cluster.
Cloud → Nodes zeigt alle Nodes mit RAM, Services, Docker, Adressen und Version. Dort setzt du das RAM-Budget eines Workers und entfernst getrennte Worker.
Ein anderes internal.shared-secret auf dem Worker erkennt der Head. Die Nodes-Seite zeigt es rot an: Der Worker liest dann keine Tasks. Die api.yml vom Head übernehmen.
Docker-Services
Statt einer JVM auf dem Node läuft jeder Service eines Tasks in einem eigenen Docker-Container. Einstellen kannst du das im Task-Editor unter Ressourcen → Laufzeit: Docker-Container.
- Image: leer bedeutet
eclipse-temurin:<Java>-jre. Die Java-Version kommt aus der Task-Vorgabe oder automatisch aus der Server-Version, z. B. 21 für 1.21. - Eigenes Image: möglich, z. B.
eclipse-temurin:21-jdk. Dann gehen auch Heap-Dumps. - Ordner: Der Service-Ordner wird unter demselben Pfad eingebunden. Templates, Deployments, statische Services, Konsole, Befehle und Logs funktionieren wie gewohnt.
- Netz: Der Container nutzt das Host-Netz, der Server hört also auf dem Port, den der Node vergibt. Proxy und API erreichen ihn wie einen normalen Prozess.
- Sicherheit:
- Der Container läuft als Service-Benutzer (
run-as-user), ohne Linux-Capabilities und mitno-new-privileges. - Das Speicherlimit ist RAM + 25 % (mindestens + 256 MB).
- Zugangsdaten gehen über eine Env-Datei, die nach dem Start gelöscht wird. Auf der Kommandozeile stehen sie nie.
- Der Container läuft als Service-Benutzer (
- Aufräumen: Stop und Kill entfernen den Container. Bleibt nach einem Node-Absturz einer übrig, entfernt der Node ihn beim nächsten Start.
Docker-Services brauchen einen Linux-Node mit Docker (der docker-Befehl muss für die API funktionieren). Unter Docker Desktop (Mac/Windows) ist „Host-Netz“ die interne VM. Der Server startet dort zwar, ist aber weder für die API noch für den Proxy erreichbar. Die Cloud-Übersicht zeigt, ob der Node Docker hat.
Speicherplatz
Eine volle Festplatte bricht alles: Welten speichern nicht mehr, und jede Konsole ist voller Fehler. Die Cloud passt darauf auf:
- Anzeige: Im Kopf von Cloud steht der freie Platz. Unter 5 GB wird er rot, dazu kommt ein Hinweis und alle 10 Minuten eine Warnung im Log.
- Unter 1 GB startet kein Service mehr, weder automatisch noch per Hand. Laufende Services laufen weiter.
- Aufräumen (stündlich, bei knappem Platz alle 5 Minuten): alte Logs (je 30 behalten), Spark-Temp-Dateien, Crash-Reports (je 10 behalten), Heap-Dumps (
*.hprof) älter als ein Tag, alte Dateien im Temp-Ordner. - Spark: Der mitgelieferte Profiler von Paper nimmt im Hintergrund dauernd auf. Die Cloud schaltet diese Hintergrund-Aufnahme aus (
plugins/spark/config.json→backgroundProfiler: false)./spark profilergeht weiter. Steht der Schlüssel schon in der Datei, bleibt er unverändert. - Was sonst Platz frisst (Backups, Welten, Datenbank), zeigt auf dem Server
du -xh -d1 / | sort -h | tail.
Backups
Cloud → Backups sichert automatisch:
- die Cloud: Templates, Tasks, Gruppen,
api.yml(Passwörter entfernt) und die H2-Datenbank - jeden statischen Server (Welten!)
Zeitplan: Abstand und Uhrzeit, so viele Zips pro Ziel behalten, Ordner. Laufende Minecraft-Server speichern vorher und pausieren das Autosave, solange gezippt wird.
Pro Backup: herunterladen, vor dem Löschen schützen (Pin), wiederherstellen (der alte Stand bleibt als <Name>.before-restore) oder ein eigenes Zip hochladen.
Im Cluster: Statische Server auf Workern erscheinen mit @ <Node>.
- Sichern: Der Worker zippt den Ordner und schickt das Zip an den Head.
- Wiederherstellen: Der Worker holt das Zip vom Head und spielt es auf seinem Rechner ein.
Offsite (S3)
Unter Offsite (S3) wandert jedes neue Backup zusätzlich in einen S3-Bucket. Fällt der Rechner aus, liegen die Sicherungen dann woanders.
| Feld | Bedeutung |
|---|---|
| Endpunkt | leer für AWS S3, sonst die URL des Anbieters: Backblaze B2 https://s3.<region>.backblazeb2.com, Cloudflare R2 https://<konto>.r2.cloudflarestorage.com, Wasabi, MinIO http://minio:9000 |
| Region | z. B. eu-central-1; R2: auto |
| Bucket, Access-Key, Secret-Key | Zugangsdaten mit Schreib-, Lese- und Löschrecht auf den Bucket |
| Ordner im Bucket | Präfix, z. B. eternal |
| Behalten pro Ziel (S3) | so viele Backups pro Ziel bleiben im Bucket; geschützte zählen nicht mit |
Verbindung testen schreibt, listet und löscht ein kleines Testobjekt. Der Secret-Key bleibt auf dem Node, das Dashboard zeigt nur ********. Hochgeladen wird gestreamt, ein großes Welt-Backup belegt also keinen Arbeitsspeicher (bis 5 GB pro Datei).
Metriken (Prometheus, InfluxDB)
Für Grafana & Co. in der api.yml des Heads:
metrics:
enabled: true
token: "lange-zufallszeichenkette" # mindestens 16 Zeichen
influx: # optional
url: "http://127.0.0.1:8086"
org: "meine-org"
bucket: "eternal"
token: "influx-token"
interval-seconds: 30
- Prometheus:
GET /metricsmitAuthorization: Bearer <token>oder?token=<token>. - InfluxDB 2: Mit
influx.urlgehen dieselben Werte alleinterval-secondsan die Write-API (Line-Protokoll).
| Metrik | Inhalt |
|---|---|
eternal_services{task,node,state} | Anzahl Services je Task, Node und Zustand |
eternal_service_players · _max_players · _memory_mb · _running · _uptime_seconds | pro Service |
eternal_players_online | Spieler auf allen Proxys |
eternal_node_online · _memory_used_mb · _memory_budget_mb | pro Node (Head und Worker) |
eternal_api_heap_used_bytes · _heap_max_bytes · _uptime_seconds | die API selbst |
Reports & Dumps
Cloud → Reports:
- Node-Report: ein Zip mit
- Node-, Betriebssystem-, Java-, Speicher- und Plattenangaben
- allen Services, Tasks und Gruppen (Passwörter, Tokens und Schlüssel maskiert)
- dem Node-Log und den Threads der API
- den letzten 1000 Konsolenzeilen jedes laufenden Services
- Crash-Report: entsteht automatisch, wenn ein Service beim Start stirbt oder mit einem Fehlercode endet (nicht bei Stop/Kill). Darin stehen die letzten Konsolenzeilen,
logs/latest.log, die neuestencrash-reports/undhs_err_pid*.log. Er entsteht vor dem Löschen des Ordners, die Beweise bleiben also erhalten. - Thread-Dump und Heap-Dump: in der Konsole eines Services (Cloud → Service öffnen).
- Der Thread-Dump zeigt, wo ein hängender Server feststeckt. Er läuft über
jcmddes Service-Javas, sonst überSIGQUIT. - Der Heap-Dump (
.hprof) ist so groß wie der belegte RAM, der Server hält beim Schreiben kurz an. Er braucht ein JDK, kein reines JRE.
- Der Thread-Dump zeigt, wo ein hängender Server feststeckt. Er läuft über
Es bleiben die neuesten 30 Dateien. Download und Löschen gehen auf der Seite, das Recht ist eternal.web.cloud.manage (nur im Dashboard, nicht ingame).
Plugins von außen
Cloud → Plugins: Bibliothek cloud/plugins/ (Upload im Dashboard oder per SFTP). Das Dashboard liest plugin.yml/bungee.yml/velocity-plugin.json und zeigt Name, Version und die Templates, in denen das Plugin liegt. „Installieren" kopiert das Jar in die gewählten Templates und entfernt dort ältere Versionen. Der Katalog sucht auf Modrinth; ohne Suchbegriff zeigt er Empfehlungen in vier Gruppen:
| Gruppe | Plugins |
|---|---|
| Welt & Bau | WorldEdit, FastAsyncWorldEdit, WorldGuard, Multiverse-Core/-Inventories/-Portals, Chunky, CraftBook |
| CityBuild | PlotSquared, CoreProtect, GriefPrevention, QuickShop-Hikari, ChestShop, zAuctionHouse, PlayerVaultsX, GSit, SilkSpawners, Head Database, CrazyCrates, VeinMiner, Sleeper, ChestSort, DecentHolograms |
| Lobby | Citizens, FancyNpcs, FancyHolograms, DeluxeHub, DeluxeMenus, CommandPanels, UltraCosmetics, SkinsRestorer, TAB, ajQueue, ajLeaderboards, ImageFrame, Parkour |
| Technik | PlaceholderAPI, VaultUnlocked, ProtocolLib, PacketEvents, NBT-API, ViaVersion/-Backwards/-Rewind, spark, Geyser, Floodgate, Simple Voice Chat, BlueMap, Dynmap, DiscordSRV, Grim, LuckPerms, EssentialsX |
Modrinth-Plugins: Version wählen → Herunterladen (ein Klick, landet in der Bibliothek) → in Templates installieren. In der Versionsliste ist die Version, die schon in der Bibliothek liegt, als In Bibliothek markiert, eine in Templates installierte als Installiert (mit den Templates).
Auto-Update
Die Leiste Auto-Update in der Bibliothek hält Plugins von Modrinth aktuell:
- Jede Jar der Bibliothek wird an ihrer Prüfsumme bei Modrinth erkannt, auch hochgeladene oder per URL geladene Modrinth-Builds. Jars, die Modrinth nicht kennt (PlotSquared, Citizens, eigene Builds), zeigen „ohne Auto-Update“.
- Geprüft wird alle 6 Stunden und mit Jetzt prüfen. Gesucht wird der neueste Build für dieselben Loader und die Minecraft-Version der Tasks, deren Templates das Plugin haben (Proxy-Plugins: jede Version). Ein Build ist nie instabiler als der installierte (Release bleibt Release).
- für alle Plugins schaltet Auto-Update für jedes Plugin ohne eigene Einstellung. Das Pfeil-Symbol in der Zeile schaltet es nur für dieses Plugin.
- Ohne Auto-Update zeigt die Zeile Update verfügbar mit dem Knopf Aktualisieren.
- Ein Update lädt die Jar von Modrinth, prüft die SHA-512-Prüfsumme und ersetzt sie in der Bibliothek und in allen Templates, die das Plugin hatten. Laufende Server behalten die alte Jar bis zum nächsten Neustart. Bis dahin steht „Update installiert · wirkt nach Neustart“.
- Verlauf listet jedes Update (wer, von → nach, Templates, Fehler) und ist durchsuchbar. Gespeichert wird alles in
cloud/plugins/.updates.json.
PlotSquared und Citizens gibt es auf keiner Download-API (PlotSquared nur auf SpigotMC, Citizens auf dem eigenen Jenkins). Ihre Karten verlinken die Download-Seite. Die Jar dann hochladen oder den direkten Jar-Link unter Bibliothek → Von URL laden einfügen (nur https, interne Adressen gesperrt, max. 200 MB). PlotSquared braucht WorldEdit oder FAWE.
Schilder, NPCs, Navigator
Lobbys bekommen die Service-Liste vom Node per Push – ohne Cloud bleibt das aus.
- Schilder:
/cloudsign set <Task>auf ein Schild schauend (Rechteternal.cloud.signs). Die Services eines Tasks verteilen sich auf seine Schilder; Rechtsklick verbindet. Zustände SEARCHING, STARTING, EMPTY, ONLINE, FULL, INGAME, MAINTENANCE mit eigenen Frames; Layout im Dashboard → Cloud → Schilder & NPCs. - NPCs:
/cloudnpc create <Task> [Entity|PLAYER[:Skin]] [OPEN_MENU|CONNECT_BEST|CONNECT_LOWEST|CONNECT_RANDOM](Rechteternal.cloud.npcs). Das NPC ist eingefroren, hat ein Hologramm (%task% %online% %services%), und ein Rechtsklick öffnet das Service-Menü oder verbindet.- Spieler-NPC mit Skin (Standard ab Minecraft 1.21.9/Paper, ein Mannequin; auf älteren Servern steht bis zum Update ein Villager da). Ohne Angabe bekommt das NPC den vorgeladenen Skin des Spielmodus — passend zum Task-Namen: Lobby, CityBuild, Survival, Farmwelt, SkyBlock, BedWars, SkyWars, SkyPvP, TTT, PvP, UHC, Build, Minigames, Event, Zombie.
PLAYER:<Vorlage>wählt eine Vorlage (z. B.PLAYER:bedwars),PLAYER:<Spielername>den Skin eines beliebigen Spielers (z. B.PLAYER:Notch). Die Skins werden vom Server selbst geladen, sie erscheinen also auch im Offline-Modus hinter dem Proxy. - Im Dashboard (Cloud → Schilder & NPCs → NPC bearbeiten → Aussehen): Spieler oder Mob, dann Skin — passend zum Task, eine der Vorlagen oder ein Spielername, mit Kopf-Vorschau.
- Spieler-NPC mit Skin (Standard ab Minecraft 1.21.9/Paper, ein Mannequin; auf älteren Servern steht bis zum Update ein Villager da). Ohne Angabe bekommt das NPC den vorgeladenen Skin des Spielmodus — passend zum Task-Namen: Lobby, CityBuild, Survival, Farmwelt, SkyBlock, BedWars, SkyWars, SkyPvP, TTT, PvP, UHC, Build, Minigames, Event, Zombie.
- Navigator (Lobby-Modul):
server: "task:BedWars"statt eines festen Servernamens verbindet zum besten Service des Tasks.
Gespeichert wird alles netzwerkweit in der Datenbank, je Lobby-Servername.
Proxy-Anzeige
Netzwerk › Proxy-Anzeige (SyncProxy-Ersatz), gespeichert in der Datenbank, jeder Proxy liest alle 5 s nach – mit oder ohne Cloud-Node:
- MOTD-Frames mit Animation und eigenen Wartungs-MOTDs.
- Tab-Header/-Footer mit Platzhaltern
%online% %max% %proxy% %player% %server% %task% %ping% %version% %time%. - Slots: fester Wert, Listener-Limit oder Auto-Slot; voll → Kick-Text,
eternal.cloud.joinfulldarf trotzdem. - Wartung mit Whitelist (Namen/UUIDs);
eternal.cloud.maintenancekommt durch.
Module und Rechte je Task
Mit Cloud gelten zwei Einstellungen pro Task statt pro Server – neue Services eines Tasks starten so gleich richtig:
- Einrichtung › Module (
eternal.web.modules): Module für alle Services eines Tasks. Ein einzelner Server mit eigener Einstellung (Liste „Einzelne Server“) geht seinem Task vor; ohne Cloud steht die Seite wie bisher im Dashboard unter Server › Module (pro Server). - Ränge & Rechte › Rechte je Task (
eternal.web.perms): Rechte, die ein Rang oder ein Spieler nur auf den Services eines Tasks hat (z. B. WorldEdit nur auf dem Bauserver).
Was wo steht
Läuft die Cloud (und darf das Konto sie nutzen), liegt alles, was zum Netzwerk gehört, im Cloud-Bereich: Logs, Live-Ansicht, Karte, Welten, Lobby-Karte, Welt-Regeln, Proxy-Anzeige, Module. Alles zu Rängen und Rechten hat einen eigenen Bereich Ränge & Rechte in der Leiste oben (/perms): Rollen & Rechte, Benutzer & Ränge, Rechte je Task, Rechte-Anfragen, Rechte bestellen und den Rechte-Katalog; alte Adressen (/admin/users …) leiten dorthin. Im Dashboard bleibt nur, was mit der Cloud nichts zu tun hat. Ohne Cloud gibt es keinen Cloud-Bereich – dieselben Seiten (Logs, Welten, Proxy-Anzeige …) stehen dann im Dashboard. Die Adressen (/cloud/logs …) sind in beiden Fällen gleich.
Logs, Farmwelten, Welt-Regeln
Diese Seiten gehen auch ohne Cloud-Node (dann im Dashboard):
- Betrieb › Live-Ansicht (
eternal.web.live): Server live in 3D ansehen, siehe Replays. - Betrieb › Logs (
eternal.web.logs): API, Cloud-Node, Live-Konsolen und Log-Dateien aller Server. Pro Server werden die letzten 30 rotierten Logs aufgehoben (ältere löscht der Node stündlich automatisch, ebenso im Archiv gestoppter dynamischer Services); in der Übersicht stehen die letzten 7, der Link „ältere Logs laden“ öffnet die vollständige Liste. - Welten › Farmwelten (
eternal.web.farm), siehe Farmwelten. - Welten › Lobby-Karte (
eternal.web.lobbymap), siehe Lobby. - Welten › Welt-Regeln (
eternal.web.worldrules), siehe Einstellungen.
Ohne eternal.web.cloud stehen diese Seiten im Dashboard.
Player-Executor
Dashboard → Services → Spielername: verbinden, kicken, Nachricht schicken, Befehl ausführen. Der Node reicht das an alle angemeldeten Proxys weiter.
Ingame verwalten (/cloud)
Auf jedem Cloud-Service öffnet /cloud ein Menü mit dem Node-Status, allen Tasks und Services. Darin:
- Task: Service starten, min./max. Anzahl (Links +1, Rechts −1), RAM (±256 MB, Shift ±1024), max. Spieler, Wartung, Fallback, Offline, Version, löschen (Shift+Klick, dann bestätigen).
- Service: betreten, neu starten, stoppen (Shift = hart beenden), Konsole (Befehl in den Chat), letzte Log-Zeilen, offline schalten, Liste der Spieler.
Alles geht auch als Befehl: /cloud tasks | services | status, /cloud start <Task> [n], /cloud stop|restart|kill|join <Service>, /cloud cmd <Service> <Befehl>, /cloud log <Service> [Zeilen], /cloud task <Task> <min|max|memory|players|version|java|port|maintenance|fallback|static|offline> <Wert>, /cloud create <Name> <server|proxy|velocity|limbo> <Version> [RAM], /cloud delete <Task> confirm, /cloud groups | templates | versions [Software].
Ingame gelten dieselben Rechte wie im Dashboard: /cloud selbst braucht eternal.cloud.admin, jede Aktion zusätzlich eternal.web.cloud (ansehen), .manage (ändern) oder .console (Konsole, Log). Der Server ruft die API mit seinem Service-Token im Namen des Spielers auf; der Node akzeptiert das nur, solange genau dieser Spieler (Name und UUID) auf genau diesem Service online ist, und nur für /cloud/….
Der Push-Kanal (REST & WebSocket)
Alles unter /cloud/* (Dashboard-Token) bzw. /cloud/internal/* (Plugin-Secret). Live-Konsole über ws://…/cloud/ws/console/<Service>?token=…, Service-Push über /cloud/ws/services. Hinter Apache/nginx müssen diese WebSockets durchgereicht werden – die Snippets dafür stehen in der Installation.
Sicherheit
Die API läuft als root (JDK-Installation, niedrige Ports) und startet fremde Server-Jars. Das Wichtigste:
- Run-as-user: Game-Server laufen per
runuseralscloud.run-as-user, nicht als root. Ohne gesetzten Benutzer verweigert der Node den Start (außerallow-root-services: true). Beim Einrichten unbedingt setzen – siehe Installation. - Rechte sind faktisch Shell-Zugriff:
eternal.web.cloud.manageund.consoleerlauben JVM-Flags, Plugins und Konsole als Service-Benutzer – nur an Owner geben (siehe Rechte). - Netzwerk: nur der Proxy-Port gehört nach außen. Backends binden auf
127.0.0.1mitonline-mode=falseund dürfen nie aus dem Internet erreichbar sein. - Signierte Konfiguration: Task-/Gruppen-Rows in der DB sind HMAC-signiert; ein DB-Schreiber kann keine JVM-Flags oder Inclusions einschleusen.
- Pro Service ein Token statt des Netzwerk-Schlüssels; Downloads nur über HTTPS mit Prüfsumme;
api.ymlwird600geschrieben.
Rechte
eternal.web.cloud (ansehen), eternal.web.cloud.manage (ändern, starten, stoppen, installieren), eternal.web.cloud.console (Konsole + Befehle), eternal.web.cloud.java (JDKs), eternal.cloud.maintenance (Wartung betreten). Vollständig unter Rechte.
Grenzen
- Worker brauchen dieselbe MySQL wie der Head. Mit H2 bleibt die Cloud auf einem Node.
- Das Eternal-Plugin läuft auf Spigot/Paper 1.8.8 bis 26.x und braucht Java 17 oder neuer. Der Node startet 1.8–1.16 deshalb automatisch mit Java 17 – außer in der Task steht eine feste ältere Java-Version, dann lädt das Plugin nicht (siehe Versionen).
Weiter
- Installation & Einrichtung – von Grund auf aufsetzen.
- Auto-Updates – das Plugin-Jar in den Templates aktuell halten.