StackPulse folgt einer klassischen Client/Server-Architektur, bei der das Backend den Single-Source-of-Truth darstellt und das Frontend ausschließlich über wohldefinierte REST- und Socket.IO-Schnittstellen kommuniziert.
Frontend (Vite + Material Tailwind): stellt alle Views, Formulare, Tabellen und Echtzeit-Widgets bereit. Die AuthProvider-Komponente verwaltet Session, Permissions und Socket-Verbindungen.
+
Backend (Express + better-sqlite3): aggregiert Daten aus Portainer, persistiert Benutzer/Gruppen/Logs, verwaltet Sessions und stößt Redeploy- sowie Wartungsprozesse an.
+
Persistenz (SQLite): Datei backend/data/stackpulse.db, WAL-Modus aktiviert. Tabellen umfassen u. a. users, groups, permissions, servers, server_api_keys, event_logs, settings sowie Hilfstabellen für Tokens und Sicherheitspassphrasen.
+
+
Datenflüsse
+
+
Setup-Phase: /api/setup/* nimmt Serverdaten entgegen, verschlüsselt API-Keys (aes-256-gcm via PORTAINER_API_SECRET) und erstellt Einträge in servers/server_api_keys.
+
Authentication: /api/auth/login erstellt Sessions (JWT-ähnliche Tokens in Cookies), AuthProvider ruft /api/auth/session zyklisch ab und speichert Berechtigungen.
+
Stack-Übersicht: Frontend ruft /api/stacks auf. Das Backend proxyt Portainer /api/endpoints/:id/docker/stacks, ergänzt Caching, interne Metadaten und liefert Redeploy-Status.
+
Redeploy: UI stößt /api/stacks/:id/redeploy, /api/stacks/redeploy-selection oder /api/stacks/redeploy-all an. Das Backend ruft Portainer-Endpoints, protokolliert Events und broadcastet Fortschritt via Socket.IO redeployStatus.
+
Logging: Jeder relevante Vorgang erzeugt Einträge in event_logs (siehe logging/eventLogs.js). Frontend filtert/paginiert über /api/logs und kann Exporte /api/logs/export herunterladen.
+
Wartung: /api/maintenance/* verwaltet Maintenance-Mode, SSH-Zugänge, Update-Skripte und serverseitige Settings (db/settings.js).
+
+
Verzeichnis-Referenz
+
+
+
+
Pfad
+
Inhalt
+
+
+
+
+
backend/index.js
+
Herzstück der API inkl. Routing, Socket.IO, Redeploy, Setup, Auth.
+
+
+
backend/auth/
+
Superuser-Verwaltung, Passwort- und Tokenfunktionen, Sicherheitsphrasen.
API-Keys und Passwörter werden verschlüsselt in SQLite abgelegt (server_api_keys, settings).
+
Settings (Maintenance, Update-Skripte, SSH) nutzen db/settings.js mit JSON-Serialisierung.
+
Das Backend erzwingt HTTPS-Requests Richtung Portainer (https.Agent mit deaktivierter Zertifikatsprüfung für interne Netze).
+
Socket.IO lauscht auf demselben Port wie Express (/socket.io). CORS ist aktuell für alle Origins offen – für produktive Deployments empfiehlt sich ein Reverse Proxy mit Authentifizierung.
+
+
Skalierung & Grenzen
+
+
SQLite eignet sich für Einzelinstanzen. Für höhere Last empfiehlt sich eine Umstellung auf Postgres/MySQL (der Code kapselt Zugriffe weitgehend in db/*).
+
Redeploy-Operationen werden seriell behandelt (redeployingStacks + Status-Caching). Parallele Ausführung ist möglich, solange Portainer dies unterstützt.
+
Logging wird ausschließlich serverseitig betrieben; Client-seitige Filterung erfolgt über Query-Parameter.
+
+
Die weiteren Kapitel vertiefen Backend- und Frontend-spezifische Details.
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.
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.
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.
Das Frontend basiert auf React 18, Vite und dem Material Tailwind Dashboard. Es nutzt Context Provider für Authentifizierung, Seitenstatus, Toaster und Wartungsinformationen.
+
Build & Skripte
+
+
+
+
Befehl
+
Beschreibung
+
+
+
+
+
npm run dev
+
Startet den Vite Dev-Server (Port 5173, HMR aktiviert).
+
+
+
npm run build
+
Erstellt ein Production-Bundle (frontend/dist). Das Dockerfile kopiert dieses Paket ins Backend (backend/public).
routes.jsx beschreibt sowohl Dashboard- als auch Auth-Routen. Jede Dashboard-Seite besitzt optional ein permission-Objekt, das vom PermissionGate ausgewertet wird.
+
Der Layout-Switch erfolgt über layouts/index.jsx, das wiederum Sidebar/Topbar-Komponenten aus dem Material Tailwind Dashboard nutzt.
+
Auth-Routen (/sign-in, /sign-up, /forgot-password, /logout) werden im Auth-Layout ohne Sidebar dargestellt.
+
+
State-Management & Contexts
+
+
+
+
Provider
+
Aufgabe
+
+
+
+
+
AuthProvider
+
Speichert User, Permissions, Session-Status. Stellt refreshSession, logout, hasPermission bereit.
+
+
+
PageProvider
+
Zentrale UI-Zustände (z. B. Ladeanzeigen, modale Dialoge) für Dashboard-Komponenten.
+
+
+
ToastProvider
+
Globale Notifications (z. B. Redeploy-Erfolg/Fehler).
+
+
+
MaintenanceProvider
+
Cached Maintenance-Status, erkennt aktive Maintenance Modes und zeigt Hinweise.
+
+
+
+
Wichtige Seiten
+
+
Stacks (pages/dashboard/stacks.jsx): Hauptübersicht mit Tabellen, Suche, Filtern, Bulk- und Einzelredeploy. Bindet socket.io-client für Live-Updates (redeployStatus).
+
Logs (pages/dashboard/logs.jsx): Tabellenansicht mit Statusfarben, Filterchips, Export-/Delete-Aktionen. Nutzt axios-Queries gegen /api/logs.
+
Maintenance (pages/dashboard/maintenance.jsx): Formulare zur Verwaltung von Update-Skript, SSH-Konfiguration, Maintenance-Mode-Toggle und Portainer-Statusprüfung.
+
Users / Usergroups: CRUD-Oberfläche für Benutzer, Gruppen, Berechtigungszuweisung inkl. Sicherheitsphrasen-Handling.
+
Setup (pages/setup): Schrittweiser Wizard (Server -> API-Key -> Superuser). Wird solange angezeigt, bis /api/setup/status vollständig ist.
+
+
Datenzugriff
+
+
HTTP-Anfragen erfolgen via axios (global konfiguriert in frontend/src/components/AuthProvider bzw. direkt in den Seiten). Cookies werden automatisch vom Browser beigesteuert (credentials: 'include').
+
Socket.IO wird nur im Stack-Dashboard verwendet; Verbindungsaufbau erfolgt in stacks.jsx (io('/', { path: '/socket.io' })).
+
Fehlerbehandlung: Jede Seite zeigt Toasts und/oder Inline-Warnungen. Auth-Fehler leiten zur Loginseite um.
+
+
Styling & Komponenten
+
+
Tailwind Utility-Klassen liefert Material Tailwind bereits vordefiniert (Theme in configs).
+
Custom-Komponenten wie Tabellen, Filterchips oder Formulare sind überwiegend in widgets/ ausgelagert.
+
Icons stammen aus @heroicons/react. Farben/Typografie folgen Creative Tim Vorgaben, können aber zentral in frontend/src/configs angepasst werden.
+
+
Erweiterungshinweise
+
+
Neue Seiten: Route in routes.jsx ergänzen, optional PermissionGate konfigurieren und Seite unter pages/dashboard oder pages/auth anlegen.
+
API-Anbindungen: Verwende axios und achte auf try/catch, damit 401/403 sauber abgefangen werden. Bei kritischen Anforderungen refreshSession aufrufen.
+
State teilen: Nutze bestehende Provider bzw. erzeuge einen eigenen Context in components/.
+
Deployment: npm run build liefert ein Self-Contained Bundle. Das Backend dient anschließend als Static Host (express.static).
+
+
Damit bietet das Frontend eine anpassbare, klar strukturierte Oberfläche, die eng mit den Backend-Permissions verzahnt ist.
StackPulse ist eine eigenständige Web-Anwendung, die die Portainer Business Edition über deren API steuert und dadurch Redeploys, Wartungsskripte sowie das Berechtigungs- und Logging-Konzept zentralisiert. Die Lösung besteht aus einem Node.js/Express Backend, einem React-Frontend auf Basis von Material Tailwind sowie einer eingebetteten SQLite-Datenbank, die ohne zusätzliche Infrastruktur betrieben werden kann.
+
Warum StackPulse?
-
mkdocs new [dir-name] - Create a new project.
-
mkdocs serve - Start the live-reloading docs server.
-
mkdocs build - Build the documentation site.
-
mkdocs -h - Print help message and exit.
+
Schneller Überblick über sämtliche Stacks einer Portainer-Instanz inkl. Status, Filter und Suche
+
Redeploy-Orchestrierung aus einem UI heraus – einzelne Stacks, Auswahlen oder komplette Umgebungen
+
Auditierbare Historie durch strukturierte Event-Logs mit Export-, Lösch- und Filterfunktionen
+
Feingranulare Rechteverwaltung mit Gruppenrechten, Superuser-Handling und Sicherheitsphrasen
+
Wartungsautomatisierung (SSH Update-Skripte, Maintenance-Mode) ohne direkten Portainer-Zugang
+
Bereitstellung als Docker-Image sowie als lokale Dev-Umgebung via scripts/start-dev.sh
Dieser Abschnitt deckt typische Aufgaben für Betriebsteams ab – von Backups über Wartungsmodus bis zu Störungssuche.
+
Laufender Betrieb
+
+
Services überwachen: StackPulse stellt nur einen Prozess bereit (Node.js/Express). Nutze Systemd/Docker Healthchecks, indem du regelmäßig /api/auth/session (für Auth) oder /api/maintenance/update-status (für Backend + DB) abfragst.
+
Ports: Standardmäßig lauscht nur Port 4001 (HTTP + Socket.IO). Hinter einem Reverse Proxy sollte TLS terminiert werden.
+
Protokolle: Das Backend loggt ausführlich auf STDOUT/STDERR (console.log). Sammle diese via Docker-Logs oder Journal.
+
+
Backups & Wiederherstellung
+
+
Container-Setup: Mount backend/data via benanntem Volume (siehe docker-compose.yml).
+
Backup: Stoppe kurz den Container oder nutze sqlite3 stackpulse.db ".backup 'stackpulse.db.bak'" innerhalb der laufenden Instanz.
+
Restore: Ersetze die Datei im Volume und starte die App neu. Beim ersten Start führt ensureDatabaseSchema automatisch eventuelle Nachmigrationen aus.
+
+
Benutzer- & Rechteverwaltung
+
+
Superuser können über /api/auth/superuser/* oder im UI registriert werden. Entfernen ist nur mit maintenance-superuser-delete möglich.
+
Benutzerkonten lassen sich temporär deaktivieren (/api/users/:id/active). Die Historie bleibt erhalten.
+
Sicherheitsphrasen sind notwendig für Passwort-Reset. Admins können neue Phrasen erzeugen (/api/users/:id/security-phrase/renew), müssen diese aber dem Benutzer sicher zustellen.
+
+
Wartungsmodus & Updates
+
+
Maintenance Mode aktivieren: curl -X POST http://host:4001/api/maintenance/mode -H 'Content-Type: application/json' -d '{"active":true,"message":"Cluster Upgrade"}' (Permission maintenance-access). Das UI informiert alle Nutzer und blockiert Redeploys.
+
SSH-/Update-Setup: Hinterlege Host, Port, Benutzer, Passwort (optional) und zusätzliche SSH-Argumente. Passwörter werden verschlüsselt gespeichert (PORTAINER_SSH_SECRET).
+
Update-Skript: Das Default-Skript (DEFAULT_PORTAINER_UPDATE_SCRIPT) führt docker stop, docker run etc. aus. Du kannst im UI oder via API ein eigenes Skript setzen – wird erst aktualisiert, wenn kein Update läuft.
+
Update anstoßen: POST /api/maintenance/portainer-update triggert die SSH-Kommandos. Status & Logausgaben können über /api/maintenance/update-status überwacht werden.
+
+
Logs & Compliance
+
+
Ereignislogs enthalten jede Redeploy-, Auth- und Verwaltungsaktion. Export über GET /api/logs/export (CSV) oder automatisiert mittels Cron (Query-Parameter übernehmen Filter).
+
Datenbereinigung: Nutze DELETE /api/logs/:id oder DELETE /api/logs?before=<ISO> um alte Einträge zu entfernen. Achtung: Aktionen sind nicht reversibel.
+
Für Offload kannst du per Script regelmäßig Exporte ziehen und anschließend löschen.
+
+
Troubleshooting
+
+
+
+
Symptom
+
Prüfschritte
+
+
+
+
+
Setup schlägt fehl (PORTAINER_URL_NOT_CONFIGURED)
+
Stelle sicher, dass entweder PORTAINER_URL gesetzt ist oder im Setup-UI ein Server gespeichert wurde (servers-Tabelle prüfen).
+
+
+
Redeploy hängt in queued
+
/api/maintenance/update-status auf laufende Updates prüfen, redeployingStacks im Log verfolgen; ggf. Portainer-API erreichbar?
+
+
+
Login nicht möglich
+
Über backend/logs nach Auth-Fehlern suchen, Cookie-Konfiguration prüfen (AUTH_COOKIE_SECURE bei HTTP?).
+
+
+
SSH-Test fehlgeschlagen
+
POST /api/maintenance/test-ssh mit temporären Credentials testen, Container-Logs auf SSH Test fehlgeschlagen untersuchen.
+
+
+
SQLite Locked
+
Stelle sicher, dass kein paralleler Backup-Prozess läuft. WAL-Modus erlaubt mehrere Leser, blockiert aber bei langen Schreibtransaktionen (Check Logs auf SQLITE_BUSY).
+
+
+
+
Sicherheitsempfehlungen
+
+
Setze AUTH_COOKIE_SECURE=true hinter TLS und konfiguriere einen Reverse Proxy (z. B. Traefik, Nginx).
+
Isoliere das Admin-Interface durch VPN oder IP-Filter.
+
Drehe API-Keys regelmäßig: /api/setup/servers/:id/api-key aktualisiert Schlüssel ohne Neuinstallation.
+
Nutze dedizierte StackPulse-Benutzer in Portainer, damit Berechtigungen klar getrennt bleiben.
+
+
Mit diesen Richtlinien lässt sich StackPulse sicher betreiben und warten.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/search/search_index.json b/search/search_index.json
index a861b0a..e0df57a 100644
--- a/search/search_index.json
+++ b/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Welcome to MkDocs","text":"
mkdocs.yml # The configuration file.\ndocs/\n index.md # The documentation homepage.\n ... # Other markdown pages, images and other files.\n
"}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"StackPulse","text":"
StackPulse ist eine eigenst\u00e4ndige Web-Anwendung, die die Portainer Business Edition \u00fcber deren API steuert und dadurch Redeploys, Wartungsskripte sowie das Berechtigungs- und Logging-Konzept zentralisiert. Die L\u00f6sung besteht aus einem Node.js/Express Backend, einem React-Frontend auf Basis von Material Tailwind sowie einer eingebetteten SQLite-Datenbank, die ohne zus\u00e4tzliche Infrastruktur betrieben werden kann.
StackPulse folgt einer klassischen Client/Server-Architektur, bei der das Backend den Single-Source-of-Truth darstellt und das Frontend ausschlie\u00dflich \u00fcber wohldefinierte REST- und Socket.IO-Schnittstellen kommuniziert.
Frontend (Vite + Material Tailwind): stellt alle Views, Formulare, Tabellen und Echtzeit-Widgets bereit. Die AuthProvider-Komponente verwaltet Session, Permissions und Socket-Verbindungen.
Backend (Express + better-sqlite3): aggregiert Daten aus Portainer, persistiert Benutzer/Gruppen/Logs, verwaltet Sessions und st\u00f6\u00dft Redeploy- sowie Wartungsprozesse an.
Persistenz (SQLite): Datei backend/data/stackpulse.db, WAL-Modus aktiviert. Tabellen umfassen u. a. users, groups, permissions, servers, server_api_keys, event_logs, settings sowie Hilfstabellen f\u00fcr Tokens und Sicherheitspassphrasen.
Setup-Phase: /api/setup/* nimmt Serverdaten entgegen, verschl\u00fcsselt API-Keys (aes-256-gcm via PORTAINER_API_SECRET) und erstellt Eintr\u00e4ge in servers/server_api_keys.
Authentication: /api/auth/login erstellt Sessions (JWT-\u00e4hnliche Tokens in Cookies), AuthProvider ruft /api/auth/session zyklisch ab und speichert Berechtigungen.
Stack-\u00dcbersicht: Frontend ruft /api/stacks auf. Das Backend proxyt Portainer /api/endpoints/:id/docker/stacks, erg\u00e4nzt Caching, interne Metadaten und liefert Redeploy-Status.
Redeploy: UI st\u00f6\u00dft /api/stacks/:id/redeploy, /api/stacks/redeploy-selection oder /api/stacks/redeploy-all an. Das Backend ruft Portainer-Endpoints, protokolliert Events und broadcastet Fortschritt via Socket.IO redeployStatus.
Logging: Jeder relevante Vorgang erzeugt Eintr\u00e4ge in event_logs (siehe logging/eventLogs.js). Frontend filtert/paginiert \u00fcber /api/logs und kann Exporte /api/logs/export herunterladen.
Wartung: /api/maintenance/* verwaltet Maintenance-Mode, SSH-Zug\u00e4nge, Update-Skripte und serverseitige Settings (db/settings.js).
API-Keys und Passw\u00f6rter werden verschl\u00fcsselt in SQLite abgelegt (server_api_keys, settings).
Settings (Maintenance, Update-Skripte, SSH) nutzen db/settings.js mit JSON-Serialisierung.
Das Backend erzwingt HTTPS-Requests Richtung Portainer (https.Agent mit deaktivierter Zertifikatspr\u00fcfung f\u00fcr interne Netze).
Socket.IO lauscht auf demselben Port wie Express (/socket.io). CORS ist aktuell f\u00fcr alle Origins offen \u2013 f\u00fcr produktive Deployments empfiehlt sich ein Reverse Proxy mit Authentifizierung.
SQLite eignet sich f\u00fcr Einzelinstanzen. F\u00fcr h\u00f6here Last empfiehlt sich eine Umstellung auf Postgres/MySQL (der Code kapselt Zugriffe weitgehend in db/*).
Redeploy-Operationen werden seriell behandelt (redeployingStacks + Status-Caching). Parallele Ausf\u00fchrung ist m\u00f6glich, solange Portainer dies unterst\u00fctzt.
Logging wird ausschlie\u00dflich serverseitig betrieben; Client-seitige Filterung erfolgt \u00fcber Query-Parameter.
Die weiteren Kapitel vertiefen Backend- und Frontend-spezifische Details.
Das Backend implementiert alle Anwendungsf\u00e4lle \u00fcber Express-Routen, Socket.IO f\u00fcr Echtzeit-Events und eine SQLite-Datenbank als Persistenzschicht. Dieser Abschnitt fasst die wichtigsten Module, Entit\u00e4ten und Endpunkte zusammen.
"},{"location":"backend/#module","title":"Module","text":"Modul Pfad Aufgabe Auth/Superuser auth/superuser.js Registrieren/Verifizieren von Superusern, Login, Passwortvalidierung, Sicherheitsphrasen. Users & Groups users/*, groups/*, permissions/* CRUD f\u00fcr 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\u00fchrung. Portainer Proxy Funktionen in index.js Kommunikation mit Portainer (axiosInstance + dynamische baseURL), Environment-Erkennung und Redeploy-Strecke."},{"location":"backend/#api-uberblick-auszug","title":"API-\u00dcberblick (Auszug)","text":""},{"location":"backend/#setup-server","title":"Setup & Server","text":"Methode Route Beschreibung GET /api/setup/status Gibt zur\u00fcck, 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\u00fcr 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 \u00dcberschreibt API-Key. PUT /api/setup/self-stack Speichert die ID des StackPulse-Stacks, damit dieser nicht redeployed wird."},{"location":"backend/#authentifizierung","title":"Authentifizierung","text":"Methode Route Beschreibung POST /api/auth/login Username/Passwort-Login, setzt HTTP-only Cookie. POST /api/auth/logout Session beenden & Cookie l\u00f6schen. GET /api/auth/session Liefert eingeloggten Benutzer + Permissions. POST /api/auth/recover/verify & /reset Passwortreset \u00fcber Sicherheitsphrase. GET/POST/DELETE /api/auth/superuser/* Abfrage, Registrierung oder Entfernen des Superusers."},{"location":"backend/#benutzer-gruppen","title":"Benutzer & Gruppen","text":"Methode Route Beschreibung GET/POST /api/users Liste anlegen, neue Benutzer erstellen. GET/PUT/DELETE /api/users/:id Details lesen, bearbeiten oder l\u00f6schen. 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."},{"location":"backend/#stacks-redeploy","title":"Stacks & Redeploy","text":"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 \u00fcbermittelter stackIds. PUT /api/stacks/redeploy-all Redeploy aller Stacks (Permission stacks-redeploy-all).
Das Backend ver\u00f6ffentlicht den Redeploy-Fortschritt parallel \u00fcber Socket.IO (redeployStatus Event) und unterscheidet die Phasen queued, started, success, error, info.
"},{"location":"backend/#logging-wartung","title":"Logging & Wartung","text":"Methode Route Beschreibung GET /api/logs Filterbare/Paginierbare Event-Logs. DELETE /api/logs/:id oder /api/logs Einzelne oder gefilterte Logs l\u00f6schen. 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\u00fchren (mit Custom/Default-Skript)."},{"location":"backend/#datenbank-schema","title":"Datenbank & Schema","text":"
ensureDatabaseSchema() erzeugt Tabellen bei jedem Start, inklusive Default-Gruppen, Permissions, Settings, Server-Eintr\u00e4ge und Trigger.
Permissions werden anhand der Blueprint-Datei backend/db/dbs eingelesen. Jede Permission definiert Key, Label, Level (full, read, none) und Abh\u00e4ngigkeiten.
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.
Neue API-Routen sollten requirePermission(..) nutzen, Logging via logEvent() hinzuf\u00fcgen und \u2013 falls Portainer-Aufrufe stattfinden \u2013 das axiosInstance verwenden.
Das Frontend basiert auf React 18, Vite und dem Material Tailwind Dashboard. Es nutzt Context Provider f\u00fcr Authentifizierung, Seitenstatus, Toaster und Wartungsinformationen.
"},{"location":"frontend/#build-skripte","title":"Build & Skripte","text":"Befehl Beschreibung npm run dev Startet den Vite Dev-Server (Port 5173, HMR aktiviert). npm run build Erstellt ein Production-Bundle (frontend/dist). Das Dockerfile kopiert dieses Paket ins Backend (backend/public). npm run preview Vorschau auf das gebaute Bundle."},{"location":"frontend/#projektstruktur","title":"Projektstruktur","text":"
routes.jsx beschreibt sowohl Dashboard- als auch Auth-Routen. Jede Dashboard-Seite besitzt optional ein permission-Objekt, das vom PermissionGate ausgewertet wird.
Der Layout-Switch erfolgt \u00fcber layouts/index.jsx, das wiederum Sidebar/Topbar-Komponenten aus dem Material Tailwind Dashboard nutzt.
Auth-Routen (/sign-in, /sign-up, /forgot-password, /logout) werden im Auth-Layout ohne Sidebar dargestellt.
Stacks (pages/dashboard/stacks.jsx): Haupt\u00fcbersicht mit Tabellen, Suche, Filtern, Bulk- und Einzelredeploy. Bindet socket.io-client f\u00fcr Live-Updates (redeployStatus).
Logs (pages/dashboard/logs.jsx): Tabellenansicht mit Statusfarben, Filterchips, Export-/Delete-Aktionen. Nutzt axios-Queries gegen /api/logs.
Maintenance (pages/dashboard/maintenance.jsx): Formulare zur Verwaltung von Update-Skript, SSH-Konfiguration, Maintenance-Mode-Toggle und Portainer-Statuspr\u00fcfung.
HTTP-Anfragen erfolgen via axios (global konfiguriert in frontend/src/components/AuthProvider bzw. direkt in den Seiten). Cookies werden automatisch vom Browser beigesteuert (credentials: 'include').
Socket.IO wird nur im Stack-Dashboard verwendet; Verbindungsaufbau erfolgt in stacks.jsx (io('/', { path: '/socket.io' })).
Fehlerbehandlung: Jede Seite zeigt Toasts und/oder Inline-Warnungen. Auth-Fehler leiten zur Loginseite um.
# Backend\ncd backend\nnpm install\nnpm run migrate\nPORTAINER_URL=https://portainer.local npm start\n\n# Frontend in zweiter Shell\ncd frontend\nnpm install\nnpm run dev\n
Das Backend liest Umgebungsvariablen beim Start. Alternativ kannst du eine .env neben backend/index.js anlegen.
"},{"location":"getting-started/#zentrale-umgebungsvariablen","title":"Zentrale Umgebungsvariablen","text":"Variable Beschreibung PORTAINER_URL Basis-URL zu deiner Portainer-Instanz (inkl. Protokoll). Kann sp\u00e4ter im Setup-UI \u00fcberschrieben werden. PORTAINER_API_KEY API-Key f\u00fcr Portainer. Wird in der DB verschl\u00fcsselt abgelegt, sobald du ihn im Setup speicherst. PORTAINER_SERVER_NAME Optionaler Anzeigename f\u00fcr den Server w\u00e4hrend des Setups. PORTAINER_API_SECRET \u00dcberschreibt den Schl\u00fcssel, der zur Verschl\u00fcsselung des API-Keys verwendet wird. SUPERUSER_USERNAME, SUPERUSER_EMAIL, SUPERUSER_PASSWORD Legt einen Superuser automatisch beim Start an (falls nicht vorhanden). SELF_STACK_ID Stack-ID von StackPulse selbst. Wird genutzt, um eigene Redeploys zu blockieren. AUTH_COOKIE_NAME, AUTH_SESSION_TTL_MS, AUTH_COOKIE_SECURE Feintuning f\u00fcr die Session-Verwaltung der API. SECURITY_PHRASE_SECRET Seed f\u00fcr die Generierung kryptografischer Sicherheitsphrasen. PORTAINER_SSH_SECRET Secret f\u00fcr SSH-Passwortverschl\u00fcsselung (Wartungs-Update). DISPLAY Wird an Kindprozesse weitergereicht, wenn Portainer-Updates ausgel\u00f6st werden m\u00fcssen (Default :9999).
Weitere Einstellungen (SSH-Config, Update-Skripte) verwaltest du sp\u00e4ter direkt im Maintenance-Bereich des UI.
"},{"location":"getting-started/#ersteinrichtung-im-ui","title":"Ersteinrichtung im UI","text":"
\u00d6ffne das Frontend (/setup f\u00fchrt dich automatisch durch den Wizard).
Lege den Portainer-Server und den zugeh\u00f6rigen API-Key an \u2013 StackPulse testet die Verbindung per /api/setup/test-portainer.
Registriere einen Superuser oder verwende den per Umgebungsvariablen automatisch angelegten Account.
Nach erfolgreicher Einrichtung kannst du dich anmelden und erh\u00e4ltst Zugriff auf Dashboard, Logs, Benutzer & Wartung.
Services \u00fcberwachen: StackPulse stellt nur einen Prozess bereit (Node.js/Express). Nutze Systemd/Docker Healthchecks, indem du regelm\u00e4\u00dfig /api/auth/session (f\u00fcr Auth) oder /api/maintenance/update-status (f\u00fcr Backend + DB) abfragst.
Ports: Standardm\u00e4\u00dfig lauscht nur Port 4001 (HTTP + Socket.IO). Hinter einem Reverse Proxy sollte TLS terminiert werden.
Protokolle: Das Backend loggt ausf\u00fchrlich auf STDOUT/STDERR (console.log). Sammle diese via Docker-Logs oder Journal.
Container-Setup: Mount backend/data via benanntem Volume (siehe docker-compose.yml).
Backup: Stoppe kurz den Container oder nutze sqlite3 stackpulse.db \".backup 'stackpulse.db.bak'\" innerhalb der laufenden Instanz.
Restore: Ersetze die Datei im Volume und starte die App neu. Beim ersten Start f\u00fchrt ensureDatabaseSchema automatisch eventuelle Nachmigrationen aus.
Superuser k\u00f6nnen \u00fcber /api/auth/superuser/* oder im UI registriert werden. Entfernen ist nur mit maintenance-superuser-delete m\u00f6glich.
Benutzerkonten lassen sich tempor\u00e4r deaktivieren (/api/users/:id/active). Die Historie bleibt erhalten.
Sicherheitsphrasen sind notwendig f\u00fcr Passwort-Reset. Admins k\u00f6nnen neue Phrasen erzeugen (/api/users/:id/security-phrase/renew), m\u00fcssen diese aber dem Benutzer sicher zustellen.
Maintenance Mode aktivieren: curl -X POST http://host:4001/api/maintenance/mode -H 'Content-Type: application/json' -d '{\"active\":true,\"message\":\"Cluster Upgrade\"}' (Permission maintenance-access). Das UI informiert alle Nutzer und blockiert Redeploys.
SSH-/Update-Setup: Hinterlege Host, Port, Benutzer, Passwort (optional) und zus\u00e4tzliche SSH-Argumente. Passw\u00f6rter werden verschl\u00fcsselt gespeichert (PORTAINER_SSH_SECRET).
Update-Skript: Das Default-Skript (DEFAULT_PORTAINER_UPDATE_SCRIPT) f\u00fchrt docker stop, docker run etc. aus. Du kannst im UI oder via API ein eigenes Skript setzen \u2013 wird erst aktualisiert, wenn kein Update l\u00e4uft.
Update ansto\u00dfen: POST /api/maintenance/portainer-update triggert die SSH-Kommandos. Status & Logausgaben k\u00f6nnen \u00fcber /api/maintenance/update-status \u00fcberwacht werden.
Ereignislogs enthalten jede Redeploy-, Auth- und Verwaltungsaktion. Export \u00fcber GET /api/logs/export (CSV) oder automatisiert mittels Cron (Query-Parameter \u00fcbernehmen Filter).
Datenbereinigung: Nutze DELETE /api/logs/:id oder DELETE /api/logs?before=<ISO> um alte Eintr\u00e4ge zu entfernen. Achtung: Aktionen sind nicht reversibel.
F\u00fcr Offload kannst du per Script regelm\u00e4\u00dfig Exporte ziehen und anschlie\u00dfend l\u00f6schen.
"},{"location":"operations/#troubleshooting","title":"Troubleshooting","text":"Symptom Pr\u00fcfschritte Setup schl\u00e4gt fehl (PORTAINER_URL_NOT_CONFIGURED) Stelle sicher, dass entweder PORTAINER_URL gesetzt ist oder im Setup-UI ein Server gespeichert wurde (servers-Tabelle pr\u00fcfen). Redeploy h\u00e4ngt in queued/api/maintenance/update-status auf laufende Updates pr\u00fcfen, redeployingStacks im Log verfolgen; ggf. Portainer-API erreichbar? Login nicht m\u00f6glich \u00dcber backend/logs nach Auth-Fehlern suchen, Cookie-Konfiguration pr\u00fcfen (AUTH_COOKIE_SECURE bei HTTP?). SSH-Test fehlgeschlagen POST /api/maintenance/test-ssh mit tempor\u00e4ren Credentials testen, Container-Logs auf SSH Test fehlgeschlagen untersuchen. SQLite Locked Stelle sicher, dass kein paralleler Backup-Prozess l\u00e4uft. WAL-Modus erlaubt mehrere Leser, blockiert aber bei langen Schreibtransaktionen (Check Logs auf SQLITE_BUSY)."},{"location":"operations/#sicherheitsempfehlungen","title":"Sicherheitsempfehlungen","text":"
Setze AUTH_COOKIE_SECURE=true hinter TLS und konfiguriere einen Reverse Proxy (z.\u202fB. Traefik, Nginx).
Isoliere das Admin-Interface durch VPN oder IP-Filter.
Drehe API-Keys regelm\u00e4\u00dfig: /api/setup/servers/:id/api-key aktualisiert Schl\u00fcssel ohne Neuinstallation.
Nutze dedizierte StackPulse-Benutzer in Portainer, damit Berechtigungen klar getrennt bleiben.
Mit diesen Richtlinien l\u00e4sst sich StackPulse sicher betreiben und warten.
Dieses Kapitel beschreibt die Bedienung von StackPulse aus Sicht von Administrator:innen und Operators. Es orientiert sich an den Seiten im Dashboard und erkl\u00e4rt f\u00fcr jeden Bereich typische Abl\u00e4ufe sowie die notwendigen Berechtigungen. Screenshots kannst du sp\u00e4ter erg\u00e4nzen; die Texte nennen bereits alle Buttons, Eingabefelder und Statusanzeigen.
Reihenfolge 1. Setup \u2013 richtet Portainer-Anbindung und Superuser ein. 2. Stacks \u2013 zeigt alle Stacks, Redeploy-Aktionen und Filter. 3. Logs \u2013 Nachvollziehbarkeit, Filter & Export. 4. Wartung \u2013 Maintenance-Mode, Updates und SSH-Konfiguration. 5. Benutzer \u2013 Konten verwalten, Phrasen ausgeben, Passw\u00f6rter setzen. 6. Benutzergruppen & Rechte \u2013 Rollen modellieren und Berechtigungen zuweisen.
Jede Seite nennt die erforderlichen Permissions. Sobald du dich anmeldest, f\u00fchrt dich StackPulse zun\u00e4chst automatisch durch den Setup-Assistenten; danach landet man auf der Stacks-\u00dcbersicht.
Dieser Bereich verwaltet Rollenmodelle und bestimmt, welche Aktionen Benutzer:innen durchf\u00fchren d\u00fcrfen. Du ben\u00f6tigst user-groups-access zum Lesen sowie user-groups-edit/user-groups-delete f\u00fcr \u00c4nderungen.
Die Logs-Seite dient der Nachvollziehbarkeit aller Aktionen (Redeploy, Login, Wartung, Benutzerverwaltung). Sie steht Benutzer:innen mit der Permission logs-access zur Verf\u00fcgung.
Klick auf eine Tabellenzeile, um ein Seitenpanel mit vollst\u00e4ndigem JSON (metadata), Kontext (Stack, Benutzer, Quelle) und ggf. Redeploy-Timings zu \u00f6ffnen.
\u00dcber Stack \u00f6ffnen gelangst du direkt zur Stacks-Seite mit gesetztem Filter.
Der Wartungsbereich b\u00fcndelt alle Funktionen rund um Maintenance-Mode, Serververwaltung, Update-Skripte und SSH-Verbindungen. Sichtbar f\u00fcr Benutzer:innen mit maintenance-access (Teilbereiche erfordern zus\u00e4tzliche Unterrechte).
Klick auf Status pr\u00fcfen, um eine Live-Abfrage gegen Portainer durchzuf\u00fchren. Ergebnis zeigt API-Verf\u00fcgbarkeit, Endpoint-IDs und Auth-Status.
H\u00e4ufige Fehler werden direkt erkl\u00e4rt (z.\u202fB. fehlender API-Key oder Netzwerkprobleme).
Erforderliche Permission: maintenance-ssh-update. 1. Host, Port, Benutzername eintragen. Optional Passwort und zus\u00e4tzliche SSH-Argumente (z.\u202fB. -o StrictHostKeyChecking=no). 2. Passwort wird verschl\u00fcsselt gespeichert; alternativ kannst du Public-Key-Auth nutzen und das Feld leer lassen. 3. Verbindung testen: StackPulse baut eine SSH-Verbindung auf und zeigt das Ergebnis in Echtzeit.
Beim ersten Start erscheint automatisch der Setup-Bereich. Du erreichst ihn sp\u00e4ter jederzeit \u00fcber /setup, solange nicht alle Schritte abgeschlossen sind.
Verwende das Suchfeld oben rechts, um nach Namen oder IDs zu filtern.
Statuschips (z.\u202fB. \u201erunning\u201c, \u201ewarning\u201c) toggeln per Klick und lassen sich kombinieren.
\u00dcber die Spaltenk\u00f6pfe kannst du sortieren; ein erneuter Klick kehrt die Reihenfolge um.
"},{"location":"user-guide/stacks/#redeploy-aktionen","title":"Redeploy-Aktionen","text":"Aktion Voraussetzung Vorgehen Einzelner Stack Permission stacks-redeploy-single Button Redeploy in der jeweiligen Zeile klicken und best\u00e4tigen. Mehrere Stacks stacks-redeploy-selection Checkboxen der gew\u00fcnschten Stacks aktivieren, anschlie\u00dfend Redeploy Auswahl. Alle Stacks stacks-redeploy-all Button Redeploy alle ausl\u00f6sen. Nutze vorher Filter, um sicherzugehen, dass alle Stacks korrekt angezeigt werden.
W\u00e4hrend eines Redeploys erscheint pro Stack ein Fortschrittsbadge. Du kannst das Panel schlie\u00dfen; beim n\u00e4chsten Besuch wird der aktuelle Status aus dem Backend gelesen.
Falls du die Variable SELF_STACK_ID gesetzt hast, markiert StackPulse den eigenen Stack als \u201egesch\u00fctzt\u201c. Redeploy-Buttons werden deaktiviert und mit einem Info-Tooltip versehen.
"},{"location":"user-guide/stacks/#troubleshooting-aus-der-ansicht","title":"Troubleshooting aus der Ansicht","text":"
Klicke auf das Warnsymbol in der Tabellenzeile, um Fehlerdetails einzublenden.
Nutze den Link \u201eZu Logs springen\u201c, der direkt eine gefilterte Ansicht in der Log-Seite \u00f6ffnet (Stack-ID ist vorausgew\u00e4hlt).
Die Benutzerseite erm\u00f6glicht das Anlegen, Bearbeiten und Deaktivieren von Konten. Du ben\u00f6tigst mindestens die Permission users-access (lesen) bzw. users-edit/users-delete f\u00fcr \u00c4nderungen.
Button Sicherheitspassphrase anzeigen im Detailpanel.
StackPulse zeigt einen QR-Code und den alphanumerischen Code. Dieser wird nur einmal angezeigt, bis du best\u00e4tigst, dass er heruntergeladen wurde.
\u00dcber Neu generieren kannst du eine neue Phrase erstellen (Permission users-security-phrase). Informiere den Benutzer \u00fcber die neue Phrase und markiere anschlie\u00dfend \u201eheruntergeladen\u201c.
Admins k\u00f6nnen direkt im Detailpanel ein neues Passwort setzen.
Benutzer:innen selbst nutzen die Auth-Seite \u201ePasswort vergessen\u201c: Sie geben Username + Sicherheitsphrase ein und definieren anschlie\u00dfend ein neues Passwort.
Mehrfachauswahl (Checkboxen) erlaubt das gleichzeitige Aktivieren/Deaktivieren oder L\u00f6schen mehrerer Benutzer. Vorsicht: L\u00f6schen entfernt auch Audit-Verweise.
Dieser Bereich verwaltet Rollenmodelle und bestimmt, welche Aktionen Benutzer:innen durchführen dürfen. Du benötigst user-groups-access zum Lesen sowie user-groups-edit/user-groups-delete für Änderungen.
+
Gruppen anlegen
+
+
Button Gruppe erstellen wählen.
+
Pflichtfelder:
+
Name (z. B. „Ops Team“)
+
Beschreibung (Hilfestellung für Kolleg:innen)
+
Optional Tag-Farbe oder Icon setzen (für bessere Übersicht in der Benutzerliste).
+
Speichern – die Gruppe erscheint sofort in der Übersicht.
+
+
Gruppen bearbeiten
+
+
Zeile anklicken, um das Detailpanel zu öffnen.
+
Du kannst Name, Beschreibung und Zugehörige Benutzer (nur Anzeige) sehen.
+
Zum Bearbeiten der Rechte klicke auf Berechtigungen bearbeiten.
+
+
Rechte vergeben
+
Der Rechte-Dialog zeigt die gesamte Permissionstruktur in Kategorien (Stacks, Logs, Benutzer, Wartung etc.).
+
+
Wähle die gewünschte Kategorie aus.
+
Setze für jede Permission einen Level:
+
none – kein Zugriff
+
read – Zugriff auf Ansicht/Lesen
+
full – volle Bearbeitungsrechte
+
Abhängigkeiten werden automatisch hervorgehoben. Beispiel: Um logs-delete nutzen zu dürfen, muss logs-access mindestens full sein.
+
Speichern bestätigt die Anpassungen. StackPulse aktualisiert sofort die effektiven Rechte aller Benutzer in dieser Gruppe.
Dieses Kapitel beschreibt die Bedienung von StackPulse aus Sicht von Administrator:innen und Operators. Es orientiert sich an den Seiten im Dashboard und erklärt für jeden Bereich typische Abläufe sowie die notwendigen Berechtigungen. Screenshots kannst du später ergänzen; die Texte nennen bereits alle Buttons, Eingabefelder und Statusanzeigen.
+
Reihenfolge
+1. Setup – richtet Portainer-Anbindung und Superuser ein.
+2. Stacks – zeigt alle Stacks, Redeploy-Aktionen und Filter.
+3. Logs – Nachvollziehbarkeit, Filter & Export.
+4. Wartung – Maintenance-Mode, Updates und SSH-Konfiguration.
+5. Benutzer – Konten verwalten, Phrasen ausgeben, Passwörter setzen.
+6. Benutzergruppen & Rechte – Rollen modellieren und Berechtigungen zuweisen.
+
Jede Seite nennt die erforderlichen Permissions. Sobald du dich anmeldest, führt dich StackPulse zunächst automatisch durch den Setup-Assistenten; danach landet man auf der Stacks-Übersicht.
Die Logs-Seite dient der Nachvollziehbarkeit aller Aktionen (Redeploy, Login, Wartung, Benutzerverwaltung). Sie steht Benutzer:innen mit der Permission logs-access zur Verfügung.
+
Überblick
+
+
Filterleiste mit Suchfeld, Zeitspanne, Kategorie und Status.
+
Tabelle mit Severity-Farben, Nachricht, Zeitstempel und Kontextinformationen.
+
Aktionen oberhalb der Tabelle: Exportieren und Löschen.
+
+
Filtern
+
+
Zeitfenster: Datumsfelder „Von“ und „Bis“ setzen. Standardmäßig zeigt StackPulse die letzten 24 Stunden.
+
Kategorie/Status: Dropdowns nutzen, um z. B. redeploy oder wartung auszuwählen.
+
Freitext: Suchfeld durchsucht message, entity_name und metadata.
Button CSV exportieren klickst du erst, nachdem die Filter stehen. StackPulse erstellt eine CSV-Datei mit denselben Parametern.
+
Der Download startet im Browser; in containerisierten Umgebungen kannst du denselben Endpoint (/api/logs/export) auch automatisiert aufrufen.
+
+
Löschen
+
+
Einzelne Logs: Papierkorb in der Zeile (Permission logs-delete).
+
Batch-Löschung: Button Gefilterte Einträge löschen; es erscheint ein Sicherheitsdialog mit Zusammenfassung der aktiven Filter.
+
Beachte, dass gelöschte Logs nicht wiederhergestellt werden können.
+
+
Detailansicht
+
+
Klick auf eine Tabellenzeile, um ein Seitenpanel mit vollständigem JSON (metadata), Kontext (Stack, Benutzer, Quelle) und ggf. Redeploy-Timings zu öffnen.
+
Über Stack öffnen gelangst du direkt zur Stacks-Seite mit gesetztem Filter.
Der Wartungsbereich bündelt alle Funktionen rund um Maintenance-Mode, Serververwaltung, Update-Skripte und SSH-Verbindungen. Sichtbar für Benutzer:innen mit maintenance-access (Teilbereiche erfordern zusätzliche Unterrechte).
+
Portainer-Status
+
+
Klick auf Status prüfen, um eine Live-Abfrage gegen Portainer durchzuführen. Ergebnis zeigt API-Verfügbarkeit, Endpoint-IDs und Auth-Status.
+
Häufige Fehler werden direkt erklärt (z. B. fehlender API-Key oder Netzwerkprobleme).
+
+
Maintenance-Mode
+
+
Schalter Wartungsmodus aktivieren toggeln.
+
Optionale Nachricht eingeben (z. B. „Upgrade um 22:00 Uhr“); sie erscheint im gesamten UI als Banner.
+
Aktivieren/Deaktivieren protokolliert automatisch Events in den Logs.
+
+
Server & API-Key verwalten
+
+
Register „Server“ listet alle Portainer-Instanzen.
+
Über Server hinzufügen kannst du Name + URL ergänzen und anschließend API-Key speichern.
+
Buttons in der Tabelle:
+
API-Key aktualisieren – neues Token einsetzen.
+
Server löschen – nur möglich, wenn mindestens ein weiterer Server existiert oder du sofort neue Daten einträgst.
+
+
Self-Stack ID
+
+
Feld „Eigener Stack“ akzeptiert die Stack-ID, in der StackPulse selbst läuft.
+
Nach dem Speichern sind Redeploy-Aktionen für diesen Stack im Dashboard deaktiviert.
+
+
SSH-Konfiguration
+
Erforderliche Permission: maintenance-ssh-update.
+1. Host, Port, Benutzername eintragen. Optional Passwort und zusätzliche SSH-Argumente (z. B. -o StrictHostKeyChecking=no).
+2. Passwort wird verschlüsselt gespeichert; alternativ kannst du Public-Key-Auth nutzen und das Feld leer lassen.
+3. Verbindung testen: StackPulse baut eine SSH-Verbindung auf und zeigt das Ergebnis in Echtzeit.
+
Update-Skript
+
+
Standard-Skript wird angezeigt und kann als Ausgangspunkt genutzt werden.
+
Eigenes Skript: Inhalt in das Editorfeld kopieren und speichern. StackPulse prüft auf leere Zeilen und Basisbefehle.
+
Skript zurücksetzen entfernt die benutzerdefinierte Variante und stellt den Default wieder her.
+
+
Portainer-Update auslösen
+
+
Stelle sicher, dass Wartungsmodus aktiv ist und SSH-Konfiguration + Skript korrekt sind.
+
Klicke auf Update starten. Der aktuelle Fortschritt erscheint in einem Logpanel.
+
Der Button bleibt deaktiviert, solange ein Update läuft. Über Status aktualisieren kannst du den Fortschritt erneut abfragen.
+
+
Fehlerbehandlung
+
+
Bei SSH-Fehlern zeigt StackPulse die genaue Ausgabe an. Passe Host/Port/Benutzer oder Skript an.
+
Falls das Update-Skript Probleme verursacht, kannst du es jederzeit stoppen, indem du Portainer manuell prüfst und ggf. das Skript anpasst.
Beim ersten Start erscheint automatisch der Setup-Bereich. Du erreichst ihn später jederzeit über /setup, solange nicht alle Schritte abgeschlossen sind.
+
Voraussetzungen
+
+
Portainer Business Edition mit gültigem API-Key
+
Superuser-Zugangsdaten (entweder schon per Umgebungsvariablen gesetzt oder über diesen Assistenten festlegen)
+
+
Schritt 1: Portainer-Server anlegen
+
+
Formularfelder Server-URL und optional Name ausfüllen.
+
URL inkl. Protokoll (z. B. https://portainer.example.com).
+
Bezeichnung dient ausschließlich als Anzeige im Dashboard.
+
Auf Verbindung testen klicken.
+
Erfolgreich: grüner Hinweis, die Endpoints werden erkannt.
Die Stacks-Ansicht ist der Startpunkt nach dem Login und liefert einen Überblick über alle Stacks der angebundenen Portainer-Instanz.
+
Aufbau
+
+
Header mit Suchfeld, Filterchips für Status sowie Buttons für Redeploy-Aktionen.
+
Tabelle mit Name, Endpoint, Status, letzte Aktion, Redeploy-Status und verfügbaren Buttons.
+
Live-Status: Über Socket.IO wird jede Veränderung (queued/started/success/error) sofort eingeblendet.
+
+
Filter & Suche
+
+
Verwende das Suchfeld oben rechts, um nach Namen oder IDs zu filtern.
+
Statuschips (z. B. „running“, „warning“) toggeln per Klick und lassen sich kombinieren.
+
Über die Spaltenköpfe kannst du sortieren; ein erneuter Klick kehrt die Reihenfolge um.
+
+
Redeploy-Aktionen
+
+
+
+
Aktion
+
Voraussetzung
+
Vorgehen
+
+
+
+
+
Einzelner Stack
+
Permission stacks-redeploy-single
+
Button Redeploy in der jeweiligen Zeile klicken und bestätigen.
+
+
+
Mehrere Stacks
+
stacks-redeploy-selection
+
Checkboxen der gewünschten Stacks aktivieren, anschließend Redeploy Auswahl.
+
+
+
Alle Stacks
+
stacks-redeploy-all
+
Button Redeploy alle auslösen. Nutze vorher Filter, um sicherzugehen, dass alle Stacks korrekt angezeigt werden.
+
+
+
+
Während eines Redeploys erscheint pro Stack ein Fortschrittsbadge. Du kannst das Panel schließen; beim nächsten Besuch wird der aktuelle Status aus dem Backend gelesen.
+
Redeploy-Status verstehen
+
+
Queued – Auftrag ist vorgemerkt.
+
Started – Portainer verarbeitet Redeploy.
+
Success – Vorgang erfolgreich abgeschlossen.
+
Error – Fehlerdetails findest du in der Logs-Seite.
+
Info – Informative Hinweise, etwa wenn Portainer einen Stack überspringt.
+
+
Selbstschutz
+
+
Falls du die Variable SELF_STACK_ID gesetzt hast, markiert StackPulse den eigenen Stack als „geschützt“. Redeploy-Buttons werden deaktiviert und mit einem Info-Tooltip versehen.
+
+
Troubleshooting aus der Ansicht
+
+
Klicke auf das Warnsymbol in der Tabellenzeile, um Fehlerdetails einzublenden.
+
Nutze den Link „Zu Logs springen“, der direkt eine gefilterte Ansicht in der Log-Seite öffnet (Stack-ID ist vorausgewählt).
Die Benutzerseite ermöglicht das Anlegen, Bearbeiten und Deaktivieren von Konten. Du benötigst mindestens die Permission users-access (lesen) bzw. users-edit/users-delete für Änderungen.
+
Benutzer anlegen
+
+
Button Benutzer anlegen klicken.
+
Formularfelder ausfüllen:
+
Benutzername (eindeutig, wird für Login genutzt)
+
Anzeigename (optional)
+
E-Mail-Adresse
+
Passwort (kann später geändert werden)
+
Gruppen auswählen (siehe Abschnitt „Benutzergruppen“)
Mit Speichern bestätigen. Der Benutzer erscheint in der Tabelle und erhält automatisch eine Sicherheitspassphrase.
+
+
Benutzer bearbeiten
+
+
In der Tabelle auf eine Zeile klicken, um das Detailpanel zu öffnen.
+
Du kannst Anzeigename, E-Mail, Passwort und Gruppen ändern.
+
Änderungen an Gruppen erfordern users-edit sowie Gruppenrechte (user-groups-access).
+
+
Konto deaktivieren/reaktivieren
+
+
Toggle Aktiv im Detailpanel.
+
Deaktivierte Konten können sich nicht mehr anmelden, bleiben aber in der Historie.
+
+
Sicherheitspassphrase
+
+
Button Sicherheitspassphrase anzeigen im Detailpanel.
+
StackPulse zeigt einen QR-Code und den alphanumerischen Code. Dieser wird nur einmal angezeigt, bis du bestätigst, dass er heruntergeladen wurde.
+
Über Neu generieren kannst du eine neue Phrase erstellen (Permission users-security-phrase). Informiere den Benutzer über die neue Phrase und markiere anschließend „heruntergeladen“.
+
+
Passwort zurücksetzen
+
+
Admins können direkt im Detailpanel ein neues Passwort setzen.
+
Benutzer:innen selbst nutzen die Auth-Seite „Passwort vergessen“: Sie geben Username + Sicherheitsphrase ein und definieren anschließend ein neues Passwort.
+
+
Suche & Filter
+
+
Nutze das Suchfeld, um nach Benutzername oder E-Mail zu suchen.
+
Filterchips für Status (aktiv/inaktiv) erleichtern das Auffinden gesperrter Accounts.
+
+
Massenaktionen
+
+
Mehrfachauswahl (Checkboxen) erlaubt das gleichzeitige Aktivieren/Deaktivieren oder Löschen mehrerer Benutzer. Vorsicht: Löschen entfernt auch Audit-Verweise.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file