Install Jupyterhub

Jupyterhub Prerequisites:

Before installing JupyterHub, you will need:

  • a Linux/Unix based system and will need over 10GB of free space

  • Python 3.4 or greater. An understanding of using pip or conda for installing Python packages is helpful.

Installation using conda:

Check if Anaconda package is already installed:

$ dpkg -l | grep conda
$ rpm -ql conda        -- if using rhel/centos

If Anaconda is not installed download the Anaconda linux installer  from

/home/myuserid/mydownloads/anaconda# wget

100%[================>] 651,745,206 3.32MB/s in 3m 13s

2018-09-18 13:26:34 (3.23 MB/s) – ‘’ saved [651745206/651745206]

Install by using following command:

$ bash 

Got a warning: WARNING: bzip2 does not appear to be installed this may cause problems below. So cancelled the install and did  $ yum install bzip2 . Started the Anaconda install again.

Welcome to Anaconda3 5.2.0

Do you accept the license terms? [yes|no]


>>> yes

Anaconda3 will now be installed into this location:

– Press ENTER to confirm the location
– Press CTRL-C to abort the installation
– Or specify a different location below

[/root/anaconda3] >>> /opt/anaconda3

installing: anaconda-5.2.0-py36_3 …

installation finished.

Do you wish the installer to prepend the Anaconda3 install location

to PATH in your /root/.bashrc ? [yes|no]


>>> yes

Appending source /opt/anaconda3/bin/activate to /root/.bashrc

Do you wish to proceed with the installation of Microsoft VSCode? [yes|no]
>>> yes

VSCode successfully installed in /usr/share/code !

[NOTE: Optional –  if you now $ export DISPLAY=x.x.x.x:0.0 and type $ code then you can see the Microsoft VScode GUI editor which is pretty nice.]

$ source ~/.bashrc

Verify the Anaconda installation version:

$ conda list

# packages in environment at /opt/anaconda3:

# Name            Version    Build      Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36he11e457_0
alabaster 0.7.10 py36h306e16b_0
anaconda 5.0.1 py36hd30a520_1
anaconda-client 1.6.5 py36h19c0dcd_0
anaconda-navigator 1.6.9 py36h11ddaaa_0
anaconda-project 0.8.0 py36h29abdf5_0

Next Install jupyterhub package:

root$:~/mydownloads/anaconda# conda install -c conda-forge jupyterhub

# conda install notebook

Test the install:

$ jupyterhub -h

$ configurable-http-proxy -h

$ jupyterhub

But got an error:

[I 2017-12-04 00:20:23.809 JupyterHub app:871] Writing cookie_secret to /opt/anaconda3/jupyterhub_cookie_secret
[I 2017-12-04 00:20:23.876 alembic.runtime.migration migration:117] Context impl SQLiteImpl.
[I 2017-12-04 00:20:23.877 alembic.runtime.migration migration:122] Will assume non-transactional DDL.
[I 2017-12-04 00:20:23.922 alembic.runtime.migration migration:327] Running stamp_revision -> 3ec6993fe20c
[W 2017-12-04 00:20:24.272 JupyterHub app:955] No admin users, admin interface will be unavailable.
[W 2017-12-04 00:20:24.272 JupyterHub app:956] Add any administrative users to `c.Authenticator.admin_users` in config.
[I 2017-12-04 00:20:24.272 JupyterHub app:983] Not using whitelist. Any authenticated user will be allowed.
[E 2017-12-04 00:20:24.328 JupyterHub app:1525] Failed to bind hub to
[E 2017-12-04 00:20:24.330 JupyterHub app:1623]
Traceback (most recent call last):
File “/opt/anaconda3/lib/python3.6/site-packages/jupyterhub/”, line 1621, in launch_instance_async
yield self.start()
File “/opt/anaconda3/lib/python3.6/site-packages/jupyterhub/”, line 1523, in start
self.http_server.listen(self.hub_port, address=self.hub_ip)
File “/opt/anaconda3/lib/python3.6/site-packages/tornado/”, line 142, in listen
sockets = bind_sockets(port, address=address)
File “/opt/anaconda3/lib/python3.6/site-packages/tornado/”, line 197, in bind_sockets
PermissionError: [Errno 13] Permission denied

Resolution: After checking with netstat -an the reason was that port 8081 was already being used on the ubuntu server by a mcafee process. So changed the port in the config file /etc/jupyterhub/ to

c.JupyterHub.hub_port = 8181

See below how to generate and update the config file. After this change jupyterhub started successfully.

[I 2018-09-18 15:47:50.346 JupyterHub app:1906] JupyterHub is now running at http://:8000

Now login using your Linux userid/password as default authentication is PAM using ip address of the server where jupyterhub is running and port as given in the log.


Open a Jupyter Notebook in Jupyterhub and type:

!which conda

This will verify if conda is installed which is required for this procedure.

