Skip to content
Multi-user server for Jupyter notebooks
Branch: master
Clone or download
betatim Merge pull request #2649 from bitnik/patch-2
close `<div class="container">` tag in home.html
Latest commit 0325be3 Jul 17, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci add build context to alpine dir Apr 26, 2018
.github Update issue templates Jun 12, 2018
ci test postgres with url-encoded username+password Apr 16, 2019
dockerfiles corrected docker network create instructions in dockerfiles README Jul 5, 2019
docs Merge pull request #2646 from ilee38/fix-typos-tech-reference Jul 16, 2019
examples cull-idle: Include a hint on how to add custom culling logic Jun 16, 2019
hooks [docker] tag stable releases with :latest Mar 28, 2019
jupyterhub Set total_users at startup Jul 10, 2019
onbuild fix onbuild build arg Apr 26, 2018
share/jupyterhub close `<div class="container">` tag in home.html Jul 17, 2019
singleuser [docker] fix unbound variable in post_push hook for stable releases Mar 28, 2019
testing Fixed docs and testing code to use refactored SimpleLocalProcessSpawner Jul 5, 2019
tools run autoformat Feb 19, 2019
.coveragerc unpin coverage Oct 19, 2018
.dockerignore add singleuser build dir from dockerspawner Aug 18, 2017
.flake8 pass flake8 on examples Feb 19, 2019
.gitignore ignore pip-wheel-metadata Mar 7, 2019
.pre-commit-config.yaml add pre-commit config Feb 19, 2019
.travis.yml pin mysql-connector-python on travis May 3, 2019 Make the release checklist a GFM checklist Nov 11, 2016 Create Jun 12, 2018 fix dev-requirements file extension in Mar 26, 2019 cleanup pass Aug 20, 2014
Dockerfile Bumped Miniconda to 4.5.11 Oct 24, 2018 include package-lock in sdists May 7, 2018 run autoformat Feb 19, 2019 Update a few links [ci skip] Jul 16, 2019
bower-lite run autoformat Feb 19, 2019
dev-requirements.txt pre-commit is a dev requirement Feb 19, 2019
package.json rev js dependencies Apr 9, 2019
pyproject.toml add black configuration Feb 19, 2019
pytest.ini disable pytest minversion check Nov 8, 2018
readthedocs.yml omit pdf builds on rtd due to bug in sphinx Sep 24, 2018
requirements.txt allow oauthlib 3 Apr 1, 2019 a couple fixups after autoformatting Feb 19, 2019 run autoformat Feb 19, 2019

Technical Overview | Installation | Configuration | Docker | Contributing | License | Help and Resources


PyPI Documentation Status Build Status Circle CI GitHub Discourse Gitter

With JupyterHub you can create a multi-user Hub which spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server.

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 computing group.

Technical overview

Three main actors make up JupyterHub:

  • multi-user Hub (tornado process)
  • configurable http proxy (node-http-proxy)
  • multiple single-user Jupyter notebook servers (Python/Jupyter/tornado)

Basic principles for operation are:

  • Hub launches 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 servers.

JupyterHub also provides a REST API for administration of the Hub and its users.


Check prerequisites

  • A Linux/Unix based system

  • Python 3.5 or greater

  • nodejs/npm

    • If you are using conda, the nodejs and npm dependencies will be installed for you by conda.

    • If you are using pip, install a recent version of nodejs/npm. For example, install it on Linux (Debian/Ubuntu) using:

      sudo apt-get install npm nodejs-legacy

      The nodejs-legacy package installs the node executable and is currently required for npm to work on Debian/Ubuntu.

  • TLS certificate and key for HTTPS communication

  • Domain name

Install packages

Using conda

To install JupyterHub along with its dependencies including nodejs/npm:

conda install -c conda-forge jupyterhub

If you plan to run notebook servers locally, install the Jupyter notebook or JupyterLab:

conda install notebook
conda install jupyterlab

Using pip

JupyterHub can be installed with pip, and the proxy with npm:

npm install -g configurable-http-proxy
python3 -m pip install jupyterhub    

If you plan to run notebook servers locally, you will need to install the Jupyter notebook package:

python3 -m pip install --upgrade notebook

Run the Hub server

To start the Hub server, run the command:


Visit https://localhost:8000 in your browser, and sign in with your unix PAM credentials.

Note: To allow multiple users to sign into the server, you will need to run the jupyterhub command as a privileged user, such as root. The wiki 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:

jupyterhub --generate-config

Start the Hub

To start the Hub on a specific url and port with https:

jupyterhub --ip --port 443 --ssl-key my_ssl.key --ssl-cert my_ssl.cert


Authenticator Description
PAMAuthenticator Default, built-in authenticator
OAuthenticator OAuth + JupyterHub Authenticator = OAuthenticator
ldapauthenticator Simple LDAP Authenticator Plugin for JupyterHub
kerberosauthenticator Kerberos Authenticator Plugin for JupyterHub


Spawner Description
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
yarnspawner Spawn single-user notebook servers distributed on a Hadoop cluster
wrapspawner WrapSpawner and ProfilesSpawner enabling runtime configuration of spawners


A starter docker image for JupyterHub gives a baseline deployment of JupyterHub using Docker.

Important: This jupyterhub/jupyterhub image contains only the Hub itself, with no configuration. In general, one needs to make a derivative image, with at least a 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 -p 8000:8000 -d --name jupyterhub jupyterhub/jupyterhub jupyterhub

This command will create a container named jupyterhub that you can stop and resume with docker stop/start.

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.

The command 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.


If you would like to contribute to the project, please read our contributor documentation and the The file explains how to set up a development installation, how to run the test suite, and how to contribute to documentation.

For a high-level view of the vision and next directions of the project, see the JupyterHub community roadmap.

A note about platform support

JupyterHub is supported on Linux/Unix based systems.

JupyterHub officially does not support Windows. You may be able to use JupyterHub on Windows if you use a Spawner and Authenticator that work on Windows, but the JupyterHub defaults will not. Bugs reported on Windows will not be accepted, and the test suite will not run on Windows. Small patches that fix minor Windows compatibility issues (such as basic installation) may be accepted, however. For Windows-based systems, we would recommend running JupyterHub in a docker container or Linux VM.

Additional Reference: Tornado's documentation on Windows platform support


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

We encourage you to ask questions on the Jupyter mailing list. To participate in development discussions or get help, talk with us on our JupyterHub Gitter channel.

JupyterHub follows the Jupyter Community Guides.

Technical Overview | Installation | Configuration | Docker | Contributing | License | Help and Resources

You can’t perform that action at this time.