Some time ago, I’ve written about setting up IPython as a public service. Today, I’ll write about setting up Jupyter, IPython descendant, that beside Python supports tons of other languages and frameworks.
Jupyter notebook will be running in separate user, so your personal files are safe, but not as system service. Therefore, you will need to restart it upon system reboot. I recommend running it in SCREEN session, so you can easily login into the server and check the Jupyter state.
- Install & setup Jupyter
- Add kernels
- Python
- BASH kernel
- Perl
- IRkernel
- Haskell
# sudo apt-get install build-essential python-dev sudo pip install jupyter # create new user sudo adduser jupyter # login as new user su jupyter # make sure to add `unset XDG_RUNTIME_DIR` to ~/.bashrc # otherwise you'll encounter: OSError: [Errno 13] Permission denied: '/run/user/1003/jupyter' echo 'unset XDG_RUNTIME_DIR' >> ~/.bashrc source ~/.bashrc # generate ssl certificates mkdir ~/.ssl openssl req -x509 -nodes -days 999 -newkey rsa:1024 -keyout ~/.ssl/mykey.key -out ~/.ssl/mycert.pem # generate config jupyter notebook --generate-config # generate pass and checksum ipython -c "from IPython.lib import passwd; passwd()" # enter your password twice, save it and copy password hash ## Out[1]: 'sha1:[your hashed password here]' # add to ~/.jupyter/jupyter_notebook_config.py c.NotebookApp.ip = '*' c.NotebookApp.open_browser = False c.NotebookApp.port = 8881 c.NotebookApp.password = u'sha1:[your hashed password here]' c.NotebookApp.certfile = u'/home/jupyter/.ssl/mycert.pem' c.NotebookApp.keyfile = u'/home/jupyter/.ssl/mykey.key' # create some directory for notebook files ie. ~/Public/jupyter mkdir -p ~/Public/jupyter && cd ~/Public/jupyter # start notebook server jupyter notebook
You can add multiple kernels to Jupyter. Here I’ll cover installation of some:
sudo pip install ipykernel # if you wish to use matplotlib, make sure to add to # ~/.ipython/profile_default/ipython_kernel_config.py c.InteractiveShellApp.matplotlib = 'inline'
sudo pip install bash_kernel sudo python -m bash_kernel.install
This didn’t worked for me:/
sudo cpan Devel::IPerl
Follow this tutorial.
sudo apt-get install cabal-install git clone http://www.github.com/gibiansky/IHaskell cd IHaskell ./ubuntu-install.sh
Then, just navigate to https://YOURDOMAIN.COM:8881/, accept self-signed certificate and enjoy!
Alternatively, you can obtain certificate from Let’s encrypt.
Using existing domain encryption aka Apache proxy
If your domain is already HTTPS, you may consider setting up Jupyter on localhost and redirect all incoming traffic (already encrypted) to particular port on localhost (as suggested by @shebang).
# enable Apache mods sudo a2enmod proxy proxy_http proxy_wstunnel && sudo service apache2 restart # add to your Apache config <Location "/jupyter" > ProxyPass http://localhost:8881/jupyter ProxyPassReverse http://localhost:8881/jupyter </Location> <Location "/jupyter/api/kernels/" > ProxyPass ws://localhost:8881/jupyter/api/kernels/ ProxyPassReverse ws://localhost:8881/jupyter/api/kernels/ </Location> <Location "/jupyter/api/kernels/"> ProxyPass ws://localhost:8881/jupyter/api/kernels/ ProxyPassReverse ws://localhost:8881/jupyter/api/kernels/ </Location> # update you Jupyter config (~/.jupyter/jupyter_notebook_config.py) c.NotebookApp.ip = 'localhost' c.NotebookApp.open_browser = False c.NotebookApp.port = 8881 c.NotebookApp.base_url = '/jupyter' c.NotebookApp.password = u'sha1:[your hashed password here]' c.NotebookApp.allow_origin = '*'
Note, it’s crucial to add Apache proxy for kernels (/jupyter/api/kernels/
), otherwise you won’t be able to use terminals due to failed: Error during WebSocket handshake: Unexpected response code: 400
error.