Skip to content

Commit 020a166

Browse files
committed
add jupyterhub
1 parent 79e9ca2 commit 020a166

1 file changed

Lines changed: 148 additions & 0 deletions

File tree

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
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

Comments
 (0)