[PYTHON] Erstellen Sie eine Datenanalyseumgebung, die die GitHub-Authentifizierung und Django mit JupyterHub verbindet

Einführung

JupyterHub ist ein Mechanismus zum Betreiben von Python usw. in einem WEB-Browser namens Jupyter Notebook. Es ist ein Mechanismus, um es verfügbar zu machen, aber da es keine Informationen gab, die fragmentiert, sondern organisiert waren, wie z. B. das Anmelden mit der GitHub-Authentifizierung und die gute Verbindung mit der Shell-Umgebung von Django, wird es zusammengefasst. Wir verwenden ELB / EC2 / RDS von AWS und Nginx für den Webserver.

Als Anwendungsfall habe ich bereits eine Django-Umgebung für die Verbindung mit Testdaten erstellt, aber ich möchte eine Umgebung, in der ich sie schnell vom WEB aus berühren kann. Ich möchte die Umgebung für jeden Benutzer trennen, aber einen komplizierten Authentifizierungsmechanismus erstellen Ich denke, es ist nützlich, wenn Sie nicht langweilig werden wollen.

Wenn Sie fertig sind, können Sie im WEB-Browser schnell Folgendes tun. スクリーンショット 2017-02-19 15.47.47.png

Ablauf des Betriebs

Grob gesagt sieht es wie folgt aus.

  1. Greifen Sie auf http://jupyter.example.jp/ zu (Es ist besser, die BASIC-Authentifizierung usw. hinzuzufügen).
  2. nginx wird verarbeitet und Proxy für JupyterHub unter 127.0.0.1:8000
  3. Sie können Jupyter Notebook betreiben, indem Sie sich bei GitHub authentifizieren
  4. Jupyter Notebook fungiert als Kernel, indem es eine Verbindung zu Django-Prozessen herstellt, sodass Sie sofort auf die Datenbank zugreifen können.

Verbleibendes Problem: Die SSL-Umgebung wurde nicht erstellt

Ich denke, es gibt eine Möglichkeit, dies zu tun, aber wenn Sie eine https-Verbindung verwenden und SSL → nginx → Tornade auf Virtualenv für JupyterHub konfigurieren, kann die Verbindung nicht hergestellt werden, wenn Sie sie als Djangos Kernel in Notebook angeben. Ich tat. Es ist in Ordnung, auf http zuzugreifen, aber es scheint, dass etwas anderes festgelegt werden muss. Vielleicht muss JupyterHub mitgeteilt werden, dass es sich intern um http handelt. Da es Zugriff von außen gibt, wie zum Beispiel die Zusammenarbeit mit GitHub, sollte es https sein, aber es ist ein bisschen enttäuschend, dass es diesen Punkt nicht erreicht hat.

Bauverfahren für die Umwelt

Gesamtstruktur

In der von mir verwendeten Umgebung wird die Datenbank des Produktionsservers mit Daily maskiert und in einem anderen RDS gespeichert. In der Test- / Staging-Umgebung kann die Masken-DB von Django aus bedient werden. In diesem Dokument soll die von Django betriebene Umgebung für die Ausführung des RDS über JupyterHub aktiviert werden.

JupyterHub全体構成

Umweltannahmen

/ var / www / jupyter.example.jp / Es wird davon ausgegangen, dass die Django-Umgebung unter erstellt wird. Einige der möglicherweise relevanten Verzeichnisstrukturen sind unten aufgeführt.

/var/www/jupyter.example.jp/
├── README.md
├── jupyter  #Anwendungscode einfügen(Darunter verwalten.Da ist py)
├── requirements.txt
├── virtualenv

Wir gehen davon aus, dass Django bereits in der virtualenv-Umgebung enthalten ist und Django-Erweiterungen enthalten sind, um das Modell mit shell_plus zu laden.

Die virtuelle Umgebung ist wie folgt enthalten.

cd /var/www/jupyter.example.jp/
virtualenv --prompt "(jupyter)" virtualenv

Platzieren Sie außerdem die JupyterHub-Konfigurationsdatei unter "/ etc / jupyterhub".

Benutzer für JupyterHub erstellen

