From 9eda62edd7b61ea693deaf7eda95da8e88d3016a Mon Sep 17 00:00:00 2001 From: stellarshenson Date: Sun, 9 Nov 2025 22:20:28 +0100 Subject: [PATCH] docs: add comprehensive documentation and update screenshots Added three new documentation files following modus primaris style: - doc/ui-template-customization.md: Guide for extending JupyterHub UI templates with RequireJS, Bootstrap 5, CSRF protection, and custom handlers - doc/docker-socket-permissions.md: Docker socket access control documentation covering group-based permissions, security implications, and best practices - doc/notifications.md: Complete notification broadcast system documentation including implementation details, API integration, error handling, and troubleshooting Updated UI screenshots in README.md: - Replaced screenshot-restart-server.png with screenshot-home.png showing complete user control panel (restart server + volume management) - Added screenshot-send-notification.png showing admin notification broadcast interface with message composer, type selector, and delivery results All documentation follows consistent structure: brief overview, key facts in bullet points, explanatory narrative, and technical specifications without excessive nesting or marketing language. --- .resources/screenshot-home.png | Bin 0 -> 43976 bytes .resources/screenshot-restart-server.png | Bin 29988 -> 0 bytes .resources/screenshot-send-notification.png | Bin 0 -> 67743 bytes README.md | 7 +- doc/docker-socket-permissions.md | 185 +++++++++++++++ doc/notifications.md | 249 ++++++++++++++++++++ doc/ui-template-customization.md | 131 ++++++++++ 7 files changed, 570 insertions(+), 2 deletions(-) create mode 100755 .resources/screenshot-home.png delete mode 100755 .resources/screenshot-restart-server.png create mode 100755 .resources/screenshot-send-notification.png create mode 100644 doc/docker-socket-permissions.md create mode 100644 doc/notifications.md create mode 100644 doc/ui-template-customization.md diff --git a/.resources/screenshot-home.png b/.resources/screenshot-home.png new file mode 100755 index 0000000000000000000000000000000000000000..bc3004fc35c46632e63a28f7d10215c9944a926b GIT binary patch literal 43976 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 PB3a|6&W+sb4_^Ks_c|D( diff --git a/.resources/screenshot-send-notification.png b/.resources/screenshot-send-notification.png new file mode 100755 index 0000000000000000000000000000000000000000..aab9feb0e427156efe961ac48dd882eba509aaf5 GIT binary patch literal 67743 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

-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 +``` + +JupyterLab server validates the token against the user's stored tokens before processing the notification. Invalid or expired tokens result in 401 Unauthorized errors logged as authentication failures. + +## Error Handling and Logging + +The broadcast system implements comprehensive error handling for various failure scenarios. Each server delivery can succeed or fail independently without affecting other deliveries. + +**Common Failure Scenarios:** +- **Connection timeout** - Server not responding, likely stopped or network issue +- **404 Not Found** - Notification extension not installed on JupyterLab server +- **401/403 Authentication** - Token validation failed, usually configuration issue +- **500 Server error** - Extension error processing notification + +Each delivery result is logged with a concise one-line entry showing username, message preview (first 50 characters), notification type, and outcome: + +``` +[I] [Notification] alice: 'Maintenance scheduled for 10 PM tonight' (warning) - SUCCESS +[W] [Notification] bob: 'System update in progress' (info) - FAILED: HTTP 404: Not Found +[E] [Notification] charlie: 'Critical security patch' (error) - ERROR: Server not responding +``` + +These logs appear in JupyterHub container logs accessible via `docker logs stellars-jupyterhub-ds-jupyterhub`. The log format enables quick scanning for delivery issues and troubleshooting failed broadcasts. + +## Extension Dependency + +The notification system requires `jupyterlab_notifications_extension` installed on all spawned JupyterLab servers. The platform does not install this extension - it must be included in the `stellars/stellars-jupyterlab-ds` Docker image or installed via user environment. + +**Extension Repository:** https://github.com/stellarshenson/jupyterlab_notifications_extension + +The extension provides a server endpoint for ingesting notifications and a frontend component for displaying them in JupyterLab. Notifications appear as toast popups in the top-right corner with persistence in a notification center panel. + +**Verifying Extension Installation:** + +Check if the extension is installed and enabled on a running JupyterLab server: +```bash +docker exec jupyterlab-konrad bash -c \ + "conda run -n base jupyter server extension list | grep notification" +``` + +Expected output: +``` +jupyterlab_notifications_extension enabled +- Validating jupyterlab_notifications_extension... + jupyterlab_notifications_extension 1.0.14 OK +``` + +Missing or disabled extensions result in 404 errors when attempting notification delivery. The broadcast results table indicates which users received notifications successfully and which failed due to missing extensions. + +## Usage Recommendations + +**Message Length:** + +The 140-character limit encourages concise, actionable messages. Longer messages get truncated or may not display properly in the JupyterLab interface. Focus on essential information and include links for details if needed. + +**Good:** "Planned maintenance tonight 10 PM - 2 AM. Save work and stop servers. Details: example.com/maint" +**Bad:** "We will be performing scheduled maintenance activities on the infrastructure tonight starting at approximately 10 PM and continuing until around 2 AM the next morning during which time you should make sure to save all your work and stop your servers to avoid any potential data loss or interruption to your research activities..." + +**Notification Type Selection:** + +Choose notification types based on message urgency and required user action: +- **info** for routine announcements (new features, documentation updates) +- **warning** for actions users should take (save work before maintenance) +- **error** for critical issues requiring immediate attention (security patches) +- **success** for confirmations (maintenance complete, system restored) + +**Auto-Close Behavior:** + +Leave auto-close unchecked for important messages requiring acknowledgment. Users must manually dismiss the notification, ensuring they see the message. Enable auto-close for low-priority informational messages that don't require explicit acknowledgment. + +**Timing Considerations:** + +Send notifications when most users are actively working for maximum visibility. Notifications sent outside working hours may be dismissed automatically or missed entirely by users who don't check notification history. + +## Troubleshooting + +**Notification panel shows "No active servers found":** + +No users currently have running JupyterLab servers. Users must have active sessions for broadcast delivery. Check admin panel user list and verify which users have running servers before broadcasting. + +**All deliveries fail with "Server not responding":** + +JupyterLab containers may not be reachable from JupyterHub container. Verify network connectivity: +```bash +docker exec stellars-jupyterhub-ds-jupyterhub ping -c 3 jupyterlab-konrad +``` + +Also check JupyterHub network configuration and ensure spawned containers join `jupyterhub_network`. + +**Deliveries fail with "Notification extension not installed":** + +The JupyterLab image lacks `jupyterlab_notifications_extension`. Update the `stellars/stellars-jupyterhub-ds` image to include the extension or install it in user environments. Rebuild and restart affected JupyterLab servers. + +**Some users receive notifications, others don't:** + +Check per-user delivery details in the expandable results table. Different failure reasons indicate different issues: +- 404 errors suggest extension not installed on specific user's image version +- Timeout errors suggest specific user's container networking issue +- 401 errors suggest token generation or validation problem for specific user + +Individual failures don't prevent successful delivery to other users. The broadcast system is fault-tolerant by design. + +**Notifications appear but wrong styling:** + +Verify notification type selection in the form. The extension maps types to colors - using "info" when intending "error" results in blue notification instead of red. Check logs for the notification type actually sent. + +## Performance Characteristics + +The broadcast system is designed for efficient delivery to large numbers of concurrent users. + +**Scalability Metrics:** +- 10 active users: ~5 second broadcast time (parallel delivery) +- 50 active users: ~5 second broadcast time (parallel delivery with concurrency) +- 100 active users: ~5-6 second broadcast time (timeout limits total duration) +- 500 active users: ~5-6 second broadcast time (asyncio.gather handles concurrency) + +Delivery time is primarily determined by the timeout setting (5 seconds) rather than user count due to concurrent request handling. Even with hundreds of users, total broadcast duration remains under 10 seconds. + +**Resource Utilization:** + +Each concurrent delivery creates a TCP connection and HTTP request. A 100-user broadcast creates 100 simultaneous connections from JupyterHub container. This is well within typical system limits but may trigger rate limiting or connection limits on restricted networks. + +The platform generates temporary API tokens for all users simultaneously. Token generation is lightweight but does query the database. Very large user counts (1000+) may benefit from batch token generation to reduce database load. + +## Future Enhancements + +Potential improvements for the notification broadcast system: + +**Selective Targeting:** +- Broadcast to specific groups instead of all users +- User selection interface for targeted notifications +- Group-based notification permissions + +**Scheduled Notifications:** +- Queue notifications for future delivery +- Recurring notifications for regular maintenance windows +- Time-zone aware scheduling for distributed teams + +**Notification History:** +- Database persistence of broadcast history +- Admin view of previously sent notifications +- User notification inbox for viewing past messages + +**Rich Content:** +- Markdown formatting support in messages +- Embedded links and action buttons +- File attachments or image previews + +These enhancements would require modifications to both the broadcast system and the JupyterLab extension. The current implementation provides a solid foundation for basic admin-to-user communication needs. diff --git a/doc/ui-template-customization.md b/doc/ui-template-customization.md new file mode 100644 index 0000000..2b03057 --- /dev/null +++ b/doc/ui-template-customization.md @@ -0,0 +1,131 @@ +# UI Template Customization + +JupyterHub's web interface can be customized by extending base templates. This platform customizes the user control panel to add self-service features like server restart and volume management directly accessible from the home page. + +**Key Implementation Details:** +- Custom templates placed in `services/jupyterhub/templates/` +- Templates extend JupyterHub's base templates using Jinja2 `{% extends "page.html" %}` +- Docker image copies templates to `/srv/jupyterhub/templates/` at build time +- JupyterHub automatically discovers custom templates in this directory +- Changes require Docker rebuild and container restart to take effect + +## Template Structure + +JupyterHub uses Jinja2 templating engine with a hierarchical template system. The base template `page.html` defines the overall page structure including navigation, headers, and content blocks. Custom templates extend this base and override specific blocks to add new functionality. + +The `home.html` template is the user control panel where users manage their JupyterLab server. This platform extends it to add custom buttons for server restart and volume management operations. The template must preserve existing JupyterHub functionality while adding new features. + +**Template Blocks Available:** +- `{% block main %}` - Main content area for page-specific content +- `{% block script %}` - JavaScript section for client-side functionality +- `{% block nav_bar_left_items %}` - Left side navigation menu items +- `{% block nav_bar_right_items %}` - Right side navigation menu items + +## JavaScript Integration + +Custom templates often need JavaScript for interactive features. JupyterHub loads jQuery and other libraries via RequireJS module system. All custom JavaScript must be wrapped in RequireJS `require()` calls to ensure proper dependency loading. + +**RequireJS Pattern:** +```javascript + +``` + +This pattern ensures jQuery is loaded before the custom code executes. Without this wrapper, custom JavaScript may fail with "$ is not defined" errors. The platform's custom handlers use this pattern for all interactive features including volume management modals and server restart buttons. + +## Bootstrap 5 Compatibility + +JupyterHub 5.4.2 uses Bootstrap 5 for UI components. Custom templates must use Bootstrap 5 syntax, not Bootstrap 4. Modal triggers use `data-bs-toggle` and `data-bs-target` attributes instead of older `data-toggle` and `data-target` attributes. + +**Bootstrap 5 Modal Example:** +```html + +``` + +The close button in modals uses `btn-close` class instead of custom HTML with `×` entity. These differences are critical - Bootstrap 4 syntax silently fails in Bootstrap 5 without error messages. + +## Font Awesome Icons + +The platform uses Font Awesome icons to enhance button visibility and user experience. Icons are added using `` tags with appropriate classes. + +**Icon Examples:** +- Server restart: `` +- Volume management: `` +- Server stop: `` +- Server start: `` + +Icons should include `aria-hidden="true"` attribute to prevent screen readers from announcing them redundantly when button text is already present. + +## Custom API Handlers + +Templates interact with custom API handlers registered in `jupyterhub_config.py`. These handlers extend JupyterHub's REST API with new endpoints for platform-specific features. + +The platform registers handlers using `c.JupyterHub.extra_handlers` configuration: +```python +c.JupyterHub.extra_handlers = [ + (r'/api/users/([^/]+)/manage-volumes', ManageVolumesHandler), + (r'/api/users/([^/]+)/restart-server', RestartServerHandler), + (r'/api/notifications/broadcast', BroadcastNotificationHandler), + (r'/notifications', NotificationsPageHandler), +] +``` + +Each handler URL pattern uses regex to extract route parameters like username. Handlers must be imported from `custom_handlers.py` module at the top of the config file. + +## CSRF Protection + +All POST requests from custom templates must include XSRF token for security. JupyterHub provides this token automatically in templates via `{{ xsrf_form_html() }}` or through cookies accessible from JavaScript. + +**AJAX Request with XSRF:** +```javascript +$.ajax({ + url: '/hub/api/users/konrad/restart-server', + method: 'POST', + headers: { + 'X-XSRFToken': getCookie('_xsrf') + }, + success: function(data) { /* handle success */ } +}); +``` + +Missing XSRF tokens result in 403 Forbidden errors. The platform's custom handlers automatically validate XSRF tokens on all POST, PUT, and DELETE requests. + +## Build Process + +Custom templates are copied into the Docker image during build. The Dockerfile includes: +```dockerfile +COPY --chmod=644 services/jupyterhub/templates/*.html /srv/jupyterhub/templates/ +``` + +Changes to templates require rebuilding the Docker image and recreating the JupyterHub container. The build process should use `--no-cache` flag to ensure template changes are not cached from previous builds. + +**Rebuild Command:** +```bash +docker compose -f compose.yml build --no-cache jupyterhub +docker stop stellars-jupyterhub-ds-jupyterhub +docker rm stellars-jupyterhub-ds-jupyterhub +docker compose up -d jupyterhub +``` + +Simple container restart with `docker restart` does not reload changed templates - the container must be recreated from the updated image. + +## Testing Custom Templates + +After deploying custom templates, verify they render correctly by accessing the relevant pages in a browser. Check browser console for JavaScript errors and network tab for failed API requests. + +**Common Issues:** +- 404 errors indicate template file not found in `/srv/jupyterhub/templates/` +- JavaScript errors about undefined $ mean RequireJS wrapper is missing +- Bootstrap modals not opening indicate Bootstrap 4 syntax instead of Bootstrap 5 +- 403 errors on POST requests indicate missing XSRF token +- Buttons without icons mean Font Awesome not loaded or wrong class names + +Template customization enables powerful extensions to JupyterHub without forking the core codebase. The platform demonstrates this with server restart, volume management, and notification broadcast features all built through template extensions.