ZMB Webui: Complete Project – Rebrand & Initial Clean Commit

ARCHITECTURE
============
Backend: FastAPI + uvicorn (port 8000)
  - JWT authentication with PAM system users
  - ZFS CLI wrapper with caching (30-60s TTL)
  - WebSocket pool status broadcaster (30s interval)
  - Services: auth, zfs_runner, file_manager, shares, identities, system_info
  - Routers: pools, datasets, snapshots, shares, identities, navigator, system

Frontend: Next.js 15 + TypeScript (static export)
  - Incremental Static Regeneration (ISR) for weak hardware
  - Type-safe API client (lib/api.ts)
  - Dark mode + custom Tailwind theme
  - Pages: Dashboard, Login, Snapshots, Datasets, Shares, etc.

DEPLOYMENT
==========
Test Target: 192.168.1.179:8090 (Debian LXC)
Production: 10.66.120.3:9090 (Raspberry Pi 4GB ARM64)
Updater: Automated Gitea-based deployment (update-test.sh, update-pi.sh)

FEATURES COMPLETED
==================
Phase 3a: Dashboard Quick Stats (System, CPU, Memory, Storage)
  - Real-time stats with color-coded progress bars
  - Responsive grid layout (mobile: 1, tablet: 2, desktop: 4 columns)
  - ISR-optimized for fast loads on weak hardware

REBRANDING
==========
Renamed throughout:
  - Project: 'ZFS Manager' → 'ZMB Webui'
  - Services: 'zfs-manager' → 'zmb-webui'
  - Systemd units: zfs-manager-backend → zmb-webui-backend
  - Configuration files and documentation

