diff --git a/jupyter-images/fall-2024/snu/Acknowledgements.ipynb b/jupyter-images/fall-2024/snu/Acknowledgements.ipynb new file mode 100644 index 00000000..fae591fc --- /dev/null +++ b/jupyter-images/fall-2024/snu/Acknowledgements.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c86cd54f-b73c-4781-b6eb-89c79d3d3b22", + "metadata": {}, + "source": [ + "## Acknowledgements\n", + "\n", + "Launching this JupyterHub server is the result of a collaboration between several research and academic institutions and their staff. For Jetstream2 and JupyterHub expertise, we thank Andrea Zonca (San Diego Supercomputing Center), Jeremy Fischer, Mike Lowe (Indiana University), the NSF Jetstream2 (`doi:10.1145/3437359.3465565`) team.\n", + "\n", + "This work employs the NSF Jetstream2 Cloud at Indiana University through allocation EES220002 from the Advanced Cyberinfrastructure Coordination Ecosystem: Services & Support (ACCESS) program, which is supported by National Science Foundation grants #2138259, #2138286, #2138307, #2137603, and #2138296.\n", + "\n", + "Unidata is one of the University Corporation for Atmospheric Research (UCAR)'s Community Programs (UCP), and is funded primarily by the National Science Foundation (AGS-2403649).\n", + "\n", + "## To Acknowledge This JupyterHub and the Unidata Science Gateway\n", + "\n", + "If you have benefited from the Unidata Science Gateway, please cite `doi:10.5065/688s-2w73`. Additional citation information can be found in this [Citation File Format file](https://raw.githubusercontent.com/Unidata/science-gateway/master/CITATION.cff).\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter-images/fall-2024/snu/Dockerfile b/jupyter-images/fall-2024/snu/Dockerfile new file mode 100644 index 00000000..c2dda334 --- /dev/null +++ b/jupyter-images/fall-2024/snu/Dockerfile @@ -0,0 +1,39 @@ +# Heavily borrowed from docker-stacks/minimal-notebook/ +# https://github.com/jupyter/docker-stacks/blob/main/minimal-notebook/Dockerfile + +ARG BASE_CONTAINER=jupyter/minimal-notebook +FROM $BASE_CONTAINER + +ENV DEFAULT_ENV_NAME=snu-fall-2024 + +LABEL maintainer="Unidata " + +USER root + +RUN apt-get update && \ + apt-get install -y --no-install-recommends vim curl zip unzip && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +USER $NB_UID + +ADD environment.yml /tmp + +RUN mamba install --quiet --yes \ + 'conda-forge::nb_conda_kernels' \ + 'conda-forge::jupyterlab-git' \ + 'conda-forge::ipywidgets' && \ + mamba env update --name $DEFAULT_ENV_NAME -f /tmp/environment.yml && \ + pip install --no-cache-dir nbgitpuller && \ + mamba clean --all -f -y && \ + jupyter lab clean -y && \ + npm cache clean --force && \ + rm -rf /home/$NB_USER/.cache/yarn && \ + rm -rf /home/$NB_USER/.node-gyp && \ + fix-permissions $CONDA_DIR && \ + fix-permissions /home/$NB_USER + +COPY Acknowledgements.ipynb / + + +USER $NB_UID diff --git a/jupyter-images/fall-2024/snu/build.sh b/jupyter-images/fall-2024/snu/build.sh new file mode 100755 index 00000000..2b6fad0a --- /dev/null +++ b/jupyter-images/fall-2024/snu/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Check if an image name is provided +if [ -z "$1" ]; then + echo "Error: No image name provided." + echo "Usage: $0 " + exit 1 +fi + +IMAGE_NAME=$1 + +DATE_TAG=$(date "+%Y%b%d_%H%M%S") +RANDOM_HEX=$(openssl rand -hex 2) +TAG="${DATE_TAG}_${RANDOM_HEX}" + +FULL_TAG="unidata/$IMAGE_NAME:$TAG" + +echo "Building Docker image with tag: $FULL_TAG" + +docker build --no-cache --pull --tag "$FULL_TAG" . + +# Check if the build was successful +if [ $? -eq 0 ]; then + echo "Docker image built successfully: $FULL_TAG" +else + echo "Error: Docker build failed." + exit 1 +fi diff --git a/jupyter-images/fall-2024/snu/environment.yml b/jupyter-images/fall-2024/snu/environment.yml new file mode 100644 index 00000000..069fc436 --- /dev/null +++ b/jupyter-images/fall-2024/snu/environment.yml @@ -0,0 +1,26 @@ +name: snu-fall-2024 +channels: + - conda-forge +dependencies: + # Required by JupyterLab + - python=3 + - nb_conda_kernels + - ipykernel + # User requested packages + - numpy + - matplotlib + - cartopy + - metpy + - siphon + - pandas + - pip + - xarray + - ipywidgets + - python-awips + - scikit-learn + - scipy + - seaborn + - pip: + # It is recommended to install a package using pip as a last resort, i.e. + # when it is not found in the conda repos + - palmerpenguins diff --git a/jupyter-images/fall-2024/snu/secrets.yaml b/jupyter-images/fall-2024/snu/secrets.yaml new file mode 100644 index 00000000..d0cd5b17 --- /dev/null +++ b/jupyter-images/fall-2024/snu/secrets.yaml @@ -0,0 +1,113 @@ +hub: + cookieSecret: "xxx" + config: + Authenticator: + admin_users: + - admins + #If you have a large list of users, consider using allowed_users.yaml + allowed_users: + - users + # necessary for jhub admins to add user via admin page `/hub/admin` + allow_existing_users: true + GitHubOAuthenticator: + client_id: "xxx" + client_secret: "xxx" + oauth_callback_url: "https://.ees220002.projects.jetstream-cloud.org:443/oauth_callback" + JupyterHub: + authenticator_class: github + extraConfig: + 01-no-labels: | + from kubespawner import KubeSpawner + class CustomSpawner(KubeSpawner): + def _build_common_labels(self, extra_labels): + labels = super()._build_common_labels(extra_labels) + # Until https://github.com/jupyterhub/kubespawner/issues/498 + # is fixed + del labels['hub.jupyter.org/username'] + return labels + c.JupyterHub.spawner_class = CustomSpawner + + +proxy: + secretToken: "xxx" + +ingress: + enabled: true + annotations: + kubernetes.io/ingress.class: "nginx" + cert-manager.io/cluster-issuer: "letsencrypt" + #For manually issuing certificates: see vms/jupyter/readme.md + #cert-manager.io/issuer: "incommon" + nginx.ingress.kubernetes.io/proxy-body-size: 500m + hosts: + - ".ees220002.projects.jetstream-cloud.org" + tls: + - hosts: + - ".ees220002.projects.jetstream-cloud.org" + secretName: certmanager-tls-jupyterhub + +#For having a dedicated core node: see vms/jupyter/readme.md +#scheduling: +# corePods: +# tolerations: +# - key: hub.jupyter.org/dedicated +# operator: Equal +# value: core +# effect: NoSchedule +# - key: hub.jupyter.org_dedicated +# operator: Equal +# value: core +# effect: NoSchedule +# nodeAffinity: +# matchNodePurpose: require + +singleuser: + extraEnv: + NBGITPULLER_DEPTH: "0" + storage: + capacity: 10Gi + startTimeout: 600 + memory: + guarantee: 4G + limit: 4G + cpu: + guarantee: 1 + limit: 2 + defaultUrl: "/lab" + image: + name: "unidata/" + tag: "xxx" + lifecycleHooks: + postStart: + exec: + command: + - "bash" + - "-c" + - > + dir="/home/jovyan/.ssh"; [ -d $dir ] && { chmod 700 $dir && \ + chmod -f 600 $dir/* && chmod -f 644 $dir/*.pub; } || true; + cp -t /home/jovyan /Acknowledgements.ipynb && \ + /update_material.ipynb /additional_kernels.ipynb; + gitpuller ; + python /default_kernel.py $DEFAULT_ENV_NAME /home/jovyan; + [[ -f $HOME/.bashrc ]] || cp /etc/skel/.bashrc $HOME/; + [[ -f $HOME/.profile ]] || cp /etc/skel/.profile $HOME/; + [[ -f $HOME/.bash_logout ]] || cp /etc/skel/.bash_logout $HOME/; + [[ -f $HOME/.condarc ]] || cp /.condarc $HOME/; + #Multiple profiles: see vms/jupyter/readme.md + #profileList: + #- display_name: "High Power (default)" + # description: "12 GB of memory; up to 4 vCPUs" + # kubespawner_override: + # mem_guarantee: 12G + # mem_limit: 12G + # cpu_guarantee: 2 + # cpu_limit: 4 + # default: true + #- display_name: "Low Power" + # description: "6 GB of memory; up to 2 vCPUS" + # kubespawner_override: + # mem_guarantee: 6G + # mem_limit: 6G + # cpu_guarantee: 1 + # cpu_limit: 2