Files
zmb-webui/PHASE1_SUMMARY.md
Claude Code 6d74d874b6 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>
2026-04-22 00:43:05 +02:00

220 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)