f5ec13701b339b8eba512b7546faa218ac36afcd
📦 StackPulse 
StackPulse ist eine kleine Web-App, die über die Portainer-API deine Docker-Stacks verwaltet und aktualisiert.
Sie besteht aus einem Backend (Node.js/Express) und einem Frontend (React/Tailwind).
Ziel:
- Übersicht über alle Stacks in deiner Portainer-Instanz
- Später: Updates, Deployments und Monitoring
- Bereitstellung als Docker Image, nutzbar über docker-compose
🚀 Features & Roadmap
✅ v0.1 – Initial Release
- Projektstruktur mit Frontend & Backend
- Lokales Startskript (
scripts/start-dev.sh) - Frontend zeigt Stacks an (über Backend)
- API-Verbindung zu Portainer
- Stack Redeploy
- Bereitstellung eines Docker Images über GHCR
✅ v0.2 – Release
Backend
- Anbindung einer SQLite-Datenbank
- Logging der Redeploy-Aktionen in SQLite speichern
- API-Endpunkte für Log-Abfragen
- Funktionen für Pagination, Löschen und Export
Frontend
- Anzeige der Logs (inkl. Statusfarben)
- UI-Komponenten für Log-Details
- Filterfunktionen für die Logs
- Pagination, Lösch- und Exportanzeigen
Features
- Selektive Auswahl: einzelne Stacks oder Services neu deployen
🟢 v0.3 – Abgeschlossen
Backend
- Automatische Datenbereinigung: Duplikate bei Stack-IDs erkennen & entfernen
- Erweiterung der Logs (Portainer- und Datenbereinigungsvorgänge)
- API für Filter & Suche (Stacks nach Name/Status abrufen)
- API für Sortierung der Stacks
- Portainer-Steuerung: Start/Stop/Update per Standardbefehl oder benutzerdefiniertem Skript
- Maintenance-Modus: Stackpulse pausiert während Portainer-Update und reaktiviert sich automatisch
Frontend
- Filter: Stacks nach Name oder Status durchsuchen
- Sortierung: Stacks im Frontend sortieren
- Benachrichtigungen im UI: erfolgreicher/fehlgeschlagener Redeploy (Toast + Notification-Center)
- Visualisierung der Datenbereinigung (Konflikt/Auto-Fix Meldungen)
- UI-Komponenten für Portainer-Status & Update-Steuerung
- Wartungsbereich mit Statusanzeige und Update-Aktion
Features
- Frontend-Filter und Sortierungen für schnellere Navigation bei vielen Stacks
- Echtzeit-Feedback im UI (Notifications)
- Datenkonsistenz sichern: keine doppelten Stack-IDs mehr
- Portainer-Integration inkl. Update-Workflow und Maintenance-Modus
- Verbesserte Nachvollziehbarkeit aller automatischen Prozesse
🔮 v0.4 – Geplant
Backend
- Zugriffsschutz für Endpunkte (nur authentifizierte Nutzer)
- Benutzerverwaltung in SQLite (Username + Passwort speichern)
- Passwort-Hashing mit bcrypt oder ähnlichem Verfahren
- Basic Auth Middleware (HTTP-Header-basierte Authentifizierung)
- Session/Token-Verwaltung nach Login
Frontend
- Settings Page: UI-Komponenten für grundlegende Einstellungen
- Login-Formular für Username + Passwort
- UI-Sichtbarkeit abhängig vom Login (nur eingeloggte Nutzer sehen Redeploy- und Stack-Funktionen)
- Fehleranzeige bei falschem Login (UI-Feedback)
Features
- Benutzer-Authentifizierungssystem mit sicherem Login
- Zugriffsbeschränkung auf kritische Funktionen
- Einstellungsseite für zukünftige Systemkonfigurationen
- Verbesserte Sicherheit & Session-Handling
- Grundlage für Multi-User-Management
🗂️ Projektstruktur
stackpulse/
├── backend/ # Node.js Backend mit Express
│ └── data # SQlite Datenbank
│ └── db # Datenbank-Integration
├── frontend/ # React Frontend mit Tailwind
├── scripts/ # Lokale Hilfsskripte (nicht Teil des Images)
│ └── start-dev.sh #Skript für den lokalen Start
├── Dockerfile # Multi-Stage Build für Frontend + Backend
├── docker-compose.yml
└── README.md
🔧 Lokaler Start
1. Dev-Server starten (Frontend + Backend)
./scripts/start-dev.sh
➡️ Danach:
- Frontend → http://Deine-Server-IP:5173
🐳 Docker-Setup
Mit Compose starten
version: "2.4"
services:
stackpulse:
container_name: stackpulse
image: ghcr.io/mboehmlaender/stackpulse
ports:
- '4001:4001'
volumes:
- stackpulse_data:/app/backend/data
environment:
PORTAINER_URL: "Your_Portainer_Server_Address"
PORTAINER_API_KEY: "Your_Portainer_API_Key"
PORTAINER_ENDPOINT_ID: "Your_Portainer_Endpoint_ID"
SELF_STACK_ID: "Stackpulse ID"
restart: unless-stopped
volumes:
stackpulse_data:
Die PORTAINER_ENDPOINT_ID erhältst du, wenn du die die URL im Browser ansiehst, wenn du das Dashboard in Portainer öffnest:
Die 3 wäre in diesem Fall Endpoint-ID.
Die STACK_SELF_ID findest du, wenn du das Frontend von StackPulse öffnest:
Diese ID kann erst nach dem Deploy von Stackpulse ausgelesen werden. Vergiss daher nicht, nach dem Hinterlegen der ID in den Variablen das Stack noch einmal zu redeployen!
📋 Voraussetzungen
- Node.js >= 20
- Docker & Docker Compose
- Zugang zu einer Portainer-Instanz (API-Key erforderlich)
🤝 Mitmachen
- Repo forken
- Feature-Branch erstellen
- PR gegen
devöffnen
Description


