Skip to content

Commit 714c2a4

Browse files
committed
Add Jupyter Health Hubs
Ref #3796
1 parent 78f1fff commit 714c2a4

15 files changed

+523
-0
lines changed

.github/workflows/deploy-grafana-dashboards.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ jobs:
3636
- cluster_name: ubc-eoas
3737
- cluster_name: utoronto
3838
- cluster_name: victor
39+
- cluster_name: jupyter-health
3940

4041
steps:
4142
- name: Checkout repo

.github/workflows/deploy-hubs.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ jobs:
199199
failure_nasa-ghg: "${{ env.failure_nasa-ghg }}"
200200
failure_qcl: "${{ env.failure_qcl }}"
201201
failure_jupyter-meets-the-earth: "${{ env.failure_jupyter-meets-the-earth }}"
202+
failure_jupyter-health: "${{ env.failure_jupyter-health }}"
202203
failure_smithsonian: "${{ env.failure_smithsonian }}"
203204
failure_catalystproject-latam: "${{ env.failure_catalystproject-latam }}"
204205
failure_catalystproject-africa: "${{ env.failure_catalystproject-africa }}"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: jupyter-health
2+
provider: aws
3+
aws:
4+
key: enc-deployer-credentials.secret.json
5+
clusterType: eks
6+
clusterName: jupyter-health
7+
region: us-east-2
8+
support:
9+
helm_chart_values_files:
10+
- support.values.yaml
11+
- enc-support.secret.values.yaml
12+
hubs:
13+
- name: staging
14+
display_name: "Jupyter Health (staging)"
15+
domain: staging.jupyter-health.2i2c.cloud
16+
helm_chart: basehub
17+
helm_chart_values_files:
18+
- common.values.yaml
19+
- staging.values.yaml
20+
- enc-staging.secret.values.yaml
21+
- name: prod
22+
display_name: "Jupyter Health (prod)"
23+
domain: jupyter-health.2i2c.cloud
24+
helm_chart: basehub
25+
helm_chart_values_files:
26+
- common.values.yaml
27+
- prod.values.yaml
28+
- enc-prod.secret.values.yaml
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
nfs:
2+
enabled: true
3+
pv:
4+
enabled: true
5+
# from https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html
6+
mountOptions:
7+
- rsize=1048576
8+
- wsize=1048576
9+
- timeo=600
10+
- soft # We pick soft over hard, so NFS lockups don't lead to hung processes
11+
- retrans=2
12+
- noresvport
13+
serverIP: fs-07b67adf6626672af.efs.us-east-2.amazonaws.com
14+
baseShareName: /
15+
jupyterhub:
16+
custom:
17+
2i2c:
18+
add_staff_user_ids_to_admin_users: true
19+
add_staff_user_ids_of_type: "github"
20+
jupyterhubConfigurator:
21+
enabled: false
22+
homepage:
23+
templateVars:
24+
org:
25+
name: Jupyter Health
26+
logo_url: https://jupyter.org/assets/homepage/main-logo.svg
27+
url: https://github.com/jupyterhealth/
28+
designed_by:
29+
name: "Jupyter Health"
30+
url: https://github.com/jupyterhealth/
31+
operated_by:
32+
name: "2i2c"
33+
url: https://2i2c.org
34+
funded_by:
35+
name: "Jupyter Health"
36+
url: https://www.earthdata.nasa.gov/esds/veda
37+
hub:
38+
allowNamedServers: true
39+
config:
40+
JupyterHub:
41+
authenticator_class: github
42+
GitHubOAuthenticator:
43+
allowed_organizations:
44+
- jupyterhealth
45+
scope:
46+
- read:org
47+
Authenticator:
48+
admin_users:
49+
- minrk
50+
- fperez
51+
- colliand
52+
- maryamv
53+
- ryanlovett
54+
singleuser:
55+
defaultUrl: /lab
56+
profileList:
57+
- display_name: "Pangeo Notebook"
58+
slug: pangeo
59+
description: Pangeo based notebook with a Python environment
60+
default: true
61+
kubespawner_override:
62+
image: quay.io/pangeo/pangeo-notebook:2024.03.22
63+
init_containers:
64+
# Need to explicitly fix ownership here, as otherwise these directories will be owned
65+
# by root on most NFS filesystems - neither EFS nor Google Filestore support anonuid
66+
- name: volume-mount-ownership-fix
67+
image: busybox:1.36.1
68+
command:
69+
- sh
70+
- -c
71+
- id && chown 1000:1000 /home/jovyan /home/jovyan/shared && ls -lhd /home/jovyan
72+
securityContext:
73+
runAsUser: 0
74+
volumeMounts:
75+
- name: home
76+
mountPath: /home/jovyan
77+
subPath: "{username}"
78+
# mounted without readonly attribute here,
79+
# so we can chown it appropriately
80+
- name: home
81+
mountPath: /home/jovyan/shared
82+
subPath: _shared
83+
profile_options: &profile_options
84+
resource_allocation: &profile_options_resource_allocation
85+
display_name: Resource Allocation
86+
choices:
87+
mem_1_9:
88+
display_name: 1.9 GB RAM, upto 3.7 CPUs
89+
kubespawner_override:
90+
mem_guarantee: 1991341312
91+
mem_limit: 1991341312
92+
cpu_guarantee: 0.234375
93+
cpu_limit: 3.75
94+
node_selector:
95+
node.kubernetes.io/instance-type: r5.xlarge
96+
default: true
97+
mem_3_7:
98+
display_name: 3.7 GB RAM, upto 3.7 CPUs
99+
kubespawner_override:
100+
mem_guarantee: 3982682624
101+
mem_limit: 3982682624
102+
cpu_guarantee: 0.46875
103+
cpu_limit: 3.75
104+
node_selector:
105+
node.kubernetes.io/instance-type: r5.xlarge
106+
mem_7_4:
107+
display_name: 7.4 GB RAM, upto 3.7 CPUs
108+
kubespawner_override:
109+
mem_guarantee: 7965365248
110+
mem_limit: 7965365248
111+
cpu_guarantee: 0.9375
112+
cpu_limit: 3.75
113+
node_selector:
114+
node.kubernetes.io/instance-type: r5.xlarge
115+
mem_14_8:
116+
display_name: 14.8 GB RAM, upto 3.7 CPUs
117+
kubespawner_override:
118+
mem_guarantee: 15930730496
119+
mem_limit: 15930730496
120+
cpu_guarantee: 1.875
121+
cpu_limit: 3.75
122+
node_selector:
123+
node.kubernetes.io/instance-type: r5.xlarge
124+
mem_29_7:
125+
display_name: 29.7 GB RAM, upto 3.7 CPUs
126+
kubespawner_override:
127+
mem_guarantee: 31861460992
128+
mem_limit: 31861460992
129+
cpu_guarantee: 3.75
130+
cpu_limit: 3.75
131+
node_selector:
132+
node.kubernetes.io/instance-type: r5.xlarge
133+
mem_60_6:
134+
display_name: 60.6 GB RAM, upto 15.7 CPUs
135+
kubespawner_override:
136+
mem_guarantee: 65094813696
137+
mem_limit: 65094813696
138+
cpu_guarantee: 7.86
139+
cpu_limit: 15.72
140+
node_selector:
141+
node.kubernetes.io/instance-type: r5.4xlarge
142+
mem_121_2:
143+
display_name: 121.2 GB RAM, upto 15.7 CPUs
144+
kubespawner_override:
145+
mem_guarantee: 130189627392
146+
mem_limit: 130189627392
147+
cpu_guarantee: 15.72
148+
cpu_limit: 15.72
149+
node_selector:
150+
node.kubernetes.io/instance-type: r5.4xlarge
151+
- display_name: "Rocker Geospatial with RStudio"
152+
slug: rocker
153+
description: R environment with many geospatial libraries pre-installed
154+
kubespawner_override:
155+
image: rocker/binder:4.3
156+
image_pull_policy: Always
157+
# Launch RStudio after the user logs in
158+
default_url: /rstudio
159+
# Ensures container working dir is homedir
160+
# https://github.com/2i2c-org/infrastructure/issues/2559
161+
working_dir: /home/rstudio
162+
profile_options: *profile_options
163+
- display_name: "Bring your own image"
164+
description: Specify your own docker image (must have python and jupyterhub installed in it)
165+
slug: custom
166+
profile_options:
167+
image:
168+
display_name: Image
169+
unlisted_choice:
170+
enabled: True
171+
display_name: "Custom image"
172+
validation_regex: "^.+:.+$"
173+
validation_message: "Must be a publicly available docker image, of form <image-name>:<tag>"
174+
kubespawner_override:
175+
image: "{value}"
176+
choices: {}
177+
resource_allocation: *profile_options_resource_allocation
178+
179+
scheduling:
180+
userScheduler:
181+
enabled: true
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"AccessKey": {
3+
"AccessKeyId": "ENC[AES256_GCM,data:ZPnLxqCEDnm3k38kfkTBOxojO1U=,iv:+N1qti7SQAQ9ncTrkWmIhuo9BUrUDvM08LHsARfv84s=,tag:1xPNKQK7/vpJDSpXBG5H6A==,type:str]",
4+
"SecretAccessKey": "ENC[AES256_GCM,data:gmoDHtJVBIPoNi0mozBr6ggzl/bZ8rnirpBeuzUYiejraE8k6sWw+A==,iv:DXGDhq9AekwSY+LAGG+vuDgVpDPHdaFZh4OIyfpraxA=,tag:TnnEEX0UFZjX8gSe78eROA==,type:str]",
5+
"UserName": "ENC[AES256_GCM,data:l7xBnsJQh3wfSvrt91dxuqPUfFX9iKY=,iv:HNN1A/f70OCoY6YxS9VPwqFuusdSBhR7QWenu9eRg0M=,tag:MZRN9qU+xNrboAL99Cx1Tg==,type:str]"
6+
},
7+
"sops": {
8+
"kms": null,
9+
"gcp_kms": [
10+
{
11+
"resource_id": "projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs",
12+
"created_at": "2024-03-27T03:12:17Z",
13+
"enc": "CiUA4OM7eBALghHLDCATTTf2qSVQwFhR8G3uQdxd25yNBRNJfvfIEkkAXoW3Jmpb9Gxd2eYCUcE3E1WdVbkbAg/yf+Xxg0p3Aw1J73LcxTJTeifDx/s8qeuYZXyvxIsdy9DMW4xaMNOjZsdBSlqZMft8"
14+
}
15+
],
16+
"azure_kv": null,
17+
"hc_vault": null,
18+
"age": null,
19+
"lastmodified": "2024-03-27T03:12:18Z",
20+
"mac": "ENC[AES256_GCM,data:R4WEbpjhqioIvVWVhTZEY4D4+8HZanx+TU3RwrDazR/+1hbCV6a6nC4yaQG+3gRuoMGIQeRhiP8A5NifzcTeAtRZ9CYoFt/l4R39ow2z6BTGP1M2mNGGA0c6ZlqmJmrxyYIYcv4pWe3BfSBkCFjjqpj83C+AydNovUw2zJi+Gok=,iv:iR8sbRthqB+OpmvTJcrbTVAEXBHfyHqzRnAuk0vOQI0=,tag:t79XNiAlMiMgZK/sUBEp2g==,type:str]",
21+
"pgp": null,
22+
"unencrypted_suffix": "_unencrypted",
23+
"version": "3.8.1"
24+
}
25+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
grafana_token: ENC[AES256_GCM,data:pFUEbEuI9Oos6YtuA/oXDKjP6HklrH8G6C8lLh87DDbjQ8Sz0BD9JotBBKoNzA==,iv:rA2kl2O0lcUDPDUcwxuF1F5nY9lydLl+0K2k3OKYkF8=,tag:FkFR4rGHV7xizsUL969Aug==,type:str]
2+
sops:
3+
kms: []
4+
gcp_kms:
5+
- resource_id: projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs
6+
created_at: "2024-03-27T03:32:37Z"
7+
enc: CiUA4OM7eMIWtqEIQtysm+s5zxS/nKMoNkjDvRzgvAqs19hSfS03EkkAXoW3JssCZCIo6ovleKWINJnwDXgm/R5uTwhVZqRT0G4cficrTpplNQLvj5Lk7FcWeqqGaXK7pLeYaHeXmPBEDvj4YlRcYFrN
8+
azure_kv: []
9+
hc_vault: []
10+
age: []
11+
lastmodified: "2024-03-27T03:32:37Z"
12+
mac: ENC[AES256_GCM,data:Hx2QfF6std3LBVVV4Bz4vXKFXmW6Pi220z3I4tXPUzuWX0mVyb5AUr8Je2diq+6ds2rWmhKFskL0CLA5/zP9U/9vfpnddkJy5K8krlDn08s6QQ8NN6fzBzaDksghoD7Z3aRW7Hn7GwbgALVpF6j20Ty4ilUPDPjuZXVi8iZDZSQ=,iv:/eMrdS7XKkaAN2OGs2RQn1Y6dIAdXbgTZR9K1BnH/tI=,tag:5JqsQHlzFf1ASNq/M20sjg==,type:str]
13+
pgp: []
14+
unencrypted_suffix: _unencrypted
15+
version: 3.8.1
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
jupyterhub:
2+
hub:
3+
config:
4+
GitHubOAuthenticator:
5+
client_id: ENC[AES256_GCM,data:dK6sakIgpztIfiurNYY+8HtbynQ=,iv:yesxCvpGPK4QKLVNpI6LpWb8KX1brB/uhQIEg1tIbIg=,tag:35BASFn0mDkmBomDjAUNxQ==,type:str]
6+
client_secret: ENC[AES256_GCM,data:nKIRhTK13eIaR1tIWWw/bfK4pclINcj1mr7k1xj7LnWc6FA+QJL+/g==,iv:6fKX5y8+3IogwOVuBrbNT8KoUAPebji58/9JX8cOTP0=,tag:Z6B0FtLLdrE1TunBAKJ68Q==,type:str]
7+
sops:
8+
kms: []
9+
gcp_kms:
10+
- resource_id: projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs
11+
created_at: "2024-03-27T03:26:11Z"
12+
enc: CiUA4OM7eNaq2WnQcWV8UUsnnprPSIh0EJM+IyQbcq3ioRaxXOPIEkkAXoW3JilW+T15pzagOKIXjrqeJUpzLZzRZAWZXNJ9svGWZkhJpX6NtPJGNkXFx2dsjXG9pBm31G/7QJKdft93bmdvDu/0kQ53
13+
azure_kv: []
14+
hc_vault: []
15+
age: []
16+
lastmodified: "2024-03-27T03:26:56Z"
17+
mac: ENC[AES256_GCM,data:Zk8JTgNL+IM8S1kKe4ejbAUBWB+TzIFr9DhQ0RDRWV3c6r5XT3rBIqVCfHKhPh1RPeE8dFMdovxi/b62gkbUHHPQu+jemoQYofdd3BeuL8N2TZWL3L46uV/RBW0msqnALrZq0yD0hIcXNB4q/F1j0dUVd1wjrPxDaiFR1CYczK8=,iv:XkOBcJAnziqJi+vmP2SSP51x448aqilQ2gEA1a/Wkqg=,tag:SboAWeb1sD4hkYKf32mN2A==,type:str]
18+
pgp: []
19+
unencrypted_suffix: _unencrypted
20+
version: 3.8.1
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
jupyterhub:
2+
hub:
3+
config:
4+
GitHubOAuthenticator:
5+
client_id: ENC[AES256_GCM,data:dDQ5o50vtdrOeEAJSg1CYrzRjwY=,iv:zeb0Rh4NjNtfyGGzEVXAzSqdszDuTRrtC2F4tAp+D7Q=,tag:kLH86WnG3PmkpEEGoTau6w==,type:str]
6+
client_secret: ENC[AES256_GCM,data:nqrPYv/i3NJ1TkAncgm+NF0r1U95HxV8pkQXYTMULqibiCwOhwq11g==,iv:5sk0Ac/JDFmArGFtfmsYJjwHNfIZW9Q45X2+hIB9x+o=,tag:4taAorVZrfs3FBMn7ala+w==,type:str]
7+
sops:
8+
kms: []
9+
gcp_kms:
10+
- resource_id: projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs
11+
created_at: "2024-03-27T03:20:32Z"
12+
enc: CiUA4OM7ePrLrsqEqXlDkXkXRAWDaAdEbzVylzq8w6GKfCCJGgAvEkkAXoW3JiUlHtWirbwpxMHx9IojRvV71ZR67dw+MFn5ngfTuEWlU+fhhN0SDFd2a97Np9Bdw8RREy43KB++4GKUntGNNxppYhHh
13+
azure_kv: []
14+
hc_vault: []
15+
age: []
16+
lastmodified: "2024-03-27T03:21:41Z"
17+
mac: ENC[AES256_GCM,data:YigsyrOdKkCTndXMaqS8Fbp54GPJ3xms4pQGxWyRxSf0xq8qf1CN82cM7laGIT/svGxtnelqSsj242uVdPOXLYSPyfibjrKhfNNEcjBakyzPJh0M5JE/7/fUqDSdlplP/8eihjKyQME7u0vBjOsNBKoYvO60131K+GwC7hy50Jw=,iv:k+UTWDJKPjdZHhaufhVGmuHip0BSH2qhFLl00bVv90Q=,tag:1dW5x+5w3AiC9nMYUvS9eQ==,type:str]
18+
pgp: []
19+
unencrypted_suffix: _unencrypted
20+
version: 3.8.1
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
prometheusIngressAuthSecret:
2+
username: ENC[AES256_GCM,data:3KOczS+romK4eNELpyBv6Tf4w1mjlIUC7M3v/ni2UXI/KIm3aYzZtxdphrI4fyUBkOrbIUeFQ3uEn12usvoLXg==,iv:Nz+wm18W9ihBIQ3Q/D62RdP4ituhYkEBIMC8JUKnH8w=,tag:pOhYeh6JOBUzb6U07baQBg==,type:str]
3+
password: ENC[AES256_GCM,data:1XQxK8KgONw8LSelTaQWyxnG0HK8YgxSJscw5ay33fLoLinFsO2c3Pi8K3FGV6rQ+7sQD3T0vZar+4dvpJuOxA==,iv:KXpm3d9g04CUFTQ/T8ZWukiK3lRoRd4NPFWeD3OCW7M=,tag:IfTNS6dtVTgcBGk0S2ztLQ==,type:str]
4+
sops:
5+
kms: []
6+
gcp_kms:
7+
- resource_id: projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs
8+
created_at: "2024-03-27T02:49:45Z"
9+
enc: CiUA4OM7eNHuKWwS9mCMAvaC+jgrMgx4DNQl4IADj65qOGD+4GnGEkkAXoW3JqR++Cg3n3xLzB37L4koPU0VXt0eTmF8Si4ILpYMf89WP8MSiG3KA5kEzEmknHUC8Z27cJz7MYR6x6U4JvQXXfS4TiG2
10+
azure_kv: []
11+
hc_vault: []
12+
age: []
13+
lastmodified: "2024-03-27T02:49:46Z"
14+
mac: ENC[AES256_GCM,data:kExXzURzp2c3DVDNycX5nMDD6dfiJ2Ysp89AfNfIdcFEG7OJufK4xKykD+4WHNqipHqspP36zxjtWeljdwNM1ElK0jy3mDPfX2Da99t3D5ORFHuc8lQXSW1klMEf3efmkrZyYtba1kqjClvXMjy7hyG219VNqYHM5O5N3/fk0iA=,iv:eC7YfoGBRGFGlbbx5MVVqRsD0+YYld2uOzjYsUCqEwo=,tag:Q0ShSiBkXICRTH/XrHbGag==,type:str]
15+
pgp: []
16+
unencrypted_suffix: _unencrypted
17+
version: 3.8.1
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
userServiceAccount:
2+
annotations:
3+
eks.amazonaws.com/role-arn: arn:aws:iam::211125465508:role/jupyter-health-prod
4+
jupyterhub:
5+
ingress:
6+
hosts: [jupyter-health.2i2c.cloud]
7+
tls:
8+
- hosts: [jupyter-health.2i2c.cloud]
9+
secretName: https-auto-tls
10+
hub:
11+
config:
12+
GitHubOAuthenticator:
13+
oauth_callback_url: https://jupyter-health.2i2c.cloud/hub/oauth_callback

0 commit comments

Comments
 (0)