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
- Eingehender Request wird mit
maintenanceGuard geprüft (Maintenance-Modus blockiert optional Redeploys).
- Das Backend ermittelt den zugehörigen Portainer-Endpoint (
resolvePortainerEnvironmentId).
- Der Redeploy wird über Portainer ausgeführt (
/api/stacks/:id/redeploy), Log-Einträge werden erstellt.
broadcastRedeployStatus() aktualisiert das In-Memory-Tracking (redeployingStacks) und sendet Socket.IO Events.
- 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.