Create a conda virtual environment:

Conda allows to create independent environments in our home folder, this has the advantage that the environment will be writable so we can install any other package with pip or conda install.

!conda create -n myownenv

The virtual environment will be created under Destination: /home/userid/.conda/envs/ myownenv

Create a Jupyter Notebook kernel to launch this new environment

We need to notify Jupyter of this new Python environment by creating a Kernel, from a Notebook launch:

!source activate myownenv; ipython kernel install –user –name myownenv

Launch a Notebook

Go back to the Jupyterhub dashboard, reload the page, now you should have another option in the Newmenu that says myownenv.

In order to use your new kernel with an existing notebook, click on the notebook file in the dashboard, it will launch with the default kernel, then you can change kernel from the top menu Kernel > Change kernel.

Install new packages

Inside a Notebook using the myownenv environment you can install other packages running:

!conda install newpackagename


!pip install newpackagename

This will only install packages for the current user and not affect any other user in the jupyterhub.

OPTIONAL: Remove the personal conda environment:

The following command will remove the virtual environment:

$ conda env remove -n myownenv

May also need to manually remove all the files under /home/userid/.conda/pkgs

Below blog is not yet ready and so do not use these instructions for now

Optional steps: Configuration of Jupyterhub:

We recommend storing configuration files in the standard UNIX filesystem location, i.e./etc/jupyterhub Create the configuration file:

# jupyterhub –generate-config -f /etc/jupyterhub/
Writing default config to: /etc/jupyterhub/

$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout jupyterhub.key -out jupyterhub.crt

Added these values to the file /etc/jupyterhub/ using the generated ssl certificates:

c.JupyterHub.ssl_cert = ‘/etc/jupyterhub/sslcerts/jupyterhub.crt’
c.JupyterHub.ssl_key = ‘/etc/jupyterhub/sslcerts/jupyterhub.key’
c.JupyterHub.port = 443

c.JupyterHub.hub_port = 8181

Create a user and group in linux:

$ groupadd mygrp

$ useradd -m -g mygrp -c “my user” myusr

set a password for myusr

Next start Jupyterhub server:

$ jupyterhub -f /etc/jupyterhub/

[I 2017-12-04 22:27:28.147 JupyterHub app:1581] JupyterHub is now running at https://:443/

Login using myusr and password

$ sudo mkdir /srv/jupyterhub

$cd /srv/jupyterhub

$sudo chown charlotte

$ git clone

$ cd jupyterhub-pydata-2016

conda env create -f environment.yml

source activate jupyterhub-tutorial

conda config –add channels conda-forge

pip install dockerspawner

docker pull jupyterhub/singleuser

/srv/jupyterhub$git clone

cd letsencrypt

./letsencrypt-auto certonly –standalone -d mydomain.tld

key: /etc/letsencrypt/live/mydomain.tld/privkey.pem

cert: /etc/letsencrypt/live/mydomain.tld/fullchain.pem

Need a dns domain name defined first like

/srv/jupyterhub/jupyterhub-pydata-2016$jupyterhub –generate-config

Edit the config file:

c.JupyterHub.ssl_key = ‘jupyterhub.key’

c.JupyterHub.ssl_cert = ‘jupyterhub.crt’

c.JupyterHub.port = 443

cp ./

#Configuration file for jupyterhub

c.JupyterHub.ssl_key = ‘/etc/letsencrypt/live/’

c.JupyterHub.ssl_cert = ‘/etc/letsencrypt/live/’

c.JupyterHub.port = 443

$sudo setcap cap_net_bind_service=+ep /home/charlotte/anaconda3/envs/jupyterhub-tutorial/bin/node

/etc/letsencrypt$ sudo chmod 777 -R archive/

/etc/letsencrypt$ sudo chmod 777 -R live/


Install Kernels for all users:

conda create -n py2 python=2 ipykernel

conda run -n py2 — ipython kernel install

jupyter kernelspec list


Using GitHub OAuth


github provides clientid, clientsecret and we need to provide oauth callback url

In ./env in repository:

export GITHUB_CLIENT_ID=from github

export GITHUB_CLIENT_SECRET=from github


$ cd /srv/jupyterhub

$ source ./env

python3 -m pip install oauthenticator


from oauthenticator.github import LocalGitHubOauthenticator

c. JupyterHub.authenticator_class = LocalGitHubOauthenticator

c.LocalGitHubOauthenticator.create_system_users = True

restart jupyterhub

Sign in with Github

Using DockerSpawner

python3 -m pip install dockerspawner netifaces

docker pull jupyterhub/singleuser


from oauthenticator.github import GitHubOAuthenticator

c.JupyterHub.authenticator_class = GitHubOAuthenticator

from dockerspawner import DockerSpawner

c.JupyterHub.spawner_class = DockerSpawner

Reference for deployments:


One thought on “Install Jupyterhub

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.