Merge feature/Logging into dev

This commit is contained in:
root
2025-10-01 18:57:00 +00:00
4 changed files with 22 additions and 10 deletions
+17 -4
View File
@@ -1,4 +1,4 @@
# 📦 StackPulse # 📦 StackPulse ![Release](https://img.shields.io/badge/release-v0.2-blue.svg)
**StackPulse** ist eine kleine Web-App, die über die Portainer-API deine Docker-Stacks verwaltet und aktualisiert. **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)**. Sie besteht aus einem **Backend (Node.js/Express)** und einem **Frontend (React/Tailwind)**.
@@ -25,7 +25,7 @@ Ziel:
</details> </details>
<details open> <details open>
<summary>ð^|^e¡ v0.2.0 – In Entwicklung</summary> <summary> v0.2.0 Release</summary>
### Backend ### Backend
- [x] Anbindung einer SQLite-Datenbank - [x] Anbindung einer SQLite-Datenbank
@@ -54,7 +54,6 @@ Ziel:
</details> </details>
--- ---
## 🗂️ Projektstruktur ## 🗂️ Projektstruktur
@@ -62,6 +61,8 @@ Ziel:
```bash ```bash
stackpulse/ stackpulse/
├── backend/ # Node.js Backend mit Express ├── backend/ # Node.js Backend mit Express
│ └── data # SQlite Datenbank
│ └── db # Datenbank-Integration
├── frontend/ # React Frontend mit Tailwind ├── frontend/ # React Frontend mit Tailwind
├── scripts/ # Lokale Hilfsskripte (nicht Teil des Images) ├── scripts/ # Lokale Hilfsskripte (nicht Teil des Images)
│ └── start-dev.sh #Skript für den lokalen Start │ └── start-dev.sh #Skript für den lokalen Start
@@ -99,9 +100,21 @@ services:
- PORTAINER_URL=Deine_Portainer_Adresse/ - PORTAINER_URL=Deine_Portainer_Adresse/
- PORTAINER_API_KEY=Dein_Portainer_API_Key - PORTAINER_API_KEY=Dein_Portainer_API_Key
- PORTAINER_ENDPOINT_ID=Deine_Portainer_Endpoint_ID - PORTAINER_ENDPOINT_ID=Deine_Portainer_Endpoint_ID
- STACK_SELF_ID=ID_deiner_stackpulse_ID - SELF_STACK_ID=ID_deiner_stackpulse_ID
``` ```
Die PORTAINER_ENDPOINT_ID erhältst du, wenn du die die URL im Browser ansiehst, wenn du das Dashboard in Portainer öffnest:
![PORTAINER_ENDPOINT_ID](assets/images/ENDPOINT_ID.png)
Die 3 wäre in diesem Fall Endpoint-ID.
Die STACK_SELF_ID findest du, wenn du das Frontend von StackPulse öffnest:
![SELF_STACK_ID](assets/images/SELF_STACK_ID.png)
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 ## 📋 Voraussetzungen
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

+5 -6
View File
@@ -17,7 +17,8 @@ export default function Stacks() {
return { return {
...stack, ...stack,
redeploying: previous?.redeploying || stack.redeploying || false, redeploying: previous?.redeploying || stack.redeploying || false,
redeployDisabled: stack.redeployDisabled ?? previous?.redeployDisabled ?? false redeployDisabled: stack.redeployDisabled ?? previous?.redeployDisabled ?? false,
duplicateName: stack.duplicateName ?? previous?.duplicateName ?? false
}; };
}); });
}; };
@@ -94,9 +95,6 @@ export default function Stacks() {
}; };
const handleRedeploy = async (stackId) => { const handleRedeploy = async (stackId) => {
const targetStack = stacks.find((stack) => stack.Id === stackId);
if (targetStack?.redeployDisabled) return;
setSelectedStackIds((prev) => prev.filter((id) => id !== stackId)); setSelectedStackIds((prev) => prev.filter((id) => id !== stackId));
setStacks((prev) => setStacks((prev) =>
prev.map((stack) => prev.map((stack) =>
@@ -254,6 +252,9 @@ export default function Stacks() {
<div> <div>
<p className="text-lg font-semibold text-white">{stack.Name}</p> <p className="text-lg font-semibold text-white">{stack.Name}</p>
<p className="text-sm text-gray-400">ID: {stack.Id}</p> <p className="text-sm text-gray-400">ID: {stack.Id}</p>
{stack.duplicateName && (
<p className="text-xs text-amber-300"> Doppelter Name erkannt</p>
)}
</div> </div>
</div> </div>
@@ -275,8 +276,6 @@ export default function Stacks() {
</> </>
) : ( ) : (
<> <>
<span className="text-xs uppercase tracking-wide text-gray-400">Status</span>
<span className="text-amber-300">Veraltet</span>
<button <button
onClick={() => handleRedeploy(stack.Id)} onClick={() => handleRedeploy(stack.Id)}
disabled={isRedeploying} disabled={isRedeploying}