Skip to content

Backend & API

Das Backend implementiert alle Anwendungsfälle über Express-Routen, Socket.IO für Echtzeit-Events und eine SQLite-Datenbank als Persistenzschicht. Dieser Abschnitt fasst die wichtigsten Module, Entitäten und Endpunkte zusammen.

Laufzeit & Einstiegspunkte

  • backend/index.js initialisiert Express, Socket.IO, lädt .env, sorgt für Schema-Validierung (ensureDatabaseSchema) und Default-Daten (ensureSuperuserFromEnv, ensureDefaultsFromEnv).
  • Start via npm start (siehe package.json); Migrationen über npm run migrate.
  • Datenbankdatei: backend/data/stackpulse.db, WAL-Modus aktiv.

Module

Modul Pfad Aufgabe
Auth/Superuser auth/superuser.js Registrieren/Verifizieren von Superusern, Login, Passwortvalidierung, Sicherheitsphrasen.
Users & Groups users/*, groups/*, permissions/* CRUD für Benutzer, Gruppen, Rechtezuweisung, Ableitung effektiver Berechtigungen.
Setup setup/index.js Verwaltung registrierter Portainer-Server, sichere Ablage der API-Keys, Setup-Status.
Logging logging/eventLogs.js Einheitliches Ereignislogging (Insert, Filter, Delete, Export).
Maintenance maintenance/state.js + helper in index.js Wartungsmodus, SSH-Konfiguration, Update-Skripte und Ausführung.
Portainer Proxy Funktionen in index.js Kommunikation mit Portainer (axiosInstance + dynamische baseURL), Environment-Erkennung und Redeploy-Strecke.

API-Überblick (Auszug)

Setup & Server

Methode Route Beschreibung
GET /api/setup/status Gibt zurück, ob Server/API-Key/Superuser vorhanden sind.
POST /api/setup/test-portainer Verifiziert URL + API-Key gegen Portainer.
POST /api/setup/portainer-stacks Listet Stacks (für Preview im Wizard).
POST /api/setup/complete Markiert Setup als abgeschlossen und hinterlegt Server/API-Key.
DELETE /api/setup/servers/:id Entfernt einen registrierten Portainer-Server.
PUT /api/setup/servers/:id/api-key Überschreibt API-Key.
PUT /api/setup/self-stack Speichert die ID des StackPulse-Stacks, damit dieser nicht redeployed wird.

Authentifizierung

Methode Route Beschreibung
POST /api/auth/login Username/Passwort-Login, setzt HTTP-only Cookie.
POST /api/auth/logout Session beenden & Cookie löschen.
GET /api/auth/session Liefert eingeloggten Benutzer + Permissions.
POST /api/auth/recover/verify & /reset Passwortreset über Sicherheitsphrase.
GET/POST/DELETE /api/auth/superuser/* Abfrage, Registrierung oder Entfernen des Superusers.

Benutzer & Gruppen

Methode Route Beschreibung
GET/POST /api/users Liste anlegen, neue Benutzer erstellen.
GET/PUT/DELETE /api/users/:id Details lesen, bearbeiten oder löschen.
PUT /api/users/:id/groups Gruppenmitgliedschaften aktualisieren.
PUT /api/users/:id/active Benutzer aktivieren/deaktivieren.
GET/POST /api/users/:id/security-phrase, /renew Sicherheitsphrase anzeigen bzw. neu generieren.
GET/POST /api/groups Gruppen auflisten oder neu anlegen.
PUT/DELETE /api/groups/:id Gruppe editieren oder entfernen.
GET/PUT /api/groups/:id/permissions Berechtigungen lesen/setzen.

Stacks & Redeploy

Methode Route Beschreibung
GET /api/stacks Aggregierte Liste inkl. Filter, Self-Stack-Blockade und Redeploy-Status.
PUT /api/stacks/:id/redeploy Redeploy eines einzelnen Stacks.
PUT /api/stacks/redeploy-selection Redeploy einer Liste übermittelter stackIds.
PUT /api/stacks/redeploy-all Redeploy aller Stacks (Permission stacks-redeploy-all).

Das Backend veröffentlicht den Redeploy-Fortschritt parallel über Socket.IO (redeployStatus Event) und unterscheidet die Phasen queued, started, success, error, info.

Logging & Wartung

Methode Route Beschreibung
GET /api/logs Filterbare/Paginierbare Event-Logs.
DELETE /api/logs/:id oder /api/logs Einzelne oder gefilterte Logs löschen.
GET /api/logs/export CSV-Export anhand der Query-Filter.
GET/POST /api/maintenance/mode Status abfragen oder toggeln.
GET /api/maintenance/config Liefert Maintenance-Status, Update-Skript & SSH-Config.
PUT/DELETE /api/maintenance/ssh-config SSH-Credentials speichern/entfernen.
POST /api/maintenance/test-ssh Verbindungstest mit optionalem Override.
PUT/DELETE /api/maintenance/update-script Custom Update-Skript pflegen.
POST /api/maintenance/portainer-update Update-Kommando per SSH ausführen (mit Custom/Default-Skript).

Datenbank & Schema

  • ensureDatabaseSchema() erzeugt Tabellen bei jedem Start, inklusive Default-Gruppen, Permissions, Settings, Server-Einträge und Trigger.
  • Permissions werden anhand der Blueprint-Datei backend/db/dbs eingelesen. Jede Permission definiert Key, Label, Level (full, read, none) und Abhängigkeiten.
  • Events werden in event_logs gespeichert. Relevante Felder:
  • category, event_type, action, status, severity
  • entity_type, entity_id, entity_name
  • actor_type, actor_id, actor_name
  • context_type, context_id, context_label
  • message, metadata (JSON)
  • Filter-Parameter (ids, categories, eventTypes, status, stackIds, Zeitfenster) werden in buildEventLogFilter zentral verarbeitet.

Berechtigungssystem

  • Jeder Benutzer gehört zu beliebig vielen Gruppen; die effektiven Rechte ergeben sich aus der höchsten Ausprägung pro Permission.
  • Superuser erhalten alle Berechtigungen und können nicht über das UI entzogen werden.
  • PermissionGate im Frontend spiegelt die gleichen Keys. Wichtigste Bereiche:
  • stacks-* (Redeploy)
  • logs-*
  • users-* & user-groups-*
  • maintenance-* (inkl. Unterrechte maintenance-server-*, maintenance-ssh-update, maintenance-update)

Redeploy-Workflow

  1. Eingehender Request wird mit maintenanceGuard geprüft (Maintenance-Modus blockiert optional Redeploys).
  2. Das Backend ermittelt den zugehörigen Portainer-Endpoint (resolvePortainerEnvironmentId).
  3. Der Redeploy wird über Portainer ausgeführt (/api/stacks/:id/redeploy), Log-Einträge werden erstellt.
  4. broadcastRedeployStatus() aktualisiert das In-Memory-Tracking (redeployingStacks) und sendet Socket.IO Events.
  5. Fehler führen zu event_logs-Einträgen mit severity=error, UI zeigt Toasts via ToastProvider.

Wartungs- und Updatepfad

  • maintenance/state.js persistiert Aktivierung & Nachricht im Setting maintenance_mode.
  • SSH-Konfigurationen (Host, Port, User, Passwort, extra args) werden verschlüsselt gespeichert (getPortainerSshConfig).
  • Update-Skripte lassen sich überschreiben, Standard-Skript liegt in DEFAULT_PORTAINER_UPDATE_SCRIPT (Bash-Befehle).
  • Update-Status hält Laufzeiten, letzte Ergebnisse und Logauszüge in-memory & Settings bereit.

Erweiterungstipps

  • Neue API-Routen sollten requirePermission(..) nutzen, Logging via logEvent() hinzufügen und – falls Portainer-Aufrufe stattfinden – das axiosInstance verwenden.
  • Einstellungen stets über db/settings.js verwalten, damit UI & CLI konsistent bleiben.
  • Für breaking DB-Änderungen existiert kein Migrations-Framework – erweitere ensureDatabaseSchema inkl. Versionsflag, um Idempotenz sicherzustellen.