Konfiguration#

JupyterHub-Konfiguration#

Konfigurationsdatei erstellen:

$  pipenv run jupyterhub --generate-config
Writing default config to: jupyterhub_config.py

System-Service für JupyterHub#

  1. Ermitteln des Python Virtual Environment:

    $ cd ~/jupyter-tutorial
    $ pipenv --venv
    /srv/jupyter/.local/share/virtualenvs/jupyter-tutorial-aFv4x91W
    
  2. Konfigurieren des absoluten Pfades zu jupyterhub-singleuser in der jupyterhub_config.py-Datei:

    c.Spawner.cmd = [
        "/srv/jupyter/.local/share/virtualenvs/jupyter-tutorial-aFv4x91/bin/jupyterhub-singleuser"
    ]
    
  3. Hinzufügen einer neuen systemd-Unit-Datei /etc/systemd/system/jupyterhub.service mit dem Befehl $ sudo systemctl edit --force --full jupyterhub.service

    Fügt eure entsprechende Python-Umgebung ein.

    [Unit]
    Description=Jupyterhub
    
    [Service]
    User=root
    Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/srv/jupyter/.local/share/virtualenvs/jupyterhub-aFv4x91W/bin"
    ExecStart=/srv/jupyter/.local/share/virtualenvs/jupyterhub-aFv4x91W/bin/jupyterhub -f /srv/jupyter/jupyterhub_env/jupyterhub_config.py
    
    [Install]
    WantedBy=multi-user.target
    
  4. Laden der Konfiguration mit sudo systemctl daemon-reload.

  5. Der JupyterHub lässt sich verwalten mit sudo systemctl START|STOP|STATUS jupyterhub

  6. Um sicherzustellen, dass der Dienst auch bei einem Systemstart mitgeladen wird, wird folgendes aufgerufen:

    $ sudo systemctl enable jupyterhub.service
    Created symlink /etc/systemd/system/multi-user.target.wants/jupyterhub.service → /etc/systemd/system/jupyterhub.service.
    
  7. Um den jupyterhub-singleuser-Spawner nutzen und einen eigenen Server starten zu können, müssen die ix-User in der Gruppe jupyter eingetragen werden, z.B. mit usermod -aG jupyter VEIT.

TLS-Verschlüsselung#

Da JupyterHub eine Authentifizierung beinhaltet und die Ausführung von beliebigem Code erlaubt, sollte es nicht ohne SSL (HTTPS) ausgeführt werden. Dazu muss ein offizielles, vertrauenswürdiges SSL-Zertifikat erstellt werden. Nachdem ihr einen Schlüssel und ein Zertifikat erhalten und installiert habt, konfiguriert ihr jedoch nicht das JupyterHub selbst sondern den vorgeschalteten Apache Webserver.

  1. Hierfür werden zunächst die Zusatzmodule aktiviert mit

    # a2enmod ssl rewrite proxy proxy_http proxy_wstunnel
    
  2. Anschließend kann der VirtualHost in /etc/apache2/sites-available/jupyter.cusy.io.conf konfiguriert werden mit

    # redirect HTTP to HTTPS
    <VirtualHost 172.31.50.170:80>
        ServerName jupyter.cusy.io
        ServerAdmin webmaster@cusy.io
    
        ErrorLog ${APACHE_LOG_DIR}/jupyter.cusy.io_error.log
        CustomLog ${APACHE_LOG_DIR}/jupyter.cusy.io_access.log combined
    
        Redirect / https://jupyter.cusy.io/
    </VirtualHost>
    
    <VirtualHost 172.31.50.170:443>
      ServerName jupyter.cusy.io
      ServerAdmin webmaster@cusy.io
    
      # configure SSL
      SSLEngine On
      SSLCertificateFile /etc/ssl/certs/jupyter.cusy.io_cert.pem
      SSLCertificateKeyFile /etc/ssl/private/jupyter.cusy.io_sec_key.pem
      # for an up-to-date SSL configuration see e.g.
      # https://ssl-config.mozilla.org/
    
      # Use RewriteEngine to handle websocket connection upgrades
      RewriteEngine On
      RewriteCond %{HTTP:Connection} Upgrade [NC]
      RewriteCond %{HTTP:Upgrade} websocket [NC]
      RewriteRule /(.*) ws://127.0.0.1:8000/$1 [P,L]
    
      <Location "/">
        # preserve Host header to avoid cross-origin problems
        ProxyPreserveHost on
        # proxy to JupyterHub
        ProxyPass         http://127.0.0.1:8000/
        ProxyPassReverse  http://127.0.0.1:8000/
      </Location>
    
      ErrorLog ${APACHE_LOG_DIR}/jupyter.cusy.io_error.log
      CustomLog ${APACHE_LOG_DIR}/jupyter.cusy.io_access.log combined
    </VirtualHost>
    
  3. Dieser VirtualHost wird aktiviert mit # a2ensite JUPYTER.CUSY.IO.conf.

  4. Schließlich könnt ihr den Status des Apache-Webserver überprüfen mit

    # systemctl status apache2
    ● apache2.service - The Apache HTTP Server
       Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
       Active: active (running) (Result: exit-code) since Mon 2019-03-25 16:50:26 CET; 1 day 22h ago
      Process: 31773 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
     Main PID: 20273 (apache2)
        Tasks: 55 (limit: 4915)
       CGroup: /system.slice/apache2.service
               ├─20273 /usr/sbin/apache2 -k start
               ├─31779 /usr/sbin/apache2 -k start
               └─31780 /usr/sbin/apache2 -k start
    
    Mar 27 06:25:01 jupyter.cusy.io systemd[1]: Reloaded The Apache HTTP Server.
    

Proxy authentication token#

Der Hub authentifiziert seine Anforderungen an den Proxy unter Verwendung eines geheimen Tokens, auf das sich der Hub und der Proxy einigen. Üblicherweise muss der Proxy authentication token nicht festgelegt werden, da der Hub selbst einen zufälligen Schlüssel generiert. Dies bedeutet, dass der Proxy jedes Mal neu gestartet werden muss sofern der Proxy nicht ein Unterprozess des Hubs ist.

  1. Alternativ kann Der Wert z.B. generiert werden mit

    $ openssl rand -hex 32
    
  2. Anschließend kann er in der Konfigurationsdatei eingetragen werde, z.B. mit

    c.JupyterHub.proxy_auth_token = (
        "18a0335b7c2e7edeaf7466894a32bea8d1c3cff4b07860298dbe353ecb179fc6"
    )