JupyterHub 5 multi-user notebook server on Ubuntu 24.04 LTS by cloudimg. PAM-authenticated JupyterLab with per-VM admin password rotated at first boot. Web UI on port 80 via nginx reverse proxy with websocket upgrade for kernel comms. 24/7 expert support.
## JupyterHub 5 on Ubuntu 24.04 by cloudimg
JupyterHub 5.4.6 on Ubuntu 24.04 LTS (Noble Numbat), purpose-built for Microsoft Azure and maintained by cloudimg. JupyterHub is the de facto open-source multi-user platform for hosting Jupyter notebooks at organisations: data science teams, classrooms, research labs, and engineering groups all use it to share a single VM among many users while keeping each user's notebooks, files, and kernels isolated.
Why Choose cloudimg?
* 24/7 Expert Support with guaranteed 24-hour response and 1-hour critical-issue average. Contact support@cloudimg.co.uk
* Production-Ready from Launch — security-patched, validated, and pre-configured before publication
* Azure-Native Integration — Azure Linux Agent, cloud-init, Gen2 Hyper-V boot
* Per-VM Admin Credential Generation — `jupyter` user password rotated uniquely on first boot, written to `/etc/cloudimg-credentials.txt` (mode 0600). No two virtual machines ever share an admin password.
* Websocket-Aware Reverse Proxy — nginx is pre-configured with `proxy_http_version 1.1`, `Upgrade`/`Connection` headers, and `proxy_buffering off` so kernel comms work end-to-end without manual tuning
What is Included
* JupyterHub 5.4.6 installed into a Python 3.12 venv at `/opt/jupyterhub` (no system pip pollution)
* JupyterLab + classic Notebook UIs available; default landing is JupyterLab via `c.Spawner.default_url = '/lab'`
* configurable-http-proxy (Node.js) — JupyterHub's required routing component
* PAMAuthenticator using Linux system users — log in with the `jupyter` user and the per-VM password
* nginx reverse proxy on port 80 → 127.0.0.1:8000 with websocket Upgrade for kernel channels
* jupyterhub-5-firstboot.service systemd one-shot rotating the `jupyter` password and writing credentials
* jupyterhub.service systemd unit auto-starting on boot
* Ubuntu 24.04 LTS base with latest security patches at build time
* Azure Linux Agent for SSH key injection and seamless cloud integration
Use Cases
* Single-VM multi-user JupyterLab for small data-science teams
* Educational notebook server (classroom labs, training, workshops)
* Engineering shared analysis environment with persistent kernels and files
* Research-lab compute server for data scientists who don't want a Kubernetes deployment
* Replacement for shared SaaS notebook services where data residency matters
Technical Specifications
* Operating System: Ubuntu 24.04 LTS (Noble Numbat)
* JupyterHub Version: 5.4.6
* Python Runtime: Python 3.12 (system) + venv at /opt/jupyterhub
* Authenticator: PAMAuthenticator (Linux system users)
* Default User: azureuser (sudo, OS); jupyter (JupyterHub admin)
* Web UI Port: 80 (nginx) → 8000 (JupyterHub)
* Service Management: systemd (jupyterhub.service, jupyterhub-5-firstboot.service)
* Recommended Size: Standard_B2s for development; Standard_D4s_v3 or larger for multiple concurrent users
* VM Generation: Hyper-V Gen2 with UEFI boot
Notes on Hardening for Multi-User Production
The default PAMAuthenticator authorises only the `jupyter` user. To add more users, create them as Linux system users (`useradd -m -s /bin/bash
Support
cloudimg provides 24/7/365 expert technical support. Contact support@cloudimg.co.uk or visit www.cloudimg.co.uk.