diff --git a/RELEASE.md b/RELEASE.md index 21d6436..cb9ef71 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,53 +1,94 @@ -# Release v3.0.14 +# Release v3.2.11 ## Major Features -**User Self-Service Capabilities** -- **Restart Server**: Users can restart their running JupyterLab containers directly from the control panel without admin intervention -- **Manage Volumes**: Selective reset of persistent volumes (home/workspace/cache) when server is stopped - users choose which volumes to reset via checkbox interface +**Configuration-Agnostic Volume Management** +- Volume list dynamically generated from `DOCKER_SPAWNER_VOLUMES` configuration +- Optional `VOLUME_DESCRIPTIONS` dict for user-friendly volume descriptions +- UI automatically adapts if volumes renamed, added, or removed in config +- Template uses Jinja2 loop with conditional description display +- Handler validates against `USER_VOLUME_SUFFIXES` from config + +**Admin Notification Broadcast** +- Broadcast notifications to all active JupyterLab servers via `/hub/notifications` +- Six notification types: default, info, success, warning, error, in-progress +- 140-character message limit with live counter +- Concurrent delivery using `asyncio.gather()` with 5-second timeout per server +- Temporary API tokens (5-minute expiry) for authentication +- Requires `jupyterlab_notifications_extension` on spawned servers + +**Privileged User Access Control** +- Group-based docker.sock access via `docker-privileged` built-in group +- Pre-spawn hook conditionally mounts `/var/run/docker.sock` based on group membership +- Built-in group protection (auto-recreates if deleted) +- Managed through JupyterHub admin panel at `/hub/admin` ## Technical Improvements -**Frontend** -- Bootstrap 5 modal compatibility (data-bs-toggle, data-bs-target, btn-close) -- RequireJS module loading for proper JavaScript execution -- Font Awesome icons (fa-rotate for restart, fa-database for volumes) -- Proper template inheritance extending JupyterHub's default home.html +**Configuration** +- `jupyterhub_config.py` protected from import errors with `if c is not None:` guards +- `DOCKER_SPAWNER_VOLUMES` defined as module-level constant (importable by handlers) +- `get_user_volume_suffixes()` extracts volume suffixes from config +- `USER_VOLUME_SUFFIXES` calculated and exposed to templates -**Backend** -- New API endpoint: `/api/users/{username}/manage-volumes` accepting JSON body with volume array -- ManageVolumesHandler processes multiple volumes with detailed success/failure response -- Manual permission checking (admin or self) for API handlers -- Comprehensive logging for all operations (frontend console + backend logs) +**Handlers** +- `ManageVolumesHandler` validates against configured volumes (not hardcoded) +- `BroadcastNotificationHandler` sends to `/jupyterlab-notifications-extension/ingest` +- `NotificationsPageHandler` renders broadcast form +- One-line logging per server: username, message preview, type, outcome -**Infrastructure** -- Version management system with project.env and auto-increment on build -- Makefile enhancements: increment_version, tag, stop, logs targets -- Docker API integration via /var/run/docker.sock for volume and container management +**Templates** +- Dynamic volume checkbox generation from `user_volume_suffixes` +- Conditional description display from `volume_descriptions` +- Bootstrap 5 modal syntax throughout +- RequireJS wrapped JavaScript with CSRF protection ## Documentation -- README updated with Features section and visual screenshots -- CLAUDE.md created with architecture overview and configuration patterns -- FEATURE_PLAN.md documenting implementation strategy -- Journal tracking all substantive work +**Modus Primaris Style** +- README reorganized: features first, screenshots, then architecture +- Simplified notification description (verbose → concise) +- Simplified architecture diagram labels +- Features as bullet points at top + +**New Documentation** +- `doc/notifications.md` (35 lines) - notification system implementation +- `doc/ui-template-customization.md` (58 lines) - template extension patterns +- `doc/docker-socket-permissions.md` (66 lines) - socket access control + +**Screenshots** +- `screenshot-home.png` - user control panel with restart and volume management +- `screenshot-send-notification.png` - admin notification broadcast interface +- `screenshot-volumes.png` - volume management modal +- `screenshot-volumes-modal.png` - volume selection checkboxes ## Version History -- **v3.0.14**: Documentation updates, 3-second stop delay -- **v3.0.12**: Multi-volume management, Bootstrap 5 fixes, icons -- **v2.11**: Previous stable release +- **v3.2.11**: Configuration-agnostic volume management, optional descriptions +- **v3.2.0**: Admin notification broadcast system +- **v3.1.2**: Privileged user docker.sock access control +- **v3.0.23**: Production readiness, CI/CD, architecture cleanup +- **v3.0.14**: User self-service capabilities (restart, volume management) ## Upgrade Notes -No breaking changes. Existing deployments will seamlessly adopt new self-service features upon container restart. +No breaking changes. Configuration backward compatible. -Users will see new buttons on the JupyterHub control panel: -- "Restart Server" (when server is running) -- "Manage Volumes" (when server is stopped) +**Optional**: Add `VOLUME_DESCRIPTIONS` dict to `jupyterhub_config.py` for user-friendly volume descriptions in UI: +```python +VOLUME_DESCRIPTIONS = { + 'home': 'User home directory files, configurations', + 'workspace': 'Project files, notebooks, code', + 'cache': 'Temporary files, pip cache, conda cache' +} +``` + +**Optional**: Install `jupyterlab_notifications_extension` on spawned servers to enable admin notification broadcast. + +Existing deployments adopt new features upon container rebuild and restart. --- -**From**: v2.11-cuda-12.9.1 -**To**: v3.0.14_cuda-12.9.1_jh-5.4.2 -**Date**: 2025-11-04 +**From**: v3.0.14_cuda-12.9.1_jh-5.4.2 +**To**: v3.2.11_cuda-12.9.1_jh-5.4.2 +**Date**: 2025-11-09