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
+178
View File
@@ -0,0 +1,178 @@
# Session Summary ZMB Webui April 18, 2026
**Session Duration**: Continued from previous session
**Primary Objective**: Implement and verify Samba password management, resolve SPA routing issues
**Status**: ✅ **ALL OBJECTIVES COMPLETED AND VERIFIED**
---
## What Was Accomplished
### 1. Fixed SPA Routing & Frontend Deployment ✅
**Issue**: `/identities`, `/files`, and other SPA routes were returning 404 instead of serving index.html
**Root Cause**: `main.py` catch-all route was checking wrong path for static files (looking for `/frontend/out/` instead of `/backend/static/`)
**Solution**:
- Modified `backend/main.py` lines 174-191 to check `/static/` directory first
- Fixed path priority: static (production) before frontend/out (dev)
- Deployed fix to container and restarted backend
**Result**: ✅ All SPA routes now return 200 OK with correct HTML
### 2. Fixed Frontend API Configuration ✅
**Issue**: `.env.local` was empty, frontend didn't know where API was located
**Solution**:
- Set `NEXT_PUBLIC_API_URL=http://192.168.1.179:8000` in `frontend/.env.local`
- This variable is baked into JavaScript at build time for static export
- Rebuilt frontend and redeployed to container
**Result**: ✅ Frontend can now communicate with backend API
### 3. Verified System Users Display ✅
**Status**: System users are now correctly displayed in Identities page
**Test Results**:
- GET `/api/identities/users` returns 5 system users
- root, administrator, testuser, wsdd2, nobody
- Frontend routes all return HTML (200)
- Identities page correctly loads and displays users
### 4. Implemented Samba Password Management ✅
**Features Added**:
**Backend** (`backend/services/identities.py`):
- New method: `set_samba_password(username, password)`
- Uses `smbpasswd -a -s` command
- Sends password via stdin with error handling
**API** (`backend/routers/identities.py`):
- New endpoint: `POST /api/identities/users/{username}/samba-password`
- Returns: `{"status": "updated", "username": "...", "type": "samba"}`
- Protected with JWT authentication
**Frontend** (`frontend/lib/api.ts`):
- New method: `setSambaPassword(username, password)`
**Frontend UI** (`frontend/app/identities/page.tsx`):
- New dialog for setting Samba password
- Button added to Linux users table (dimmed Key icon)
- Handler with error management
- State variables for dialog management
**Build Impact**:
- Identities page: 4.38 kB → 4.49 kB (minimal increase)
- Total bundle size unchanged
---
## Comprehensive Test Results
All systems verified working correctly:
| Test | Result | Details |
|------|--------|---------|
| Frontend serving | ✅ PASS | GET / returns HTML (200) |
| API health | ✅ PASS | `/health` returns healthy status |
| ZFS detection | ✅ PASS | `/api/status` correctly reports ZFS unavailable |
| Authentication | ✅ PASS | Login generates valid JWT token |
| System users | ✅ PASS | Returns 5 users from PAM |
| Linux password | ✅ PASS | POST `/users/{user}/password` works |
| **Samba password** | ✅ **PASS** | **POST `/users/{user}/samba-password` works** |
| SPA routing | ✅ PASS | All routes (/, /files, /identities, /login, /dashboard) return 200 |
---
## Files Modified
### Backend
- `backend/main.py` Fixed SPA catch-all route path logic
- `backend/services/identities.py` Added `set_samba_password()` method
- `backend/routers/identities.py` Added `/users/{username}/samba-password` endpoint
### Frontend
- `frontend/.env.local` Set API URL (already fixed in previous session)
- `frontend/lib/api.ts` Added `setSambaPassword()` method
- `frontend/app/identities/page.tsx` Added Samba password UI, dialog, and handlers
### Documentation
- Created `memory/samba_password_feature.md` Feature documentation
- Updated `memory/feature_system_users_display.md` Marked Samba password as complete
- Updated `memory/MEMORY.md` Added index entries
---
## How to Use Samba Password Feature
1. Navigate to **Identities → Users → Linux Users**
2. Find user in table
3. Click the dimmed **Key** icon (Samba password button)
4. Enter new Samba password
5. Click **"Set Password"**
6. Dialog closes and user list reloads
---
## Ready for Production
### Current Deployment Status
- **Test Container**: 192.168.1.179 ✅ Fully functional
- **Production Pi**: 10.66.120.3 ⏳ Ready to deploy
### Next Steps for Production
1. Build frontend with production environment variables
2. Deploy to Pi at 10.66.120.3:9090 (adjust `.env.local` accordingly)
3. Verify ZFS pool detection works (Pi has actual ZFS)
4. Test all features with real ZFS pools and snapshots
### Configuration for Production
```bash
# In frontend/.env.local:
NEXT_PUBLIC_API_URL=http://10.66.120.3:8000
# OR if using domain/HTTPS:
NEXT_PUBLIC_API_URL=https://zmb-webui.example.com
```
---
## Session Metrics
- **Features Completed**: 1 major (Samba password management)
- **Bugs Fixed**: 1 critical (SPA routing)
- **Endpoints Added**: 1 new API endpoint
- **Frontend Components Updated**: 1 page
- **Test Coverage**: All routes tested, all endpoints verified
- **Code Quality**: Type-safe TypeScript, proper error handling
---
## Key Takeaways
1. **Environment Variables**: Next.js static export requires `NEXT_PUBLIC_` variables to be set at build time and compiled into bundles
2. **SPA Routing**: Catch-all route must serve index.html from correct location (static dir in production)
3. **Samba Integration**: `smbpasswd -a -s` accepts password via stdin for automation
4. **Backend API Consistency**: New endpoints follow existing patterns (same auth, request models, response format)
---
## Verified Functionality
✅ System users display correctly
✅ PAM authentication working
✅ JWT token generation functional
✅ API endpoints protected with auth
✅ Frontend-backend communication working
✅ SPA routing functional
✅ Samba password setting implemented and tested
✅ Static export builds successfully
✅ All pages load correctly
✅ Error handling in place
---
**Ready for Next Phase**: Phase 3a Quick Wins (Snapshot Create, Snapshot Rollback, Dark Mode Toggle)