JupyterHub wird vom Benutzer jupyterhub betrieben.

sudo useradd jupyterhub
sudo usermod -a -G shadow jupyterhub
sudo mkdir /etc/jupyterhub
sudo chown jupyterhub /etc/jupyterhub

JupyterHub installieren

Fahren Sie mit [jupyterhub / jupyterhub: Mehrbenutzerserver für Jupyter-Notebooks] fort (https://github.com/jupyterhub/jupyterhub).

sudo apt-get install npm nodejs-legacy
sudo npm install -g configurable-http-proxy
(Installieren Sie mit pip unter einer virtuellen Umgebung)
pip install ipython jupyterhub

(Wie man npm und node installiert und sich alt fühlt)

Erstellen einer JupyterHub-Konfigurationsdatei

jupyterhub --generate-config
/etc/jupyterhub/jupyterhub_config.Gehen Sie zu py und beheben Sie Folgendes

L.In der Nähe von 137
c.JupyterHub.ip = '127.0.0.1'

L.In der Nähe von 106
c.JupyterHub.cookie_secret_file = '/etc/jupyterhub/jupyterhub_cookie_secret'
c.JupyterHub.db_url = '/etc/jupyterhub/jupyterhub.sqlite'

Referenz: http://jupyterhub.readthedocs.io/en/latest/config-examples.html

Melden Sie sich mit dem GitHub-Konto an

Erstellen Sie Einstellungen, um sich mit Oauth von JupyterHub bei GitHub anzumelden.

pip install oauthenticator

Folgendes wurde zu ungefähr L.58 von jupyterhub_config.py hinzugefügt

c.JupyterHub.authenticator_class = 'oauthenticator.GitHubOAuthenticator'
c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']
c.GitHubOAuthenticator.client_id = os.environ['GITHUB_CLIENT_ID']
c.GitHubOAuthenticator.client_secret = os.environ['GITHUB_CLIENT_SECRET']

Referenz: https://github.com/jupyterhub/oauthenticator

Spawner Ich habe kein tiefes Verständnis dafür, was Spawner ist, aber es scheint, dass ich einen Spawner für JupyterHub definieren muss, um den Prozess zu verwalten.

Referenz: http://jupyterhub.readthedocs.io/en/latest/spawners.html

pip install git+https://github.com/jupyter/sudospawner

Beschreiben Sie Folgendes in der Nähe von L.220 von jupyterhub_config.py

c.JupyterHub.confirm_no_ssl = True
c.JupyterHub.spawner_class = 'sudospawner.SudoSpawner'
c.Spawner.notebook_dir = '~/notebooks'

c.SudoSpawner.sudospawner_path = '/var/www/jupyter.example.jp/virtualenv/bin/sudospawner'

Fügen Sie am Ende Folgendes mit "sudo visudo" hinzu.

## Jupyterhub
# comma-separated whitelist of users that can spawn single-user servers
Runas_Alias JUPYTER_USERS =Zu verwendender GitHub-Benutzername(Durch Kommata abgetrennt)

# the command(s) the Hub can run on behalf of the above users without needing a password# the exact pa$
Cmnd_Alias JUPYTER_CMD = /var/www/jupyter.example.jp/virtualenv/bin/sudospawner

# actually give the Hub user permission to run the above command on behalf# of the above users without$
jupyterhub ALL=(JUPYTER_USERS) NOPASSWD:JUPYTER_CMD

Referenz: http://qiita.com/mt08/items/301f9fb93d01e78bda47

Starten Sie Jupyter Hub

Mit den Einstellungen bis zu diesem Punkt können Sie den JupyterHub-Server starten. Erstellen Sie ein Startskript und starten Sie es.

sudo -u jupyterhub vi /etc/jupyterhub/launch_notebook.sh
#!/bin/bash

export OAUTH_CALLBACK_URL=http://jupyter.example.jp/hub/oauth_callback
export GITHUB_CLIENT_ID=xxx
export GITHUB_CLIENT_SECRET=xxx

source /var/www/jupyter.example.jp/virtualenv/bin/activate
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

Die für die GitHub-Integration erforderlichen CLIENT_ID und CLIENT_SECRET können wie folgt abgerufen werden. https://github.com/settings/applications/new

mit diesem

sudo -u jupyterhub /etc/jupyterhub/launch_notebook.sh

Wenn Sie ausführen, sollte JupyterHub unter http://127.0.0.1:8000/ beginnen.

Nginx-Einstellungen

Sobald JupyterHub startet, senden wir als nächstes den Zugriff von ELB. nginx erhält Zugriff auf Port 80 und verwendet ihn als Proxy, um ihn an Port 8000 zu senden, falls er von JupyterHub verarbeitet werden soll.

sudo vi vi /etc/nginx/nginx.conf
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    ...

Erstellen Sie eine conf-Datei, die die Einstellungen für jupyter.example.jp unter / etc / nginx / sites-enabled / beschreibt. (Beispiel: jupyter.example.jp.conf)

server {
    listen 80;
    server_name jupyter.example.jp;

    #Ich möchte die folgenden Einstellungen aktivieren, wenn eine HTTPS-Verbindungsumgebung erstellt wird
    # add_header Strict-Transport-Security max-age=15768000;

    # Managing literal requests to the JupyterHub front end
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Managing WebHook/Socket requests between hub user servers and external proxy
    location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? {
        proxy_pass http://127.0.0.1:8000;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

Hier können Sie sich über GitHub anmelden

Es ist in Ordnung, wenn Sie bereits denselben GitHub-Benutzernamen für Linux-Benutzer haben, aber wenn Sie keinen haben, müssen Sie einen erstellen.

USER=Zu verwendender GitHub-Benutzername
useradd -d /home/${USER} -m ${USER}
mkdir /home/${USER}/notebooks
chown ${USER}/home/${USER}/notebooks

Kernel-Einstellungen

Jupyter Notebook hat das Konzept ** Kernel **, mit dem Sie angeben können, welche Python-Umgebung zur Laufzeit verwendet werden soll. Standardmäßig ist dies die Python-Umgebung beim Start. Wenn Sie jedoch die Umgebung mit Djangos shell_plus darauf einstellen, ist dies sehr praktisch, da sie mit der bereits verbundenen Datenbank verwendet und der Modellimport abgeschlossen werden kann.

Wenn Sie Jupyter Hub in Ihrer Virtualenv-Umgebung haben, können Sie eine Konfigurationsdatei erstellen mit: WARNUNG ist aus, aber ...

% jupyter kernelspec install-self --user
[InstallNativeKernelSpec] WARNING | `jupyter kernelspec install-self` is DEPRECATED as of 4.0. You probably want `ipython kernel install` to install the IPython kernelspec.
[InstallNativeKernelSpec] Installed kernelspec python3 in /home/your_user/.local/share/jupyter/kernels/python3

Wenn Sie es in den globalen Bereich stellen, ohne es in die Virtualenv-Umgebung zu stellen, können Sie dies möglicherweise wie folgt tun.

% python -m ipykernel install
Installed kernelspec python3 in /usr/local/share/jupyter/kernels/python3

Verschieben Sie dann die erstellten Einstellungsdateien.

% cd /usr/local/share
% sudo mv /home/your_user/.local/share/jupyter ./
% sudo chmod 775 jupyter
% sudo chown -R root:root jupyter
% cd /usr/local/share/jupyter/kernels

% ls /usr/local/share/jupyter/kernels
python3

% sudo mv python3 django

% ls /usr/local/share/jupyter/kernels/django
kernel.json  logo-32x32.png  logo-64x64.png
sudo vi django/kernel.json

Ich denke, dass es wie folgt ist, also modifiziere es wie später beschrieben.

{
 "language": "python",
 "argv": [
  "/var/www/jupyter.example.jp/virtualenv/bin/python3.4",
  "-m",
  "ipykernel",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3"
}

{
  "display_name": "Django",
  "language": "python",
  "codemirror_mode": {
    "version": 3,
    "name": "ipython"
  },
  "argv": [
    "/var/www/jupyter.example.jp/virtualenv/bin/python",
    "/var/www/jupyter.example.jp/jupyter/manage.py",
    "shell_plus",
    "--settings=jupyter.settings",
    "--kernel",
    "--connection-file",
    "{connection_file}"
  ]
}

※--settings=jupyter.Einstellungen wird verwaltet.Geben Sie den Pfad der von py verwendeten Django-Konfigurationsdatei an
※shell_Django zu Django, um Plus zu verwenden-INSTALLIERT mit Erweiterungen_Django auf APPS_Erweiterungen müssen angegeben werden

Referenz 1: https://ipython.org/ipython-doc/3/development/kernels.html Referenz 2: http://stackoverflow.com/questions/31088080/django-extensions-shell-plus-kernel-specify-connection-file (Es muss "--connection-file" sein, wie im Kommentar erwähnt) Referenz 3: http://stackoverflow.com/questions/39007571/running-jupyter-with-multiple-python-and-ipython-paths

Ebenfalls, https://github.com/Cadair/jupyter_environment_kernels Es mag einfacher sein, den Kernel zu wechseln, indem ich dies einbeziehe, aber ich habe es nicht getan.

Verwalten Sie Jupyter Hub mit Supervisord

Jetzt können Sie es starten, indem Sie "launch_notebook.sh" ausführen. Es ist jedoch mühsam, es bei jedem Neustart des Servers zu starten. Lassen Sie es also von Supervisord automatisch starten.

sudo vi /etc/supervisor/conf.d/
[program:notebook]
command=/etc/jupyterhub/launch_notebook.sh
directory=/etc/jupyterhub/
autostart=true
autorestart=true
stopgroup=true
startretries=3
exitcodes=0,2
stopsignal=TERM
user=jupyterhub
group=jupyterhub

Lesen Sie die Einstellungsdatei und starten Sie sie.

supervisord reread
supervisord reload
supervisord start notebook

Es wird automatisch gestartet und das Protokoll wird in "/ etc / log / Supervisor / notebook-xxx.log" aufgeführt.

Appendix Ich werde den Inhalt, den ich beim Erstellen der Umgebung erhalten habe, und die Links, auf die ich verwiesen habe, zusammenfassen.

Verbindungsproblem

Wenn Sie den 80. Zugriff auf JupyterHub senden, ohne darüber nachzudenken,

2017/02/03 17:20:44 [emerg] 16297#16297: unknown "connection_upgrade" variable

Ich bekomme den Fehler.

Es wurde unter Bezugnahme auf http://mogile.web.fc2.com/nginx/http/websocket.html gelöst, aber es scheint notwendig zu sein, Folgendes in "/ etc / nginx / nginx.conf" zu beschreiben.

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

Fehler beim Herstellen einer Verbindung zu https

Wenn Sie mit ELB über https zugreifen, können Sie auf JupyterHub zugreifen. Wenn Sie jedoch den Kernel einrichten, wird im Supervisord der folgende Fehler angezeigt.

[I 2017-02-05 21:43:24.410 JupyterHub log:100] 200 GET /hub/api/authorizations/cookie/jupyter-hub-token-xxx/[secret]([email protected]) 14.89ms
21:44:26.703 - error: [ConfigProxy] Proxy error:  Error: socket hang up
    at createHangUpError (http.js:1472:15)
    at Socket.socketCloseListener (http.js:1522:23)
    at Socket.EventEmitter.emit (events.js:95:17)
    at TCP.close (net.js:466:12)

Es wird als Cookie bezeichnet, und es scheint, dass es durch Ändern des Einstellungswerts irgendwo behoben werden kann, aber ich konnte das nicht tun und gab auf. Ich werde es eines Tages erneut versuchen.

Installieren Sie verschiedene Bibliotheken für die Datenanalyse

Dieser Bereich wird an anderer Stelle veröffentlicht, sodass er möglicherweise weggelassen wird. Um jedoch Matplotlib usw. zu verwenden, sind die für die Datenanalyse erforderlichen Bibliotheken im Folgenden enthalten.

sudo apt-get install -y libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
pip install numpy pandas matplotlib seaborn scikit-learn
* Sie können es verwenden, indem Sie es in die virtualenv-Umgebung stellen und als Supervisor-Neustart-Notizbuch verwenden.

Andere Referenzmaterialien

Recommended Posts

Erstellen Sie eine Datenanalyseumgebung, die die GitHub-Authentifizierung und Django mit JupyterHub verbindet
Erstellen Sie eine Datenanalyseumgebung mit Kedro + MLflow + Github-Aktionen
[DynamoDB] [Docker] Erstellen Sie mit Docker-Compose eine Entwicklungsumgebung für DynamoDB und Django
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Erstellen Sie eine virtuelle Umgebung mit pyenv und venv
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
Erstellen einer Django-Umgebung für Win10 (mit virtuellem Speicherplatz)
Erstellen einer numerischen Berechnungsumgebung mit pyenv und miniconda3
Entwickeln Sie eine Web-API, die in DB gespeicherte Daten mit Django und SQLite zurückgibt
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
Erstellen Sie eine Docker-Umgebung, die PyTorch und JupyterLab verwenden kann
Erstellen Sie mit VirtualBox und Ubuntu eine Scikit-Lernumgebung für maschinelles Lernen
[Django] Erstellen Sie mit PyCharm schnell eine Entwicklungsumgebung für Django-Container (Docker)
Erstellen Sie eine Python-Datenanalyseumgebung auf einem Mac (El Capitan).
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Erstellen Sie eine Webanwendung mit Django
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
Erstellen Sie mit Anaconda und PyCharm eine Python-Umgebung auf Ihrem Mac
Erstellen Sie mit PsychoPy + Jupyter Notebook eine komfortable Umgebung für psychologische Experimente / Analysen
Erstellen Sie ein USB-Boot-Ubuntu mit einer Python-Umgebung für die Datenanalyse
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Erstellen Sie mit Docker-Compose eine schnelle API-Umgebung
Erstellen Sie mit Docker eine CentOS Linux 8-Umgebung und starten Sie Apache HTTP Server
[Linux] Erstellen einer Jenkins-Umgebung mit Docker
Erstellen Sie schnell eine Python-Umgebung für Deep Learning / Data Science (Windows)
Erstellen Sie mit pyenv eine virtuelle Umgebung für Python
Erstellen Sie eine Drohnen-Simulator-Umgebung und versuchen Sie einen einfachen Flug mit Mission Planner
Erstellen Sie mit Neovim eine moderne Python-Umgebung
Vorgehensweise zum Erstellen einer Django-Umgebung mit Win10 WSL Ubuntu18.04 + Anaconda + Apache2
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
Erstellen Sie mit Docker auf RaspberryPi3 eine Python + Flasche + MySQL-Umgebung! [Versuch und Irrtum]
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
Erstellen Sie eine TensorFlow-Entwicklungsumgebung auf Amazon EC2 mit Befehlskopie
Praxis der Erstellung einer Datenanalyseplattform mit BigQuery und Cloud DataFlow (Datenverarbeitung)
Erstellen einer verteilten Umgebung mit der Raspberry PI-Serie (Teil 3: Installieren und Konfigurieren von dnsmasq)
Erstellen Sie eine Entwicklungsumgebung für die C-Sprache mit einem Container
Erstellen Sie mit pulumi eine WardPress-Umgebung auf AWS
Bereiten Sie eine Programmiersprachenumgebung für die Datenanalyse vor
Erstellen einer Python-Umgebung mit virtualenv und direnv
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Erstellen Sie eine Python-Umgebung mit ansible auf centos6
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
[Memo] Erstellen Sie eine virtuelle Umgebung mit Pyenv + anaconda
Erstellen einer Python-Umgebung mit OSX Elcapitan
Erstellen Sie eine Python-Umgebung für maschinelles Lernen mit Containern
Erstellen Sie eine Python-Ausführungsumgebung mit VS-Code
Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Erstellen Sie mit Docker eine grundlegende Data Science-Umgebung (Jupyter, Python, R, Julia, Standardbibliothek).
Erstellen Sie mit pyenv-virtualenv eine Python-Umgebung für jedes Verzeichnis