JupyterHub is a powerful, multi-user server that allows many users to access single-server Jupyter Notebook instances. This makes it an ideal solution for teaching, collaborative data science, and providing controlled environments for computational tasks. This guide will walk you through the installation and basic configuration of JupyterHub, focusing on a standalone installation for a single server.
Understanding JupyterHub
JupyterHub is designed to manage multiple Jupyter Notebook servers, each running as a separate process. It acts as a proxy, forwarding requests from web clients to the appropriate Notebook server. Its architecture is modular, allowing for various authentication methods and customizable user interfaces.

Key Components of JupyterHub
- Proxy: This is the front-end that users interact with. It handles incoming HTTP requests, authenticates users, and forwards requests to the appropriate single-user Notebook server. The default proxy is configurable and can be replaced with more robust options like Traefik or HAProxy for production environments.
- Hub: This is the core of JupyterHub. It manages the lifecycle of single-user Notebook servers, starting and stopping them as needed. It also handles user spawning, authentication, and registration of Notebook servers.
- Single-user Notebook Servers: These are standard Jupyter Notebook servers that are spawned and managed by the Hub for each individual user. They run the user’s chosen Python kernel or other supported kernels.
- Authenticator: This component handles user authentication. JupyterHub supports various authenticators, including PAM (Pluggable Authentication Modules), GitHub, LDAP, OAuth, and custom authenticators.
- Spawners: This component is responsible for creating and managing the single-user Notebook servers for each user. Common spawners include the LocalProcessSpawner (for running servers as local user processes), DockerSpawner (for running servers in Docker containers), and KubernetesSpawner (for managing servers on a Kubernetes cluster).
Choosing an Installation Method
For a simple, single-server deployment, installing JupyterHub using Python’s package manager, pip, is the most straightforward approach. This method is excellent for testing, educational purposes, or small-scale deployments. For larger or more complex environments, you might consider containerized deployments using Docker or Kubernetes, which offer greater scalability and isolation. This guide will focus on the pip-based installation.
Prerequisites for Installation
Before you begin installing JupyterHub, ensure you have the following in place:
Python Environment
JupyterHub is a Python application. It’s highly recommended to use a virtual environment to manage dependencies and avoid conflicts with other Python packages installed on your system.
- Install Python: If you don’t have Python installed, download the latest stable version from python.org. It’s advisable to have Python 3.6 or later.
- Create a Virtual Environment:
- Open your terminal or command prompt.
- Navigate to the directory where you want to install JupyterHub.
- Create a virtual environment using
venv(built into Python 3.3+):
bash
python -m venv jupyterhub-env
Replacejupyterhub-envwith your desired environment name. - Activate the virtual environment:
- On Linux/macOS:
bash
source jupyterhub-env/bin/activate
- On Windows:
bash
jupyterhub-envScriptsactivate
You will see the name of your virtual environment in parentheses at the beginning of your command prompt, indicating that it’s active.
- On Linux/macOS:
System Requirements
JupyterHub itself has minimal system requirements, but the actual performance will depend on the number of concurrent users and the computational intensity of their workloads.
- Operating System: Linux, macOS, or Windows. Linux is generally preferred for server deployments due to its robustness and flexibility.
- Disk Space: A few gigabytes are usually sufficient for the installation and basic usage. This can increase significantly depending on the data your users will be working with.
- RAM: At least 2GB of RAM is recommended for a small installation. For more users and heavier workloads, you’ll need considerably more.
- Network Access: Users will need to access the JupyterHub server via a web browser, so ensure network connectivity is properly configured.
Installing JupyterHub
With your Python environment set up and activated, you can proceed with installing JupyterHub and its dependencies.
Installing JupyterHub via pip
The primary method for installing JupyterHub is using pip, Python’s package installer.
-
Install JupyterHub:
Ensure your virtual environment is activated. Then, run the following command:pip install jupyterhubThis command will download and install JupyterHub along with its essential dependencies, including
jupyter_serverandnotebook. -
Install a Spawner (Optional but Recommended):
By default, JupyterHub usesLocalProcessSpawner, which runs each user’s Notebook server as a separate process on the same machine. For more advanced scenarios, you might want to install specific spawners:- For Docker:
bash
pip install dockerspawner
This enables spawning Notebook servers within Docker containers, providing excellent isolation. - For Kubernetes:
bash
pip install kubespawner
This allows JupyterHub to manage Notebook servers on a Kubernetes cluster.
- For Docker:
-
Install an Authenticator (Optional but Recommended):
While JupyterHub has a basic authenticator, you’ll likely want to use a more robust one for managing users.- For PAM (Pluggable Authentication Modules): This is useful if you want to use the system’s user accounts.
bash
pip install jupyterhub-pamauthenticator
- For GitHub OAuth:
bash
pip install jupyterhub-oauth
This allows users to log in with their GitHub accounts.
- For PAM (Pluggable Authentication Modules): This is useful if you want to use the system’s user accounts.
Verifying the Installation
After the installation completes, you can verify that JupyterHub has been installed correctly.
-
Check the version:
jupyterhub --versionThis command should output the installed version of JupyterHub.
-
Generate the default configuration file:
JupyterHub uses a configuration file (typicallyjupyterhub_config.py) to control its behavior. You can generate a default one to start with:
bash
jupyterhub --generate-config
This will create ajupyterhub_config.pyfile in your current directory.
Basic Configuration of JupyterHub
The jupyterhub_config.py file is where you’ll customize JupyterHub’s behavior, from authentication to user spawning.
Default Configuration File
The jupyterhub_config.py file generated by jupyterhub --generate-config contains many commented-out options. You can uncomment and modify these to configure JupyterHub.
Essential Configuration Options
Let’s explore some of the most common and important configuration settings.
Authentication
You need to tell JupyterHub how users will log in.
-
Using PAM Authenticator: If you installed
jupyterhub-pamauthenticatorand want to use system users:# jupyterhub_config.py c.JupyterHub.authenticator_class = 'jupyterhub_pam.PAMAuthenticator'This assumes you have users set up on your system that you want to grant access to JupyterHub.
-
Using Dummy Authenticator (for testing only): This is useful for initial testing as it allows any username and password. Do not use this in production.
python
# jupyterhub_config.py
c.JupyterHub.authenticator_class = 'jupyterhub.auth.DummyAuthenticator'

