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:
@@ -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)
|
||||
Reference in New Issue
Block a user