|
| 1 | +--- |
| 2 | +page_id: cdfffb5e-7cc2-4def-bd48-4ce85c0c633a |
| 3 | +--- |
| 4 | + |
| 5 | +import { DynamicInput, TemplateCode } from '@tdev-components/DynamicValues'; |
| 6 | + |
| 7 | +# JupyterHub |
| 8 | + |
| 9 | +JupyterHub auf Dokku deployen. |
| 10 | + |
| 11 | +<DynamicInput name="APP" default='jupyterhub' monospace /> |
| 12 | +<DynamicInput name="DOMAIN" default='jupyter.domain.ch' monospace /> |
| 13 | +<DynamicInput name="DOCKER_JUPYTER_IMAGE" default='jupyter/scipy-notebook:latest' monospace /> |
| 14 | + |
| 15 | +## App erstellen und konfigurieren |
| 16 | + |
| 17 | +<TemplateCode> |
| 18 | + ```bash title="root@dokku" |
| 19 | + # App erstellen |
| 20 | + dokku apps:create {{APP}} |
| 21 | + |
| 22 | + dokku domains:set {{APP}} {{DOMAIN}} |
| 23 | + dokku ports:set {{APP}} http:80:8000 |
| 24 | + |
| 25 | + # Docker-Socket mounten, damit JupyterHub neue Container starten kann |
| 26 | + dokku storage:mount {{APP}} /var/run/docker.sock:/var/run/docker.sock |
| 27 | + |
| 28 | + # Netzwerk erstellen und konfigurieren |
| 29 | + dokku network:create {{APP}} |
| 30 | + dokku network:set {{APP}} bind-all-interfaces true |
| 31 | + dokku network:set {{APP}} attach-post-create {{APP}} |
| 32 | + |
| 33 | + # Netzwerk-Umgebungsvariablen setzen |
| 34 | + dokku config:set --no-restart {{APP}} DOCKER_NETWORK_NAME={{APP}} |
| 35 | + dokku config:set --no-restart {{APP}} HUB_IP={{APP}}.web |
| 36 | + |
| 37 | + # Postgres-Datenbank erstellen und verlinken |
| 38 | + dokku postgres:create {{APP}} |
| 39 | + dokku postgres:link {{APP}} {{APP}} |
| 40 | + |
| 41 | + # SQLAlchemy erwartet postgresql:// statt postgres:// |
| 42 | + DB_URL=$(dokku config:get {{APP}} DATABASE_URL) |
| 43 | + dokku config:set --no-restart {{APP}} DATABASE_URL="${DB_URL//postgres:\/\//postgresql:\/\/}" |
| 44 | + |
| 45 | + # Post-Deploy-Skript konfigurieren |
| 46 | + dokku config:set --no-restart {{APP}} DOCKER_JUPYTER_IMAGE="{{DOCKER_JUPYTER_IMAGE}}" |
| 47 | + dokku config:set --no-restart {{APP}} DOKKU_POST_DEPLOY_SCRIPT_DEPENDENCIES="images/Dockerfile;images/overrides.json" |
| 48 | + ``` |
| 49 | +</TemplateCode> |
| 50 | + |
| 51 | +## Speicher und Datenpersistenz |
| 52 | + |
| 53 | +<TemplateCode> |
| 54 | + ```bash title="root@dokku" |
| 55 | + mkdir -p /var/lib/dokku/data/storage/{{APP}}/data |
| 56 | + dokku storage:mount {{APP}} /var/lib/dokku/data/storage/{{APP}}/data:/data |
| 57 | + |
| 58 | + # Gemeinsame Verzeichnisse erstellen |
| 59 | + mkdir -p /var/lib/dokku/data/storage/{{APP}}/data/shared |
| 60 | + mkdir -p /var/lib/dokku/data/storage/{{APP}}/data/colab |
| 61 | + |
| 62 | + # Benutzer jovian:users Zugriff auf gemeinsame Verzeichnisse gewähren |
| 63 | + chown -R 1000:100 /var/lib/dokku/data/storage/{{APP}}/data/shared |
| 64 | + chown -R 1000:100 /var/lib/dokku/data/storage/{{APP}}/data/colab |
| 65 | + |
| 66 | + # Maximale Upload-Grösse erhöhen |
| 67 | + dokku nginx:set {{APP}} client-max-body-size 30m |
| 68 | + ``` |
| 69 | +</TemplateCode> |
| 70 | + |
| 71 | +## Authentifizierung - Azure Active Directory |
| 72 | + |
| 73 | +<DynamicInput name="AAD_TENANT_ID" default='xxxxxx-xxxxxx-xxxxxxx' monospace /> |
| 74 | +<DynamicInput name="AAD_CLIENT_ID" default='xxxxxx-xxxxxx-xxxxxxx' monospace /> |
| 75 | +<DynamicInput name="AAD_CLIENT_SECRET" default='xxxxxx-xxxxxx-xxxxxxx' monospace /> |
| 76 | + |
| 77 | +<TemplateCode> |
| 78 | + ```bash title="root@dokku" |
| 79 | + dokku config:set --no-restart {{APP}} AAD_TENANT_ID="{{AAD_TENANT_ID}}" |
| 80 | + dokku config:set --no-restart {{APP}} AAD_OAUTH_CALLBACK_URL="https://{{DOMAIN}}/hub/oauth_callback" |
| 81 | + dokku config:set --no-restart {{APP}} AAD_CLIENT_ID="{{AAD_CLIENT_ID}}" |
| 82 | + dokku config:set --no-restart {{APP}} AAD_CLIENT_SECRET="{{AAD_CLIENT_SECRET}}" |
| 83 | + |
| 84 | + dokku ps:restart {{APP}} |
| 85 | + ``` |
| 86 | +</TemplateCode> |
| 87 | + |
| 88 | +## Authentifizierung - GitHub OAuth (optional) |
| 89 | + |
| 90 | +<DynamicInput name="GITHUB_CLIENT_ID" default='XXXXXXXXXXXXXX' monospace /> |
| 91 | +<DynamicInput name="GITHUB_CLIENT_SECRET" default='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' monospace /> |
| 92 | + |
| 93 | +<TemplateCode> |
| 94 | + ```bash title="root@dokku" |
| 95 | + dokku config:set --no-restart {{APP}} OAUTH_CALLBACK_URL="https://{{DOMAIN}}/hub/oauth_callback" |
| 96 | + dokku config:set --no-restart {{APP}} GITHUB_CLIENT_ID="{{GITHUB_CLIENT_ID}}" |
| 97 | + dokku config:set --no-restart {{APP}} GITHUB_CLIENT_SECRET="{{GITHUB_CLIENT_SECRET}}" |
| 98 | + |
| 99 | + dokku ps:restart {{APP}} |
| 100 | + ``` |
| 101 | +</TemplateCode> |
| 102 | + |
| 103 | +## App deployen |
| 104 | + |
| 105 | +[Repository](https://github.com/lebalz/dokku-jupyterhub) klonen und auf Dokku pushen: |
| 106 | + |
| 107 | +<DynamicInput name="APP" default='jupyterhub' monospace /> |
| 108 | +<DynamicInput name="DOKKU_IP" default='49.123.45.67' monospace /> |
| 109 | + |
| 110 | +<TemplateCode> |
| 111 | + ```bash title="root@local" |
| 112 | + git clone https://github.com/lebalz/dokku-jupyterhub.git |
| 113 | + cd dokku-jupyterhub |
| 114 | + git remote add dokku dokku@{{DOKKU_IP}}:{{APP}} |
| 115 | + git push dokku |
| 116 | + ``` |
| 117 | +</TemplateCode> |
| 118 | + |
| 119 | +## SSL mit Let's Encrypt |
| 120 | + |
| 121 | +<DynamicInput name="APP" default='jupyterhub' monospace /> |
| 122 | +<TemplateCode> |
| 123 | + ```bash title="root@dokku" |
| 124 | + dokku letsencrypt:enable {{APP}} |
| 125 | + ``` |
| 126 | +</TemplateCode> |
| 127 | + |
| 128 | +## Daten exportieren und importieren |
| 129 | + |
| 130 | +Die Datenbank muss nicht übernommen werden, da sie mit der neuen Instanz neu erstellt wird. Alle wichtigen Daten liegen im /data-Verzeichnis, welches auf dem Host persistiert und gemountet wird. Dieses Verzeichnis kann einfach mit rsync von der alten auf die neue Instanz übertragen werden. |
| 131 | + |
| 132 | +:::info[Alte Instanz] |
| 133 | +<DynamicInput name="APP_OLD" default={(page) => page.dynamicValues.get('APP') ?? 'jupyterhub'} monospace /> |
| 134 | +<DynamicInput name="DOKKU_IP_OLD" default='188.123.45.67' monospace /> |
| 135 | +::: |
| 136 | + |
| 137 | +:::tip[Neue Instanz] |
| 138 | +<DynamicInput name="APP" default='jupyterhub' monospace /> |
| 139 | +<DynamicInput name="DOKKU_IP" default='49.123.45.67' monospace /> |
| 140 | +::: |
| 141 | + |
| 142 | +<TemplateCode> |
| 143 | + ```bash title="root@{{DOKKU_IP}}" |
| 144 | + rsync -azP root@{{DOKKU_IP_OLD}}:/var/lib/dokku/data/storage/{{APP_OLD}}/data/ /var/lib/dokku/data/storage/{{APP}}/data/ |
| 145 | + ``` |
| 146 | +</TemplateCode> |
| 147 | + |
| 148 | + |
0 commit comments