Skip to content

nebari-dev/jhub-apps

JupyterHub Apps Launcher

Lint Test

JupyterHub Apps Launcher is a generalized server launcher. The goal of this project is to support launching anything like say a Flask Server, FastAPI server or a Panel Dashboard via a user supplied command. Currently, the following frameworks are supported:

  • Panel
  • Bokeh
  • Streamlit
  • Plotly Dash
  • Voila
  • Gradio
  • JupyterLab
  • Generic Python Command

JHub Apps Demo

Installation

pip install jhub-apps

or via conda

conda install -c conda-forge jhub-apps

Development Installation

Install Dependencies

conda env create -f environment-dev.yml
conda activate jhub-apps-dev
pip install -e .

To develop the React UI frontend, also run:

cd ui
npm install
cd -

Starting JupyterHub

Set the following environment variable:

export JHUB_APP_JWT_SECRET_KEY=$(openssl rand -hex 32)

Start JupyterHub:

jupyterhub -f jupyterhub_config.py

Now go to http://127.0.0.1:8000/hub/home to access JHub Apps Launcher

API Endpoints

The Hub service is exposed via FastAPI endpoints. The documentation for the same can be accessed at: http://127.0.0.1:10202/services/japps/docs

To try out authenticated endpoints click on the Authorize button on the top right of the above url and choose OAuth2AuthorizationCodeBearer and click on Authorize.

Developing Locally

Note: In order to develop locally, both the JupyterHub backend and React UI frontend should be running.

  1. To start the JupyterHub Backend, run the following in a terminal:
jupyterhub -f jupyterhub_config.py
  1. To start the React UI frontend, run the following in a separate terminal from the ui directory:
npm run watch

Running Tests

Unit Tests

pytest jhub_apps/tests

E2E Tests

pytest jhub_apps/tests/tests_e2e -vvv -s --headed

Usage

JHub Apps has been tested with local JupyterHub using SimpleLocalProcessSpawner and with The Littlest JupyterHub using SystemdSpawner.

  • Install JHub Apps
pip install git+https://github.com/nebari-dev/jhub-apps.git
  • Add the following in The Littlest JupyterHub's jupyterhub_config.py
from tljh.user_creating_spawner import UserCreatingSpawner
from jhub_apps.configuration import install_jhub_apps

c.JupyterHub.bind_url = "<YOUR_JUPYTERHUB_URL>"
c.SystemdSpawner.unit_name_template = 'jupyter-{USERNAME}{JHUBSERVERNAME}'
c.JAppsConfig.apps_auth_type = "oauth" # or none (if you don't want authentication on apps)
c.JAppsConfig.python_exec = "python3"
# Pass in the path to jupyterhub config
c.JAppsConfig.jupyterhub_config_path = "jupyterhub_config.py"
# Either a static list of conda environments to show in the
# create panel apps form or a callable to fetch conda enviornments
# dynamically, e.g. from conda-store API
c.JAppsConfig.conda_envs = []
c = install_jhub_apps(c, UserCreatingSpawner)

Acknowledgments

This project is heavily inspired by and uses code from @danlester's cdsdashboards, without his work building this would have been a whole lot harder.