Skip to content

Instantly share code, notes, and snippets.

@hideojoho
Last active April 18, 2021 19:52
Show Gist options
  • Save hideojoho/12b9918b50f9c039cffec458d69ee7db to your computer and use it in GitHub Desktop.
Save hideojoho/12b9918b50f9c039cffec458d69ee7db to your computer and use it in GitHub Desktop.
How to set up a JupyterHub server on Vagrant

What you will get

  • JupyterHub server for multiple users
  • Python libraries: numpy scipy pandas matplotlib (can be changed via Vagrant_provision.sh below)
  • Jupyter Notebook Extensions

Requirements

  • At least 6-8GB of RAM (of those 4GB will be used for a virtual machine)
  • About 2.5GB of diskspace
  • 1-2 hours of time (depends on your network speed)

Versions

  • MacOSX 10.11.6
  • VirtualBox 5.1.10
  • Vagrant 1.8.7

Download & Install

Install Vagrant plugins

$ vagrant plugin install vagrant-vbguest

Fix a bug in Vagrant 1.8.7

$ sudo rm /opt/vagrant/embedded/bin/curl

Add a new CentOS7 box

The following commands download a Vagrant box for CentOS 7 from their server. This takes time.

$ vagrant box add centos/7
Select 2 (VirtualBox)

Create a folder for a new Vagrant instance

$ mkdir CentOS7-JupyterHub; cd CentOS7-JupyterHub
$ vagrant init centos-VAGRANTSLASH-7
$ mv Vagrantfile Vagrantfile.orig

Download the files and save them to CentOS7-JupyterHub

Start a VM

The following command installs CentOS 7 to your virtual machine along with Python and JupyterHub. This takes time.

$ vagrant up

Start JupyterHub server

$ sudo vi /etc/ssh/ssh_config
#   SendEnv LANG LC_*
$ vagrant ssh
[vagrant@localhost ~]$ sudo jupyterhub

Access JupyterHub

http://192.168.10.33:8000/

  • Username: vagrant
  • Password: vagrant

Stop JupyterHub server

  • Ctrl+C to kill the process

Add a new user

$ vagrant ssh
[vagrant@localhost ~]$ sudo adduser new_username
[vagrant@localhost ~]$ sudo passwd new_username
[vagrant@localhost ~]$ su new_username
[new_username@localhost ~]$ cd; mkdir notebook
[new_username@localhost ~]$ jupyter contrib nbextension install --user
[new_username@localhost ~]$ exit

Start the server

[vagrant@localhost ~]$ sudo jupyterhub
# Update package
echo "Updating default packages ..."
sudo yum -y update
# Install dev tools
echo "Installing Development tools ..."
sudo yum -y groupinstall base "Development tools"
sudo yum -y install zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel
# Disable SELinux and firewall
echo "Disabling SELinux and firewall ..."
sudo setenforce 0
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
# Install Python and Jupyter notebook
echo "Installing Python and JupyterHub ..."
sudo yum -y install epel-release
sudo yum -y install nodejs npm
sudo npm install -g configurable-http-proxy
sudo yum -y install python34 python34-devel
cd
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.4 get-pip.py
# Edit the next line to change Python libraries to install
sudo pip3.4 install ipython jupyter jupyterhub jupyter_contrib_nbextensions numpy scipy pandas matplotlib
# Start Jupyter Notebook
echo "Setting up JupyterHub ..."
cd
mkdir notebook
jupyter contrib nbextension install --user
jupyterhub --generate-config
echo "c.Authenticator.admin_users = {'vagrant'}" | tee --append jupyterhub_config.py
echo "c.Authenticator.whitelist = {'vagrant'}" | tee --append jupyterhub_config.py
echo "c.Spawner.notebook_dir = '/home/{username}/notebook'" | tee --append jupyterhub_config.py
# sudo jupyterhub
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "centos-VAGRANTSLASH-7"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
config.vm.synced_folder ".", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "4096"
end
#
# View the documentation for the provider you are using for more
# information on available options.
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
config.vm.provision "shell", privileged: false, path: "Vagrant_provision.sh"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment