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 92bed208e0
108 changed files with 29925 additions and 0 deletions
+417
View File
@@ -0,0 +1,417 @@
# Proxmox LXC Setup für ZMB Webui
ZMB Webui läuft in **Proxmox LXC Container** mit direktem Zugriff auf Proxmox Host ZFS Pools.
## Voraussetzungen
- ✅ Proxmox Host mit ZFS (z.B. pool "tank")
- ✅ LXC Container Support
- ✅ Netzwerk-Zugriff zum Container
## 1. Container im Proxmox erstellen
### Via Proxmox Web UI
1. **Datacenter → Nodes → <node-name> → Create CT**
- Hostname: `zmb-webui`
- CT ID: z.B. `100`
- Unprivileged: **NEIN** ← Muss Privilegiert sein!
- Template: `debian-12-standard`
- Storage: Proxmox-Default OK
- Memory: 2048 MB (2GB) mindestens
- Cores: 2 (für Pi Kompatibilität reicht auch 1)
- Disk: 20-30GB
2. **Features aktivieren:**
- [x] Nesting (für systemd, etc.)
- [x] Keyctl (für systemd-homed)
- [x] Mknod (für Devices)
### Via CLI (pveam)
```bash
# Auf Proxmox Host:
# Template herunterladen (falls nicht vorhanden)
pveam download local debian-12-standard_12.2-1_amd64.tar.zst
# Container erstellen
pct create 100 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \
--hostname zmb-webui \
--memory 2048 \
--cores 2 \
--storage local-lvm \
--net0 name=eth0,bridge=vmbr0 \
--onboot 1 \
--features nesting=1,keyctl=1,mknod=1 \
--privileged 1
# Starten
pct start 100
# Shell Zugriff
pct enter 100
```
## 2. ZFS Mounting im Container
### A. Host-Bindung (Recommended)
```bash
# Auf dem Proxmox Host:
# ZFS-Mountpoint für Container zugänglich machen
# (Proxmox macht das nicht automatisch!)
# Option 1: Via /etc/pct/lxc/100/config
pct set 100 -mp0 /tank/share,mp=/tank/share
# oder direkt in config editieren:
nano /etc/pve/lxc/100.conf
# Hinzufügen:
mp0: /tank/share,mp=/tank/share
# Container neustarten:
pct reboot 100
```
### B. ZFS im Container - Kernel Module
```bash
# Proxmox Host muss ZFS Kernel Module haben:
lsmod | grep zfs
# Falls leer: apt install zfsutils-linux
# Im privilegierten Container wird das Kernel-Modul vom Host sichtbar:
pct enter 100
# Im Container:
lsmod | grep zfs # Sollte auch sichtbar sein!
zpool list # Sollte Host-Pools zeigen
```
## 3. Backend Installation im Container
```bash
# Auf dem Proxmox Host:
pct enter 100
# Im Container:
apt update && apt upgrade -y
apt install -y python3 python3-pip python3-venv git curl
# Backend klonen (oder kopieren)
git clone <repo-url> /opt/zmb-webui
cd /opt/zmb-webui/backend
# System check
bash check_system.sh
# Sollte zeigen:
# ✓ Debian
# ✓ Privileged Container (erkannt!)
# ✓ ZFS Tools verfügbar
# ✓ /tank/share gemountet
# Installation
bash install.sh
# Service starten
systemctl start zmb-webui-backend
systemctl status zmb-webui-backend
# Test
curl http://localhost:8000/health
```
## 4. Network Access vom Host/External
### Container IP finden
```bash
# Im Container:
ip addr show eth0
# Oder vom Host:
pct exec 100 ip addr show eth0
# z.B.: 192.168.100.150
```
### Zugriff vom Host
```bash
# SSH vom Host zum Container
ssh root@<container-ip>
# oder direkt via pct:
pct enter 100
# Über Proxmox Firewall (falls aktiviert):
# Neue Regel: Port 8000 (Backend) erlauben
```
### Zugriff von External (Outside Proxmox)
```bash
# Option A: Port Forward auf Proxmox Host
# (In Proxmox Firewall oder iptables)
# Option B: Reverse Proxy auf Host
# nginx auf Proxmox Host → 9090 → Container :8000
sudo nano /etc/nginx/sites-available/zmb-webui
# Inhalt:
server {
listen 9090 ssl http2;
server_name _;
ssl_certificate /etc/pve/nodes/<node>/pve-ssl.pem;
ssl_certificate_key /etc/pve/nodes/<node>/pve-ssl.key;
location / {
proxy_pass http://<container-ip>:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
sudo systemctl restart nginx
# Dann: https://<proxmox-host-ip>:9090
```
## 5. ZFS Management im Container
### Test ZFS Funktionalität
```bash
# Im Container:
# Pool-Liste (vom Proxmox Host!)
zpool list
# tank 364G 189G 175G - - 0% 52% 1.00x ONLINE -
# Datasets anschauen
zfs list
# Snapshots erstellen
zfs snapshot tank/share@test-2026-04-14
# Scrub starten
zpool scrub tank
# Backend API Test
TOKEN=$(curl -s -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}' | jq -r .access_token)
curl http://localhost:8000/api/pools \
-H "Authorization: Bearer $TOKEN"
# → Zeigt [{"name":"tank", ...}]
```
## 6. Container Backup/Restore
### Proxmox Native Backup
```bash
# Auf dem Host:
# Container Backup erstellen
vzdump 100 --storage local --notes "zmb-webui vor update"
# Backup anschauen
ls -lh /var/lib/vz/dump/
# Restore
pct restore 101 /var/lib/vz/dump/vzdump-lxc-100-2026_04_14-12_30_45.tar.zst
pct start 101
```
### Snapshot im Container
```bash
# Im Container:
systemctl stop zmb-webui-backend
# ZFS Snapshot des / Filesystems
zfs snapshot rpool/data/containers/100@backup-2026-04-14
# Oder: Proxmox Snapshot
systemctl start zmb-webui-backend
```
## 7. Monitoring & Logging
```bash
# Proxmox Web UI → CT 100 → Logs
# oder SSH:
pct enter 100
journalctl -u zmb-webui-backend -f
# Memory/CPU im Container
top
free -h
df -h /
# Proxmox Monitoring
# Web UI → Nodes → <node> → Resources
```
## 8. Performance Tuning
### Memory im Container
```bash
# Proxmox Host Container config anpassen
pct set 100 --memory 2048
pct set 100 --swap 512 # Swap auch gut
# Vom Container-Zustand her:
free -h
# Total sollte ~2GB sein
```
### CPU Zuordnung
```bash
# Alle Cores des Proxmox Hosts nutzen
pct set 100 --cores 2 # oder mehr, je nach Host
# CPU-Limit setzen (optional)
# pct set 100 --cpulimit 2 # Max 2 CPU cores
```
### Disk Performance
```bash
# Wenn Container auf lokallvm läuft:
# Default OK, aber SSD ist besser
# Wenn auf ZFS läuft (Proxmox Storage):
# ZFS selbst managed das
```
## 9. Proxmox-spezifische Gotchas
### Issue: ZFS im Container nicht sichtbar
```bash
# Problem: zfs commands geben "command not found"
# Lösung:
# 1. Im Container installieren
apt install -y zfsutils-linux
# 2. Host-Kernel-Module müssen geladen sein
pct enter 100
modprobe zfs
lsmod | grep zfs
# 3. Privilegiert-Mode checken
# /etc/pve/lxc/100.conf sollte haben:
features: nesting=1
```
### Issue: /tank/share nicht gemountet im Container
```bash
# Problem: ls /tank/share → Permission denied
# Lösung:
# /etc/pve/lxc/100.conf checken:
cat /etc/pve/lxc/100.conf | grep mp0
# Falls nicht vorhanden, hinzufügen:
pct set 100 -mp0 /tank/share,mp=/tank/share
# Container neustarten:
pct reboot 100
# Oder manuell in config:
nano /etc/pve/lxc/100.conf
# mp0: /tank/share,mp=/tank/share
```
### Issue: Port 8000/9090 nicht erreichbar
```bash
# Proxmox Firewall prüfen
# Web UI → Firewall
# oder CLI:
pve-firewall status
pve-firewall enable
# Port erlauben:
# Datacenter → Firewall → Add Rule
# Action: ACCEPT
# Direction: IN
# Protocol: TCP
# Destination Port: 8000 (oder 9090)
# Dann im Container prüfen:
netstat -tlnp | grep 8000
```
## 10. Security
### Unprivilegiert vs Privilegiert
```
⚠️ Container ist PRIVILEGIERT!
Risiken:
- Root im Container ≈ Root auf Host
- Zugriff auf Host-Filesystems
Mitigationen:
- Firewall (Proxmox + System)
- regelmäßige Updates
- Backup-Strategy
- Monitoring
```
### Firewall Rules (Proxmox)
```bash
# Nur lokales Netzwerk zulassen
Datacenter → Firewall:
- Allow FROM 192.168.x.0/24 → Port 8000
# oder SSH Tunnel statt direkter Zugriff
ssh -L 9090:localhost:8000 root@proxmox-host
curl http://localhost:9090/health
```
## 11. Production Checklist
- [ ] Container erstellt & Started
- [ ] ZFS Mount funktioniert (`ls /tank/share`)
- [ ] Backend installiert & Running
- [ ] `curl /health` → 200 OK
- [ ] Admin-Passwort geändert
- [ ] Firewall konfiguriert
- [ ] Network/SSH Zugriff funktioniert
- [ ] Backup-Strategy definiert
- [ ] Monitoring konfiguriert
- [ ] Logs prüfbar
## Zusammenfassung
```
Proxmox Host
├── ZFS Pool: tank
├── LXC Container: 100 (zmb-webui, privilegiert)
│ ├── /tank/share (gemountet)
│ ├── FastAPI :8000
│ └── systemd service: zmb-webui-backend
└── Firewall: Port 8000/9090 allowed
```
---
**Backend läuft im Proxmox LXC Container mit vollständigem ZFS Management!** 🚀