diff --git a/.claude/JOURNAL.md b/.claude/JOURNAL.md index b04e79b..09ac6a3 100644 --- a/.claude/JOURNAL.md +++ b/.claude/JOURNAL.md @@ -21,3 +21,6 @@ This journal tracks substantive work on documents, diagrams, and documentation c 6. **Task - Enhance and fix self-service features**: Evolved volume management from single home volume to multi-volume selection, fixed Bootstrap 5 compatibility, added visual enhancements
**Result**: Transformed ResetHomeVolumeHandler into ManageVolumesHandler supporting selective reset of home/workspace/cache volumes via checkboxes in UI, fixed template inheritance to properly extend JupyterHub's default home.html (resolving 404 errors), updated to Bootstrap 5 modal API (data-bs-toggle, data-bs-target, btn-close), wrapped JavaScript in RequireJS callback for proper module loading, added Font Awesome icons (fa-rotate for restart, fa-database for volumes), implemented automatic page refresh after Stop Server/Manage Volumes/Restart Server actions, updated API endpoint to `/api/users/{username}/manage-volumes` accepting JSON body with volume array, backend now processes multiple volumes and returns detailed success/failure response, bumped version to 3.0.12 reflecting major feature enhancement + +7. **Task - Document self-service features in README**: Updated README with features section and screenshots demonstrating new self-service capabilities
+ **Result**: Added comprehensive Features section with bullet points covering GPU auto-detection, user self-service, isolated environments, native authentication, shared storage, and production-ready setup, created Self-Service Volume Management subsection with three screenshots (restart server button, manage volumes button, volume selection modal) and one-sentence descriptions for each, positioned visual documentation prominently after feature list to demonstrate user-facing functionality diff --git a/.resources/screenshot-restart-server.png b/.resources/screenshot-restart-server.png new file mode 100755 index 0000000..94e73c8 Binary files /dev/null and b/.resources/screenshot-restart-server.png differ diff --git a/.resources/screenshot-volumes-modal.png b/.resources/screenshot-volumes-modal.png new file mode 100755 index 0000000..b69a116 Binary files /dev/null and b/.resources/screenshot-volumes-modal.png differ diff --git a/.resources/screenshot-volumes.png b/.resources/screenshot-volumes.png new file mode 100755 index 0000000..b6fb9e8 Binary files /dev/null and b/.resources/screenshot-volumes.png differ diff --git a/README.md b/README.md index a571dae..0bd945b 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,28 @@ By default system is capable of **automatically detecting** NVIDIA CUDA-supporte This deployment provides access to a centralized JupyterHub instance for managing user sessions. Optional integrations such as TensorBoard, MLFlow, or Optuna can be added manually via service extensions. +## Features + +- **GPU Auto-Detection**: Automatic NVIDIA CUDA GPU detection and configuration for spawned user containers +- **User Self-Service**: Users can restart their JupyterLab containers and selectively reset persistent volumes (home/workspace/cache) without admin intervention +- **Isolated Environments**: Each user gets dedicated JupyterLab container with persistent volumes via DockerSpawner +- **Native Authentication**: Built-in user management with NativeAuthenticator supporting self-registration and admin approval +- **Shared Storage**: Optional CIFS/NAS mount support for shared datasets across all users +- **Production Ready**: Traefik reverse proxy with TLS termination, automatic container updates via Watchtower + +### Self-Service Volume Management + +Users can restart their server or selectively reset volumes when the server is stopped: + +![Restart Server](.resources/screenshot-restart-server.png) +*Restart running JupyterLab container directly from the user control panel* + +![Manage Volumes](.resources/screenshot-volumes.png) +*Access volume management when server is stopped* + +![Volume Selection](.resources/screenshot-volumes-modal.png) +*Select individual volumes to reset - home directory, workspace files, or cache data* + ## References This project spawns user environments using docker image: `stellars/stellars-jupyterlab-ds` diff --git a/project.env b/project.env index dcb6da8..d647603 100644 --- a/project.env +++ b/project.env @@ -3,7 +3,7 @@ PROJECT_NAME="stellars-jupyterhub-ds" PROJECT_DESCRIPTION="Multi-user JupyterHub 4 deployment platform with data science stack, GPU auto-detection, NativeAuthenticator, and isolated per-user environments spawned via DockerSpawner" # Version -VERSION="3.0.12_cuda-12.9.1_jh-5.4.2" +VERSION="3.0.14_cuda-12.9.1_jh-5.4.2" VERSION_COMMENT="Multi-user JupyterHub with GPU auto-detection, self-service volume management (home/workspace/cache), and container restart capabilities" # Author diff --git a/services/jupyterhub/templates/home.html b/services/jupyterhub/templates/home.html index bb505ac..9f8639f 100644 --- a/services/jupyterhub/templates/home.html +++ b/services/jupyterhub/templates/home.html @@ -379,11 +379,12 @@ // Monitor for when button changes state (becomes start button) const checkInterval = setInterval(function() { if ($('#stop').length === 0 && $('#start').length > 0) { - console.log('[Stop Server] Server stopped, refreshing page...'); + console.log('[Stop Server] Server stopped, waiting before refresh...'); clearInterval(checkInterval); setTimeout(function() { + console.log('[Stop Server] Refreshing page now'); location.reload(); - }, 1000); + }, 3000); // Wait 3 seconds after stop completes before refreshing } }, 500);