Project Jupyter created JupyterHub to support many
users. The Hub can offer notebook servers to a class of students, a corporate
data science workgroup, a scientific research project, or a high performance
Three main actors make up JupyterHub:
- multi-user Hub (tornado process)
- configurable http proxy (node-http-proxy)
- multiple single-user Jupyter notebook servers (Python/IPython/tornado)
Basic principles for operation are:
- Hub spawns a proxy.
- Proxy forwards all requests to Hub by default.
- Hub handles login, and spawns single-user servers on demand.
- Hub configures proxy to forward url prefixes to the single-user notebook
JupyterHub also provides a
for administration of the Hub and its users.
- Python 3.3 or greater
sudo apt-get install npm nodejs-legacy
nodejs-legacypackage installs the
nodeexecutable and is currently
required for npm to work on Debian/Ubuntu.
TLS certificate and key for HTTPS communication
- Domain name
JupyterHub can be installed with
pip, and the proxy with
npm install -g configurable-http-proxy pip3 install jupyterhub
If you plan to run notebook servers locally, you will need to install the
pip3 install --upgrade notebook
Run the Hub server
To start the Hub server, run the command:
https://localhost:8000 in your browser, and sign in with your unix
Note: To allow multiple users to sign into the server, you will need to
jupyterhub command as a privileged user, such as root.
describes how to run the server as a less privileged user, which requires
more configuration of the system.
The Getting Started section of the
documentation explains the common steps in setting up JupyterHub.
The JupyterHub tutorial
provides an in-depth video and sample configurations of JupyterHub.
Create a configuration file
To generate a default config file with settings and descriptions:
Start the Hub
To start the Hub on a specific url and port
10.0.1.2:443 with https:
jupyterhub --ip 10.0.1.2 --port 443 --ssl-key my_ssl.key --ssl-cert my_ssl.cert
|PAMAuthenticator||Default, built-in authenticator|
|OAuthenticator||OAuth + JupyterHub Authenticator = OAuthenticator|
|ldapauthenticator||Simple LDAP Authenticator Plugin for JupyterHub|
|LocalProcessSpawner||Default, built-in spawner starts single-user servers as local processes|
|dockerspawner||Spawn single-user servers in Docker containers|
|kubespawner||Kubernetes spawner for JupyterHub|
|sudospawner||Spawn single-user servers without being root|
|systemdspawner||Spawn single-user notebook servers using systemd|
|batchspawner||Designed for clusters using batch scheduling software|
|wrapspawner||WrapSpawner and ProfilesSpawner enabling runtime configuration of spawners|
A starter docker image for JupyterHub
gives a baseline deployment of JupyterHub using Docker.
jupyterhub/jupyterhub image contains only the Hub itself,
with no configuration. In general, one needs to make a derivative image, with
at least a
jupyterhub_config.py setting up an Authenticator and/or a Spawner.
To run the single-user servers, which may be on the same system as the Hub or
not, Jupyter Notebook version 4 or greater must be installed.
The JupyterHub docker image can be started with the following command:
docker run -d --name jupyterhub jupyterhub/jupyterhub jupyterhub
This command will create a container named
jupyterhub that you can
stop and resume with
The Hub service will be listening on all interfaces at port 8000, which makes
this a good choice for testing JupyterHub on your desktop or laptop.
If you want to run docker on a computer that has a public IP then you should
(as in MUST) secure it with ssl by adding ssl options to your docker
configuration or by using a ssl enabled proxy.
Mounting volumes will
allow you to store data outside the docker image (host system) so it will be persistent, even when you start
a new image.
docker exec -it jupyterhub bash will spawn a root shell in your docker
container. You can use the root shell to create system users in the container.
These accounts will be used for authentication in JupyterHub's default configuration.
For a development install, clone the repository
and then install from source:
git clone https://github.com/jupyterhub/jupyterhub cd jupyterhub pip3 install -r dev-requirements.txt -e .
pip3 install command fails and complains about
python3 setup.py js # fetch updated client-side js python3 setup.py css # recompile CSS from LESS sources
We use pytest for running tests:
We use a shared copyright model that enables all contributors to maintain the
copyright on their contributions.
All code is licensed under the terms of the revised BSD license.
Help and resources
- Reporting Issues
- JupyterHub tutorial
- Documentation for JupyterHub | PDF (latest) | PDF (stable)
- Documentation for JupyterHub's REST API
- Documentation for Project Jupyter | PDF
- Project Jupyter website