Public | Automated Build

Last pushed: 21 hours ago
Short Description
JupyterHub: multi-user Jupyter notebook server
Full Description

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


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

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/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.


Check prerequisites

  • Python 3.3 or greater
  • nodejs/npm Install a recent version of
    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

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

npm install -g configurable-http-proxy
pip3 install jupyterhub

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

pip3 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


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
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 -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

For a development install, clone the repository
and then install from source:

git clone
cd jupyterhub
pip3 install -r dev-requirements.txt -e .

If the pip3 install command fails and complains about lessc being
unavailable, you may need to explicitly install some additional JavaScript

npm install

This will fetch client-side JavaScript dependencies necessary to compile CSS.

You may also need to manually update JavaScript and CSS after some development
updates, with:

python3 js    # fetch updated client-side js
python3 css   # recompile CSS from LESS sources

We use pytest for running tests:

pytest jupyterhub/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

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.

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

Docker Pull Command
Source Repository

Comments (3)
10 months ago


In order to run without SSL (for testing purposes only), you'll need to set --no-ssl explicitly.

a year ago

Using Kitematic I get the same error reported few days ago:

[W 2016-05-09 17:49:22.079 JupyterHub app:757](B No admin users, admin interface will be unavailable.
[W 2016-05-09 17:49:22.102 JupyterHub app:758](B Add any administrative users to c.Authenticator.admin_users in config.
[I 2016-05-09 17:49:22.106 JupyterHub app:785](B Not using whitelist. Any authenticated user will be allowed.
[I 2016-05-09 17:49:22.203 JupyterHub app:1231](B Hub API listening on
[E 2016-05-09 17:49:22.237 JupyterHub app:963](B Refusing to run JuptyterHub without SSL. If you are terminating SSL in another layer, pass --no-ssl to tell JupyterHub to allow the proxy to listen on HTTP.

a year ago

I run the command above:
docker run -d --name jupyterhub jupyter/jupyterhub jupyterhub

however,I got errors:

[root@localhost ~]# docker logs jupyterhub
[I 2016-05-06 08:23:57.032 JupyterHub app:637] Writing cookie_secret to /srv/jupyterhub/jupyterhub_cookie_secret
[W 2016-05-06 08:23:57.105 JupyterHub app:305]
Generating CONFIGPROXY_AUTH_TOKEN. Restarting the Hub will require restarting the proxy.
Set CONFIGPROXY_AUTH_TOKEN env or JupyterHub.proxy_auth_token config to avoid this message.

[W 2016-05-06 08:23:57.113 JupyterHub app:751] No admin users, admin interface will be unavailable.
[W 2016-05-06 08:23:57.113 JupyterHub app:752] Add any administrative users to c.Authenticator.admin_users in config.
[I 2016-05-06 08:23:57.113 JupyterHub app:779] Not using whitelist. Any authenticated user will be allowed.
[I 2016-05-06 08:23:57.125 JupyterHub app:1224] Hub API listening on
[E 2016-05-06 08:23:57.130 JupyterHub app:956] Refusing to run JuptyterHub without SSL. If you are terminating SSL in another layer, pass --no-ssl to tell JupyterHub to allow the proxy to listen on HTTP.