Co-Authored-By: Patrick <patrick@perlbach24.de>
This commit is contained in:
Claude Code
2026-04-22 00:26:23 +02:00
committed by Patrick
commit 6d74d874b6
104 changed files with 28836 additions and 0 deletions
+219
View File
@@ -0,0 +1,219 @@
# Phase 1: FastAPI Backend Abgeschlossen ✓
## Was wurde gebaut
Komplettes FastAPI-Backend für ZMB Webui mit:
- ✅ Alle ZFS-Operationen (Pool, Dataset, Snapshot)
- ✅ File Manager (Browse, Upload, Download) wie cockpit-files
- ✅ JWT Authentication mit bcrypt
- ✅ Caching (30s-300s TTL)
- ✅ Production-ready Systemd Service
- ✅ User Management CLI Tool
- ✅ Comprehensive Documentation
## Dateistruktur
```
backend/
├── main.py # FastAPI App (1-Click Run)
├── requirements.txt # Python Dependencies
├── install.sh # Auto-Installation für Pi
├── manage_users.py # User Management CLI
├── README.md # API Documentation
├── services/
│ ├── zfs_runner.py # ZFS Subprocess Wrapper + Caching
│ ├── auth.py # JWT Token Generation/Verification
│ └── file_manager.py # File Browser, Upload, Download
├── routers/
│ ├── auth.py # POST /api/auth/login
│ ├── pools.py # GET/POST Pool Operations
│ ├── datasets.py # GET/POST/DELETE Dataset CRUD
│ ├── snapshots.py # GET/POST/DELETE Snapshot CRUD
│ └── files.py # GET/POST/DELETE File Manager
├── models/
│ ├── pool.py # Pool, PoolStatus, PoolHealth
│ ├── dataset.py # Dataset, DatasetType
│ ├── snapshot.py # Snapshot
│ └── auth.py # User, Token, TokenData
└── config/
└── users.json # Default Admin User
deploy/
└── zmb-webui-backend.service # Systemd Service (2 Workers, 512MB RAM limit)
```
## API Endpoints
### Authentication
```
POST /api/auth/login # Login mit Username/Passwort
POST /api/auth/verify # Token Verifikation
```
### Pools
```
GET /api/pools # List aller Pools
GET /api/pools/{name} # Pool Status + VDEV-Baum
POST /api/pools/{name}/scrub # Start Scrub
```
### Datasets
```
GET /api/datasets # List Datasets (max depth 2)
POST /api/datasets # Create Dataset
DELETE /api/datasets/{name} # Delete Dataset
```
### Snapshots
```
GET /api/snapshots # List Snapshots (limit 50)
POST /api/snapshots # Create Snapshot
DELETE /api/snapshots/{name} # Delete Snapshot
POST /api/snapshots/rollback # Rollback to Snapshot
```
## Performance-Features (für 4GB RAM Pi)
**Caching Layer:**
- Pool Status: 30s TTL
- Snapshots/Datasets: 60-120s TTL
- In-Memory Cache (kein Redis nötig)
**Resource Limits:**
- gunicorn: 2 Worker
- Memory: 512M soft / 768M hard
- Timeout: 30s
- Max Requests per Worker: 500 (Memory-Leak Prevention)
**ZFS Optimization:**
- Queries mit Depth-Limit (max 2 Ebenen)
- Snapshots limitiert auf 50 (konfigurierbar)
- Subprocess Timeout: 5s
- Lazy Parsing (streaming output)
## Installation auf dem Pi
```bash
# 1. Backend kopieren
scp -r backend root@10.66.120.3:/tmp/zmb-webui-backend
# 2. Installation durchführen
ssh root@10.66.120.3
cd /tmp/zmb-webui-backend
sudo bash install.sh
# 3. Service starten
sudo systemctl start zmb-webui-backend
sudo systemctl enable zmb-webui-backend
# 4. Test
curl http://10.66.120.3:8000/health
```
## Default Credentials
**Admin User (nach Installation):**
- Username: `admin`
- Password: `admin123`
- ⚠️ SOFORT ÄNDERN!
```bash
# Passwort ändern auf dem Pi:
python3 /opt/zmb-webui/backend/manage_users.py change-password admin <newpassword>
```
## Login-Flow
```bash
# 1. Login
curl -X POST http://10.66.120.3:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
# Response:
# {"access_token":"eyJhbGc...","token_type":"bearer"}
# 2. API Request mit Token
TOKEN="eyJhbGc..."
curl http://10.66.120.3:8000/api/pools \
-H "Authorization: Bearer $TOKEN"
```
## Testing
### Lokal testen (ohne ZFS nötig)
```bash
# Nur Python-Syntax checken
python3 -m py_compile main.py models/*.py routers/*.py services/*.py
```
### Auf dem Pi testen
```bash
# Health Check
curl http://10.66.120.3:8000/health
# Login
curl -X POST http://10.66.120.3:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
# List Pools
TOKEN="<token from login>"
curl http://10.66.120.3:8000/api/pools \
-H "Authorization: Bearer $TOKEN"
# List Snapshots
curl "http://10.66.120.3:8000/api/snapshots?limit=10" \
-H "Authorization: Bearer $TOKEN"
```
## Troubleshooting
### Backend startet nicht
```bash
# Logs anschauen
journalctl -u zmb-webui-backend -f
# Service Status
systemctl status zmb-webui-backend
```
### Memory-Probleme
```bash
# Memory Usage checken
ps aux | grep uvicorn
# Service neustarten
systemctl restart zmb-webui-backend
# Oder: Cron Job für tägliche Restart (wenn nötig)
0 3 * * * systemctl restart zmb-webui-backend
```
### Snapshots dauern zu lange
```bash
# Cache leeren
curl -X POST http://10.66.120.3:8000/api/pools/clear-cache \
-H "Authorization: Bearer $TOKEN"
# Oder: Limit in URL erhöhen
curl "http://10.66.120.3:8000/api/snapshots?limit=100"
```
## Next Steps
- ✅ Phase 1: Backend fertig
- ⏳ Phase 2: Next.js Frontend bauen
- ⏳ Phase 3: WebSocket + Advanced Features
- ⏳ Phase 4: Alerts + Full Deployment
## Notes
- **No Docker!** (wie gewünscht) Direkter systemd deployment
- **Performance-optimiert** für ARM64 Raspberry Pi
- **JWT Auth** statt Session-basiert (für API-Nutzung ideal)
- **Minimal Dependencies** (nur FastAPI, Pydantic, python-jose, passlib)