Auto-Updates
EternalSystem aktualisiert sich selbst: Die REST-API prüft regelmäßig das öffentliche Release-Repo und meldet neue Versionen in die Datenbank. Proxy, Spigot-Server, API und Dashboard holen sich daraufhin jeweils ihre eigene neue Version. Aktiv wird ein Update immer erst nach einem Neustart der jeweiligen Komponente.
Lizenz: Auto-Updates sind kein eigenes Modul, sie gehören zu core und damit zur kostenlosen Base (wie punishments, reports, lobby). Welche Module frei sind, kann sich ändern – gesperrte Module zeigt das Dashboard ausgegraut.
Was wohin geht
| Komponente | Datei im Release | Installation |
|---|---|---|
| Spigot-Plugin (alle Module) | Eternal-<ver>.jar | nach plugins/update/ – Bukkit tauscht beim nächsten Neustart |
| Proxy | Eternal-<ver>.jar | Jar wird an Ort und Stelle ersetzt, aktiv nach Neustart |
| REST-API | EternalApi-<ver>.jar | eigenes Jar wird ersetzt, aktiv nach Neustart (oder sofort mit restart-on-update) |
| Plugin-Ordner auf dem API-Host | Eternal-<ver>.jar | direkt als Eternal.jar in jeden Ordner aus plugin-dirs |
| Dashboard | eternal-web-<ver>.zip | tools/web-updater auf dem Web-Host, bedient aus dem Dashboard |
Die API fasst das Web-Root des Dashboards nie an – das erledigt der Web-Updater (siehe unten).
Einrichten
1. API (api.yml)
updates:
enabled: true
repo: "LeqitAdam/EternalV1-releases" # öffentliches Release-Repo, leer = keine Prüfung
check-interval-minutes: 60
restart-on-update: false # true: API beendet sich nach dem Tausch (systemd Restart=always nötig)
plugin-dirs: [] # Plugin-Ordner auf diesem Host, die direkt beliefert werden
plugin-jar-name: "Eternal.jar"
enabled: false auf dem API-Host heißt: Die API meldet weiter neue Releases, installiert aber selbst nichts.
2. Server (config.yml auf Proxy und Spigots)
updates:
enabled: true # Standard
check-interval-minutes: 60
3. Dashboard: Server → Updates
Recht: eternal.web.updates (Standard-Stufe Admin, braucht eternal.web.admin).
- Schalter Auto-Update – gilt netzwerkweit.
- Jetzt prüfen und Anzeige des neuesten Releases.
- Tabelle Versionen: installierte Version der REST-API, jedes Plugin-Ordners auf dem API-Host und jedes Servers (offline-Server sind markiert).
- Hinweise, wenn in der
api.ymlupdates.repofehlt oderupdates.enabled: falsegesetzt ist.
Damit eine Komponente wirklich installiert, müssen beide Schalter an sein: updates.enabled lokal und „Auto-Update“ im Dashboard. Ist nur die Prüfung gewünscht, auf dem jeweiligen Host enabled: false setzen.
Plugin-Ordner (plugin-dirs)
Cloud-Services werden bei jedem Start aus ihrem Template gebaut. Ein plugins/update/Eternal.jar im laufenden Service wäre nach dem Neustart weg. Deshalb kopiert die API das Jar direkt in die Ordner, aus denen die Server ihre Plugins beziehen – z. B. CloudNet-Templates oder statische Server auf demselben Host:
updates:
plugin-dirs:
- /home/cloudnet/local/templates/Proxy/default/plugins
- /home/cloudnet/local/templates/Lobby/default/plugins
- /home/cloudnet/local/templates/Survival/default/plugins
plugin-jar-name: "Eternal.jar"
- Ein Download, danach atomarer Tausch in jedem Ordner. Daneben liegt
Eternal.jar.versionals Marker. - Alte
Eternal-<ver>.jarim selben Ordner werden entfernt (sie würden sonst doppelt geladen). - Services bekommen die neue Version beim nächsten Start/Neustart.
- In der
config.ymlinnerhalb der Templatesupdates.enabled: falsesetzen – der Updater im Service würde sonst ins Leere laden. - Statische Server einfach mit ihrem
plugins/-Ordner aufnehmen. Die API schreibt direkt ins Plugin-Verzeichnis, also den Server danach neu starten.
Eternal Cloud: Cloud-Ordner automatisch dabei
Mit cloud.enabled: true in der api.yml ergänzt die API den Cloud-Ordner (cloud.directory, Standard cloud) automatisch in plugin-dirs. Der Node kopiert cloud/Eternal.jar beim Start in jeden Service – damit bekommt jeder neu gestartete Service automatisch die aktuelle Version. Services unter der Eternal Cloud schalten ihren eigenen Updater selbst ab, ein Eintrag in den Templates ist nicht nötig.
cloud:
enabled: true
directory: cloud
updates:
plugin-dirs: [] # der Cloud-Ordner wird automatisch ergänzt
Dashboard (eigener Web-Host)
Läuft das Dashboard auf einem anderen Server als die API, übernimmt dort tools/web-updater/server.mjs die Updates (Node ≥ 18, keine Abhängigkeiten, kein unzip nötig). Bedient wird er im Dashboard unter Server → Wartung (Seite „Dashboard & Wartung“, Recht eternal.web.updates).
Installation
sudo mkdir -p /opt/eternal/web-updater
sudo cp tools/web-updater/server.mjs /opt/eternal/web-updater/
sudo cp tools/web-updater/eternal-web-updater.service /etc/systemd/system/
sudo editor /etc/systemd/system/eternal-web-updater.service # API_URL, WEB_DIR, User
sudo chown -R www-data:www-data /var/www/html/eternal-web # Elternordner von WEB_DIR muss schreibbar sein
sudo systemctl enable --now eternal-web-updater
| Umgebungsvariable | Bedeutung |
|---|---|
PORT, BIND | Lauschadresse, Standard in der Unit: 8099 auf 127.0.0.1 |
API_URL | Adresse der REST-API (für Rechteprüfung und den netzwerkweiten Schalter) |
WEB_DIR | Ordner mit dem ausgelieferten Dashboard |
STATE_DIR | Einstellungen, Verlauf, vorheriger Build (Standard .eternal-updater/ neben WEB_DIR) |
REPO | Fallback-Repo, wenn keine API_URL gesetzt ist |
GITHUB_TOKEN | optional, gegen GitHub-Rate-Limits |
REQUIRED_PERM | Recht für alle Aktionen, Standard eternal.web.updates |
Apache-Beispiel (der Updater hinter dem Dashboard, Wartungsdatei und Version nie cachen):
ProxyPass /updater/ http://127.0.0.1:8099/ connectiontimeout=5 timeout=600
ProxyPassReverse /updater/ http://127.0.0.1:8099/
<Location /updater/>
SetEnv no-gzip 1
</Location>
<FilesMatch "^(maintenance\.json|VERSION)$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
</FilesMatch>
Die FilesMatch-Regel muss nach einer allgemeinen Cache-Regel für .json stehen (die letzte Regel gewinnt).
Funktionen
- Installiert / neues Release einspielen, auch einen bestimmten Tag.
- Rollback auf den vorherigen Build.
- Auto-Update mit Intervall (Standard: aus, alle 15 Minuten, mindestens 5); respektiert zusätzlich den netzwerkweiten Schalter der API (
GET /public/updates). - Verlauf (Updates, Rollbacks, Wartung an/aus, Fehler; 50 Einträge).
- Rechteprüfung: Jeder Request trägt den Dashboard-Token, der Dienst fragt
API_URL/meund verlangteternal.web.updates.
Dateien: WEB_DIR/VERSION (installiertes Release), WEB_DIR/maintenance.json (Wartungsflag), STATE_DIR/updater.json (Einstellungen + Verlauf), STATE_DIR/previous/ (vorheriger Build).
Landing-Seite und Lizenz-Server
Für eigene Installationen von Landing-Seite und Lizenz-Server (beides auf einem Host) gibt es die gleiche Update-Funktion im Landing-Admin → Updates. Sie kann jedes Paket einzeln aktualisieren, zurückrollen und automatisch aktualisieren (Intervall einstellbar). Der Lizenz-Server übernimmt das selbst: Er lädt eternal-landing-<ver>.zip und eternal-license-server-<ver>.zip aus den Releases.
| Paket | Was passiert |
|---|---|
| Landing-Seite | Der Build im Landing-Ordner (LANDING_DIR, Standard /var/www/html/eternal-landing) wird ausgetauscht, der vorherige bleibt für den Rollback. |
| Lizenz-Server | server.mjs/updater.mjs werden ersetzt, dann startet der Dienst neu (systemd Restart=always). state.json, Schlüssel und Token bleiben unangetastet. |
Einmalig einrichten (danach läuft alles über den Admin):
sudo chown -R eternal-license: /var/www/html/eternal-landing
sudo cp tools/license-server/eternal-license.service /etc/systemd/system/ # LANDING_DIR + ReadWritePaths
sudo cp tools/license-server/updater.mjs /opt/eternal/license-server/
sudo systemctl daemon-reload && sudo systemctl restart eternal-license
Wartungsmodus
Auf derselben Seite: Schalter, Nachricht und voraussichtliches Ende. Der Updater schreibt WEB_DIR/maintenance.json; das Dashboard prüft die Datei jede Minute und zeigt allen ohne eternal.web.updates eine Wartungsseite. Während ein Update eingespielt wird, passiert das automatisch. /login bleibt erreichbar, damit Admins hineinkommen; sie sehen oben einen Hinweis „Wartungsmodus aktiv“.
Das ist der Wartungsmodus des Dashboards. Wartung für Spielserver stellt man in der Eternal Cloud pro Task ein (Betreten nur mit eternal.cloud.maintenance).
Versionen
Versionsvergleich: v1.2.3 > 1.2.3-SNAPSHOT > 1.2.2. Das Release-Repo enthält nur Binärdateien; die Updater brauchen keinen Token.
Typische Stolperfallen
- Nichts passiert: Einer der beiden Schalter ist aus, oder
updates.repofehlt in derapi.yml. - Neue Version ist da, aber nicht aktiv: Jar-Tausch wirkt erst nach dem Neustart des Servers bzw. der API.
- Plugin doppelt geladen: Im Plugin-Ordner liegen
Eternal.jarund ein altesEternal-<ver>.jar– die API räumt nur inplugin-dirsauf, in anderen Ordnern von Hand löschen. - Web-Updater kann nicht tauschen: Der Dienst braucht Schreibrechte auf den Elternordner von
WEB_DIR(atomarer Ordnertausch). - Wartungsseite bleibt nach dem Ausschalten:
maintenance.jsonwird gecacht – dieFilesMatch-Regel fehlt oder steht vor der allgemeinen JSON-Regel.