feat: Phase 3 – Modul-System (Manifest, ZIP-Installation, Lifecycle, Prozess-Manager)

This commit is contained in:
MPM Dev
2026-10-07 15:37:09 +02:00
parent e87dc1f836
commit 4bbca21fd6
31 changed files with 2055 additions and 19 deletions

View File

@@ -142,8 +142,17 @@ Security Hardening (Penetrationstests, Dependency/Container-Scans, HSTS, Backup/
| DELETE | `/api/v1/users/:id` | Admin | Benutzer löschen |
| GET | `/api/v1/profile` | Session | Eigenes Profil |
| PATCH | `/api/v1/profile/password` | Session | Eigenes Passwort ändern |
| GET | `/api/v1/modules` | Admin | Alle Module |
| POST | `/api/v1/modules/install` | Admin | ZIP-Paket installieren (multipart, Feld `package`) |
| GET | `/api/v1/modules/:id` | Admin | Einzelnes Modul |
| POST | `/api/v1/modules/:id/start` | Admin | Modul starten |
| POST | `/api/v1/modules/:id/stop` | Admin | Modul stoppen |
| POST | `/api/v1/modules/:id/restart` | Admin | Modul neu starten |
| PATCH | `/api/v1/modules/:id/enabled` | Admin | Modul aktivieren/deaktivieren |
| GET | `/api/v1/modules/:id/health` | Admin | Healthcheck ausführen |
| DELETE | `/api/v1/modules/:id` | Admin | Modul entfernen |
OpenAPI/Swagger UI: `/api/docs` · Ab Phase 3: `/api/v1/modules/*`, `/api/v1/permissions/*`, `/api/v1/audit/*`.
OpenAPI/Swagger UI: `/api/docs` · Ab Phase 4: dynamisches Routing `/slug`.
### Schutzregeln der Benutzerverwaltung
@@ -153,9 +162,11 @@ OpenAPI/Swagger UI: `/api/docs` · Ab Phase 3: `/api/v1/modules/*`, `/api/v1/per
- Passwort-Reset (Admin) meldet den Benutzer von allen Sessions ab
- Eigenes Passwort ändern meldet alle übrigen Sessions ab (aktuelle bleibt aktiv)
## 9. Modul-Vertrag (Ausblick Phase 3+)
## 9. Modul-System (Phase 3)
Jedes Modul liefert ein Manifest (`module.json`) und einen minimalen API-Vertrag:
### Manifest-Vertrag
Jedes Modul-Paket (ZIP, max. 10 MB) enthält ein `module.json`:
```json
{
@@ -164,6 +175,7 @@ Jedes Modul liefert ein Manifest (`module.json`) und einen minimalen API-Vertrag
"version": "1.0.0",
"slug": "kalender-tool",
"description": "Kalenderverwaltung",
"author": "…",
"runtime": "node",
"entrypoint": "server.js",
"port": 41001,
@@ -172,7 +184,27 @@ Jedes Modul liefert ein Manifest (`module.json`) und einen minimalen API-Vertrag
}
```
Minimal-API je Modul: `GET /health`, `GET /api/manifest`, `GET /api/me`. Installation als ZIP-Paket mit Validierung, Dependency-Installation, Migrationen und Healthcheck. Details: [`modules/README.md`](../modules/README.md).
Validierung per Zod: ID/Slug-Muster, SemVer, Port 41000–41999, kein Pfad-Traversal im Entrypoint, Runtime `node`, apiVersion `v1`.
### Lifecycle
```
INSTALLED → STARTING → RUNNING → STOPPING → STOPPED
↓ ↓
ERROR ERROR DISABLED (via Enable/Disable)
```
### Sicherheitsmaßnahmen
- **Zip-Slip-Schutz**: Alle ZIP-Einträge müssen im Zielverzeichnis bleiben
- **Minimale Prozess-ENV**: Module erhalten nur `PATH`, `NODE_ENV`, `PORT` – keine Plattform-Secrets
- **Spawn ohne Shell**: keine Command-Injection möglich
- **Eigene Log-Dateien** pro Modul (`/app/data/logs/module-<id>.log`)
- **Startup-Grace**: Healthcheck mit 10 Retries, bevor ein Modul als ERROR gilt
- **Isolation**: Ein abgestürztes Modul (ERROR) beeinträchtigt weder Plattform noch andere Module
- Persistente Volumes: Modul-Dateien und Logs überleben Container-Updates
Minimal-API je Modul (Phase 6): `GET /health`, `GET /api/manifest`, `GET /api/me`. Details zum Paketformat: [`modules/README.md`](../modules/README.md).
## 10. Architektur-Entscheidungen (ADR-Kurzform)