User Spawning
This defines how user Notebook servers are created.
-
Local Process Spawner (Default): If you didn’t install any other spawner, JupyterHub will use this. You can explicitly set it:
# jupyterhub_config.py c.JupyterHub.spawner_class = 'jupyterhub.spawner.LocalProcessSpawner' -
Docker Spawner: If you installed
dockerspawner:
python
# jupyterhub_config.py
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
# You will also need to configure the Docker image to use
c.DockerSpawner.image = 'jupyter/datascience-notebook:latest' # Example image
c.DockerSpawner.network_name = 'jupyterhub-network' # Create this Docker network beforehand
When usingDockerSpawner, you’ll need to ensure Docker is installed and running on your server. You might also need to create a dedicated Docker network for JupyterHub.
Network and Port
By default, JupyterHub runs on port 8000. You can change this.
- Change the port:
python
# jupyterhub_config.py
c.JupyterHub.port = 8080 # Example: run on port 8080
Admin Users
You can specify users who will have administrative privileges on JupyterHub.
- Grant admin rights to specific users:
python
# jupyterhub_config.py
c.Authenticator.admin_users = {'alice', 'bob'} # Replace with actual usernames
Other Useful Configurations
-
Allow untrusted SSL certificates (for testing HTTPS):
# jupyterhub_config.py c.JupyterHub.ssl_verify = FalseWarning: Only use this for testing or if you fully understand the security implications.
-
Configuring a custom landing page:
python
# jupyterhub_config.py
c.JupyterHub.landing_page = '/tree' # Redirect to the notebook list page
Running JupyterHub
Once you have configured JupyterHub according to your needs, you can start the server.
Starting the JupyterHub Server
-
Activate your virtual environment if it’s not already active.
-
Navigate to the directory where your
jupyterhub_config.pyfile is located (or run from any directory if you’ve specified the config file path). -
Start JupyterHub:
jupyterhub -f jupyterhub_config.pyThe
-fflag specifies the configuration file to use. If yourjupyterhub_config.pyis in the current directory, you might be able to omit-f jupyterhub_config.py. -
Access JupyterHub:
Open your web browser and navigate tohttp://your_server_ip:8000(or the port you configured). You should see the JupyterHub login page.
Stopping the JupyterHub Server
To stop the JupyterHub server, go to the terminal where it’s running and press Ctrl+C.
Advanced Configurations and Next Steps
This guide covers the basics of installing and configuring a standalone JupyterHub. For production environments, there are many more advanced configurations to consider.
HTTPS/SSL Configuration
For any production deployment, securing your JupyterHub instance with HTTPS is crucial. This involves obtaining an SSL certificate (e.g., from Let’s Encrypt) and configuring JupyterHub to use it.
- Obtain SSL Certificates: Use tools like Certbot to get certificates for your domain.
- Configure in
jupyterhub_config.py:
python
# jupyterhub_config.py
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/your_domain/privkey.pem' # Path to your private key
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/your_domain/fullchain.pem' # Path to your certificate chain
Using a More Robust Proxy
For high availability and performance, consider replacing the default JupyterHub proxy with solutions like:
- Traefik: A modern HTTP reverse proxy that makes deploying microservices easy.
- HAProxy: A widely used, high-performance TCP/HTTP load balancer.
These proxies can handle SSL termination, load balancing, and routing more effectively.
Scaling JupyterHub
For larger deployments, you might need to:
- Distribute JupyterHub: Run the Hub and proxy on separate machines.
- Use Kubernetes: The
kubespawnerallows JupyterHub to manage Notebook servers as pods on a Kubernetes cluster, offering excellent scalability and resource management. - Configure limits: Set resource limits (CPU, memory) for user Notebook servers to prevent single users from consuming all server resources.
Customizing the User Interface
JupyterHub’s user interface can be customized using templates and by developing custom components. This allows you to brand the login page, add custom links, or modify the user dashboard.

User Management
For robust user management beyond simple local users or GitHub, consider integrating with:
- LDAP/Active Directory: Using an LDAP authenticator.
- OAuth Providers: For integration with other identity management systems.
By following these steps, you can successfully install and configure JupyterHub, providing a powerful and centralized environment for your users to engage in data science, research, and collaborative computing. Remember to tailor the configuration to your specific needs and security requirements.
