{"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.

"},{"location":"#warum-stackpulse","title":"Warum StackPulse?","text":""},{"location":"#technische-eckdaten","title":"Technische Eckdaten","text":"Baustein Technologie Beschreibung Backend Node.js 20, Express, Axios, Socket.IO, better-sqlite3 Stellt REST-API, Authentifizierung, Rechte, Logging, Redeploy-Queue und Portainer-Proxy bereit. Datenhaltung SQLite (Datei backend/data/stackpulse.db) Persistente Speicherung von Benutzern, Gruppen, Servern, API-Keys, Logs und Einstellungen. Frontend React 18, Vite, Material Tailwind Dashboard Dashboard mit Auth-Flow, Stacks, Logs, Benutzer- und Wartungsansichten. Container Dockerfile + Compose Multi-Stage Build f\u00fcr Frontend + Backend, Datenvolumen f\u00fcr SQLite."},{"location":"#release-status","title":"Release-Status","text":"

Weitere geplante Features (Notifications, Monitoring, Multi-Server, Portainer CE) findest du in der Roadmap im README.

"},{"location":"#wie-geht-es-weiter","title":"Wie geht es weiter?","text":""},{"location":"architecture/","title":"Architektur","text":"

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.

\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      HTTPS + WebSocket      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      HTTPS       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Frontend  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6  \u2502   Backend     \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6 \u2502 Portainer API \u2502\n\u2502 (React)    \u2502 \u25c0\u2500\u2500\u2500\u2500\u2500 Auth-Cookie + JSON \u2500 \u2502 (Express)     \u2502 \u25c0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502  Business Ed.  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      Redeploy Events       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   (Axios Proxy)   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                             \u2502\n                                             \u25bc\n                                     SQLite Datenbank\n
"},{"location":"architecture/#hauptschichten","title":"Hauptschichten","text":""},{"location":"architecture/#datenflusse","title":"Datenfl\u00fcsse","text":"
  1. 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.
  2. Authentication: /api/auth/login erstellt Sessions (JWT-\u00e4hnliche Tokens in Cookies), AuthProvider ruft /api/auth/session zyklisch ab und speichert Berechtigungen.
  3. 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.
  4. 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.
  5. 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.
  6. Wartung: /api/maintenance/* verwaltet Maintenance-Mode, SSH-Zug\u00e4nge, Update-Skripte und serverseitige Settings (db/settings.js).
"},{"location":"architecture/#verzeichnis-referenz","title":"Verzeichnis-Referenz","text":"Pfad Inhalt backend/index.js Herzst\u00fcck der API inkl. Routing, Socket.IO, Redeploy, Setup, Auth. backend/auth/ Superuser-Verwaltung, Passwort- und Tokenfunktionen, Sicherheitsphrasen. backend/db/ SQLite-Initialisierung (ensure.js/schemaEnsure.js), Settings-Layer, DB-Blueprints. backend/logging/ Event-Log Modellierung, Filter/Export/Delete. backend/groups/, backend/users/, backend/permissions/ Domain-Logik f\u00fcr Benutzer- & Rechteverwaltung. backend/maintenance/ Maintenance-Mode sowie SSH-/Update-Konfiguration. frontend/src/ React-App (Layouts, Pages, Widgets, Provider). routes.jsx definiert Navigation & Permissions. scripts/ Hilfsskripte (z.\u202fB. start-dev.sh). Dockerfile, docker-compose*.yml Build- & Deployment-Spezifikation."},{"location":"architecture/#konfiguration-secrets","title":"Konfiguration & Secrets","text":""},{"location":"architecture/#skalierung-grenzen","title":"Skalierung & Grenzen","text":"

Die weiteren Kapitel vertiefen Backend- und Frontend-spezifische Details.

"},{"location":"backend/","title":"Backend & API","text":"

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/#laufzeit-einstiegspunkte","title":"Laufzeit & Einstiegspunkte","text":""},{"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":""},{"location":"backend/#berechtigungssystem","title":"Berechtigungssystem","text":""},{"location":"backend/#redeploy-workflow","title":"Redeploy-Workflow","text":"
  1. Eingehender Request wird mit maintenanceGuard gepr\u00fcft (Maintenance-Modus blockiert optional Redeploys).
  2. Das Backend ermittelt den zugeh\u00f6rigen Portainer-Endpoint (resolvePortainerEnvironmentId).
  3. Der Redeploy wird \u00fcber Portainer ausgef\u00fchrt (/api/stacks/:id/redeploy), Log-Eintr\u00e4ge werden erstellt.
  4. broadcastRedeployStatus() aktualisiert das In-Memory-Tracking (redeployingStacks) und sendet Socket.IO Events.
  5. Fehler f\u00fchren zu event_logs-Eintr\u00e4gen mit severity=error, UI zeigt Toasts via ToastProvider.
"},{"location":"backend/#wartungs-und-updatepfad","title":"Wartungs- und Updatepfad","text":""},{"location":"backend/#erweiterungstipps","title":"Erweiterungstipps","text":""},{"location":"frontend/","title":"Frontend","text":"

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":"
frontend/src\n\u251c\u2500\u2500 App.jsx                # Entry-Point, registriert Layouts & Provider\n\u251c\u2500\u2500 components/           # AuthProvider, PermissionGate, Toast/Maintenance/PageProvider\n\u251c\u2500\u2500 layouts/              # Dashboard-Layout (Sidebar, Navbar) & Auth-Layout\n\u251c\u2500\u2500 pages/\n\u2502   \u251c\u2500\u2500 auth/             # SignIn, SignUp, ForgotPassword, SignOut\n\u2502   \u251c\u2500\u2500 dashboard/        # Stacks, Logs, Maintenance, Users, Usergroups, Detailseiten\n\u2502   \u2514\u2500\u2500 setup/            # Setup-Wizard & Helper Screens\n\u251c\u2500\u2500 routes.jsx            # zentrale Navigationsdefinition inkl. Permissions\n\u251c\u2500\u2500 widgets/, data/, configs/, assets/\n\u2514\u2500\u2500 tailwind.css          # Tailwind Layer & Custom Styles\n
"},{"location":"frontend/#routing-navigation","title":"Routing & Navigation","text":""},{"location":"frontend/#state-management-contexts","title":"State-Management & Contexts","text":"Provider Aufgabe AuthProvider Speichert User, Permissions, Session-Status. Stellt refreshSession, logout, hasPermission bereit. PageProvider Zentrale UI-Zust\u00e4nde (z.\u202fB. Ladeanzeigen, modale Dialoge) f\u00fcr Dashboard-Komponenten. ToastProvider Globale Notifications (z.\u202fB. Redeploy-Erfolg/Fehler). MaintenanceProvider Cached Maintenance-Status, erkennt aktive Maintenance Modes und zeigt Hinweise."},{"location":"frontend/#wichtige-seiten","title":"Wichtige Seiten","text":""},{"location":"frontend/#datenzugriff","title":"Datenzugriff","text":""},{"location":"frontend/#styling-komponenten","title":"Styling & Komponenten","text":""},{"location":"frontend/#erweiterungshinweise","title":"Erweiterungshinweise","text":"
  1. Neue Seiten: Route in routes.jsx erg\u00e4nzen, optional PermissionGate konfigurieren und Seite unter pages/dashboard oder pages/auth anlegen.
  2. API-Anbindungen: Verwende axios und achte auf try/catch, damit 401/403 sauber abgefangen werden. Bei kritischen Anforderungen refreshSession aufrufen.
  3. State teilen: Nutze bestehende Provider bzw. erzeuge einen eigenen Context in components/.
  4. Deployment: npm run build liefert ein Self-Contained Bundle. Das Backend dient anschlie\u00dfend als Static Host (express.static).

Damit bietet das Frontend eine anpassbare, klar strukturierte Oberfl\u00e4che, die eng mit den Backend-Permissions verzahnt ist.

"},{"location":"getting-started/","title":"Getting Started","text":"

Dieser Leitfaden hilft dir, StackPulse lokal oder als Container aufzusetzen und die ersten Schritte im UI abzuschlie\u00dfen.

"},{"location":"getting-started/#voraussetzungen","title":"Voraussetzungen","text":""},{"location":"getting-started/#repository-abhangigkeiten","title":"Repository & Abh\u00e4ngigkeiten","text":"
# Repository klonen\n# git clone <repo-url>\ncd stackpulse\n\n# Skript ausf\u00fchrbar machen\nchmod +x scripts/start-dev.sh\n
"},{"location":"getting-started/#lokale-dev-umgebung","title":"Lokale Dev-Umgebung","text":"

Das Skript scripts/start-dev.sh richtet Backend und Frontend automatisch ein:

  1. Backend: npm install, npm run migrate (erstellt/aktualisiert backend/data/stackpulse.db), npm start
  2. Frontend: npm install, npm run dev (Port 5173) und ein einmaliges npm run build, um statische Assets ins Backend zu spiegeln

Nach erfolgreichem Start: - Frontend dev server: http://localhost:5173 - Backend API & statische Assets: http://localhost:4001

Zum Stoppen STRG+C verwenden.

"},{"location":"getting-started/#manuelles-starten","title":"Manuelles Starten","text":"
# 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":"
  1. \u00d6ffne das Frontend (/setup f\u00fchrt dich automatisch durch den Wizard).
  2. Lege den Portainer-Server und den zugeh\u00f6rigen API-Key an \u2013 StackPulse testet die Verbindung per /api/setup/test-portainer.
  3. Registriere einen Superuser oder verwende den per Umgebungsvariablen automatisch angelegten Account.
  4. Nach erfolgreicher Einrichtung kannst du dich anmelden und erh\u00e4ltst Zugriff auf Dashboard, Logs, Benutzer & Wartung.
"},{"location":"getting-started/#docker-deployment","title":"Docker-Deployment","text":"
# docker-compose.yml (Auszug)\nservices:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"4001:4001\"\n    volumes:\n      - stackpulse_data:/app/backend/data\n    restart: unless-stopped\n    environment:\n      - PORTAINER_URL=https://portainer.example.com\n      - PORTAINER_API_KEY=xxxx\n      - SUPERUSER_USERNAME=admin\n      - SUPERUSER_EMAIL=admin@example.com\n      - SUPERUSER_PASSWORD=changeme\n      - SELF_STACK_ID=123\nvolumes:\n  stackpulse_data:\n
  1. docker compose up -d --build
  2. Das Frontend ist anschlie\u00dfend unter Port 4001 (via Backend public/) erreichbar.
  3. Datenbank & Einstellungen liegen im benannten Volume stackpulse_data.
"},{"location":"getting-started/#datenbank-migration","title":"Datenbank & Migration","text":"

Damit bist du bereit f\u00fcr die tieferen Kapitel zu Architektur sowie Backend- und Frontend-Details.

"},{"location":"operations/","title":"Operations & Wartung","text":"

Dieser Abschnitt deckt typische Aufgaben f\u00fcr Betriebsteams ab \u2013 von Backups \u00fcber Wartungsmodus bis zu St\u00f6rungssuche.

"},{"location":"operations/#laufender-betrieb","title":"Laufender Betrieb","text":""},{"location":"operations/#backups-wiederherstellung","title":"Backups & Wiederherstellung","text":"
  1. Container-Setup: Mount backend/data via benanntem Volume (siehe docker-compose.yml).
  2. Backup: Stoppe kurz den Container oder nutze sqlite3 stackpulse.db \".backup 'stackpulse.db.bak'\" innerhalb der laufenden Instanz.
  3. Restore: Ersetze die Datei im Volume und starte die App neu. Beim ersten Start f\u00fchrt ensureDatabaseSchema automatisch eventuelle Nachmigrationen aus.
"},{"location":"operations/#benutzer-rechteverwaltung","title":"Benutzer- & Rechteverwaltung","text":""},{"location":"operations/#wartungsmodus-updates","title":"Wartungsmodus & Updates","text":""},{"location":"operations/#logs-compliance","title":"Logs & Compliance","text":""},{"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":"

Mit diesen Richtlinien l\u00e4sst sich StackPulse sicher betreiben und warten.

"},{"location":"user-guide/","title":"Benutzerhandbuch","text":"

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.

"},{"location":"user-guide/groups/","title":"Benutzergruppen & Rechte","text":"

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.

"},{"location":"user-guide/groups/#gruppen-anlegen","title":"Gruppen anlegen","text":"
  1. Button Gruppe erstellen w\u00e4hlen.
  2. Pflichtfelder:
  3. Name (z.\u202fB. \u201eOps Team\u201c)
  4. Beschreibung (Hilfestellung f\u00fcr Kolleg:innen)
  5. Optional Tag-Farbe oder Icon setzen (f\u00fcr bessere \u00dcbersicht in der Benutzerliste).
  6. Speichern \u2013 die Gruppe erscheint sofort in der \u00dcbersicht.
"},{"location":"user-guide/groups/#gruppen-bearbeiten","title":"Gruppen bearbeiten","text":""},{"location":"user-guide/groups/#rechte-vergeben","title":"Rechte vergeben","text":"

Der Rechte-Dialog zeigt die gesamte Permissionstruktur in Kategorien (Stacks, Logs, Benutzer, Wartung etc.).

  1. W\u00e4hle die gew\u00fcnschte Kategorie aus.
  2. Setze f\u00fcr jede Permission einen Level:
  3. none \u2013 kein Zugriff
  4. read \u2013 Zugriff auf Ansicht/Lesen
  5. full \u2013 volle Bearbeitungsrechte
  6. Abh\u00e4ngigkeiten werden automatisch hervorgehoben. Beispiel: Um logs-delete nutzen zu d\u00fcrfen, muss logs-access mindestens full sein.
  7. Speichern best\u00e4tigt die Anpassungen. StackPulse aktualisiert sofort die effektiven Rechte aller Benutzer in dieser Gruppe.
"},{"location":"user-guide/groups/#benutzer-zu-gruppen-hinzufugen","title":"Benutzer zu Gruppen hinzuf\u00fcgen","text":""},{"location":"user-guide/groups/#gruppen-loschen","title":"Gruppen l\u00f6schen","text":""},{"location":"user-guide/groups/#best-practices","title":"Best Practices","text":""},{"location":"user-guide/logs/","title":"Logs-Seite","text":"

Die Logs-Seite dient der Nachvollziehbarkeit aller Aktionen (Redeploy, Login, Wartung, Benutzerverwaltung). Sie steht Benutzer:innen mit der Permission logs-access zur Verf\u00fcgung.

"},{"location":"user-guide/logs/#uberblick","title":"\u00dcberblick","text":""},{"location":"user-guide/logs/#filtern","title":"Filtern","text":"
  1. Zeitfenster: Datumsfelder \u201eVon\u201c und \u201eBis\u201c setzen. Standardm\u00e4\u00dfig zeigt StackPulse die letzten 24 Stunden.
  2. Kategorie/Status: Dropdowns nutzen, um z.\u202fB. redeploy oder wartung auszuw\u00e4hlen.
  3. Freitext: Suchfeld durchsucht message, entity_name und metadata.
  4. Erweiterte Filter: Klick auf \u201eWeitere Filter\u201c \u00f6ffnet zus\u00e4tzliche Optionen (Actor, Stack-ID, Severity).
"},{"location":"user-guide/logs/#export","title":"Export","text":""},{"location":"user-guide/logs/#loschen","title":"L\u00f6schen","text":""},{"location":"user-guide/logs/#detailansicht","title":"Detailansicht","text":""},{"location":"user-guide/maintenance/","title":"Wartungsbereich","text":"

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).

"},{"location":"user-guide/maintenance/#portainer-status","title":"Portainer-Status","text":""},{"location":"user-guide/maintenance/#maintenance-mode","title":"Maintenance-Mode","text":"
  1. Schalter Wartungsmodus aktivieren toggeln.
  2. Optionale Nachricht eingeben (z.\u202fB. \u201eUpgrade um 22:00 Uhr\u201c); sie erscheint im gesamten UI als Banner.
  3. Aktivieren/Deaktivieren protokolliert automatisch Events in den Logs.
"},{"location":"user-guide/maintenance/#server-api-key-verwalten","title":"Server & API-Key verwalten","text":""},{"location":"user-guide/maintenance/#self-stack-id","title":"Self-Stack ID","text":""},{"location":"user-guide/maintenance/#ssh-konfiguration","title":"SSH-Konfiguration","text":"

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.

"},{"location":"user-guide/maintenance/#update-skript","title":"Update-Skript","text":""},{"location":"user-guide/maintenance/#portainer-update-auslosen","title":"Portainer-Update ausl\u00f6sen","text":"
  1. Stelle sicher, dass Wartungsmodus aktiv ist und SSH-Konfiguration + Skript korrekt sind.
  2. Klicke auf Update starten. Der aktuelle Fortschritt erscheint in einem Logpanel.
  3. Der Button bleibt deaktiviert, solange ein Update l\u00e4uft. \u00dcber Status aktualisieren kannst du den Fortschritt erneut abfragen.
"},{"location":"user-guide/maintenance/#fehlerbehandlung","title":"Fehlerbehandlung","text":""},{"location":"user-guide/setup/","title":"Setup-Assistent","text":"

Beim ersten Start erscheint automatisch der Setup-Bereich. Du erreichst ihn sp\u00e4ter jederzeit \u00fcber /setup, solange nicht alle Schritte abgeschlossen sind.

"},{"location":"user-guide/setup/#voraussetzungen","title":"Voraussetzungen","text":""},{"location":"user-guide/setup/#schritt-1-portainer-server-anlegen","title":"Schritt 1: Portainer-Server anlegen","text":"
  1. Formularfelder Server-URL und optional Name ausf\u00fcllen.
  2. URL inkl. Protokoll (z.\u202fB. https://portainer.example.com).
  3. Bezeichnung dient ausschlie\u00dflich als Anzeige im Dashboard.
  4. Auf Verbindung testen klicken.
  5. Erfolgreich: gr\u00fcner Hinweis, die Endpoints werden erkannt.
  6. Fehlgeschlagen: Fehlermeldung pr\u00fcfen (h\u00e4ufig Zertifikats-/Firewall-Themen).
  7. Mit Speichern & Weiter best\u00e4tigst du den Servereintrag. StackPulse legt ihn verschl\u00fcsselt in SQLite ab.
"},{"location":"user-guide/setup/#schritt-2-api-key-hinterlegen","title":"Schritt 2: API-Key hinterlegen","text":"
  1. API-Key im Feld Portainer API Key einf\u00fcgen.
  2. Optional kannst du \u00fcber Stacks laden kontrollieren, ob Portainer Stacks zur\u00fcckliefert.
  3. Mit Speichern wird der Schl\u00fcssel verschl\u00fcsselt gespeichert. Du kannst ihn sp\u00e4ter im Maintenance-Bereich austauschen.
"},{"location":"user-guide/setup/#schritt-3-superuser-registrieren","title":"Schritt 3: Superuser registrieren","text":"
  1. Falls du SUPERUSER_* Variablen gesetzt hast, zeigt StackPulse an, dass bereits ein Superuser existiert \u2013 du kannst direkt weiter.
  2. Ansonsten Benutzername, E-Mail und Passwort vergeben. Das Passwort dient nur f\u00fcr diesen Account; weitere Benutzer folgen sp\u00e4ter.
  3. Auf Superuser anlegen klicken. Nach Erfolg wird der Login-Button eingeblendet.
"},{"location":"user-guide/setup/#abschluss-login","title":"Abschluss & Login","text":""},{"location":"user-guide/setup/#setup-wiederholen-oder-andern","title":"Setup wiederholen oder \u00e4ndern","text":""},{"location":"user-guide/stacks/","title":"Stacks-Seite","text":"

Die Stacks-Ansicht ist der Startpunkt nach dem Login und liefert einen \u00dcberblick \u00fcber alle Stacks der angebundenen Portainer-Instanz.

"},{"location":"user-guide/stacks/#aufbau","title":"Aufbau","text":""},{"location":"user-guide/stacks/#filter-suche","title":"Filter & Suche","text":"
  1. Verwende das Suchfeld oben rechts, um nach Namen oder IDs zu filtern.
  2. Statuschips (z.\u202fB. \u201erunning\u201c, \u201ewarning\u201c) toggeln per Klick und lassen sich kombinieren.
  3. \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.

"},{"location":"user-guide/stacks/#redeploy-status-verstehen","title":"Redeploy-Status verstehen","text":""},{"location":"user-guide/stacks/#selbstschutz","title":"Selbstschutz","text":""},{"location":"user-guide/stacks/#troubleshooting-aus-der-ansicht","title":"Troubleshooting aus der Ansicht","text":""},{"location":"user-guide/users/","title":"Benutzerverwaltung","text":"

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.

"},{"location":"user-guide/users/#benutzer-anlegen","title":"Benutzer anlegen","text":"
  1. Button Benutzer anlegen klicken.
  2. Formularfelder ausf\u00fcllen:
  3. Benutzername (eindeutig, wird f\u00fcr Login genutzt)
  4. Anzeigename (optional)
  5. E-Mail-Adresse
  6. Passwort (kann sp\u00e4ter ge\u00e4ndert werden)
  7. Gruppen ausw\u00e4hlen (siehe Abschnitt \u201eBenutzergruppen\u201c)
  8. Optional: Benutzer sofort aktivieren/deaktivieren.
  9. Mit Speichern best\u00e4tigen. Der Benutzer erscheint in der Tabelle und erh\u00e4lt automatisch eine Sicherheitspassphrase.
"},{"location":"user-guide/users/#benutzer-bearbeiten","title":"Benutzer bearbeiten","text":""},{"location":"user-guide/users/#konto-deaktivierenreaktivieren","title":"Konto deaktivieren/reaktivieren","text":""},{"location":"user-guide/users/#sicherheitspassphrase","title":"Sicherheitspassphrase","text":"
  1. Button Sicherheitspassphrase anzeigen im Detailpanel.
  2. StackPulse zeigt einen QR-Code und den alphanumerischen Code. Dieser wird nur einmal angezeigt, bis du best\u00e4tigst, dass er heruntergeladen wurde.
  3. \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.
"},{"location":"user-guide/users/#passwort-zurucksetzen","title":"Passwort zur\u00fccksetzen","text":""},{"location":"user-guide/users/#suche-filter","title":"Suche & Filter","text":""},{"location":"user-guide/users/#massenaktionen","title":"Massenaktionen","text":""}]}