mirror of
https://github.com/jupyterhub/the-littlest-jupyterhub.git
synced 2025-12-18 21:54:05 +08:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc8e19b1b5 | ||
|
|
1f21e3cb26 | ||
|
|
b13f09564d | ||
|
|
c40d95c02a | ||
|
|
c35a4cbe65 | ||
|
|
fb78464dec | ||
|
|
9efe59f4f7 | ||
|
|
e14b8d8b77 | ||
|
|
cc00bf3a1a | ||
|
|
c6d86d059f | ||
|
|
4cd5da40c3 | ||
|
|
55db9c5d0b | ||
|
|
e893959ce5 | ||
|
|
5fdc31f9a9 | ||
|
|
a8c6c40b2b | ||
|
|
854f5edd06 | ||
|
|
0122a21c71 | ||
|
|
e9de9f6042 | ||
|
|
2b1b6787b8 | ||
|
|
3a7c6f7b38 | ||
|
|
1a83791191 | ||
|
|
0f03f40eff | ||
|
|
6801c68333 | ||
|
|
2fbe803530 | ||
|
|
0da7d09298 | ||
|
|
91af54ade3 | ||
|
|
645251a134 | ||
|
|
dfeddc2e53 | ||
|
|
4b13303d01 | ||
|
|
ad1455e4da | ||
|
|
6f38ec6a95 | ||
|
|
b6ee97c770 | ||
|
|
bdfabc5ce8 | ||
|
|
86a4bb67c8 | ||
|
|
259d2ff11d | ||
|
|
3753a3c775 | ||
|
|
bc09121677 |
@@ -11,7 +11,7 @@
|
||||
repos:
|
||||
# Autoformat: Python code, syntax patterns are modernized
|
||||
- repo: https://github.com/asottile/pyupgrade
|
||||
rev: v3.8.0
|
||||
rev: v3.10.1
|
||||
hooks:
|
||||
- id: pyupgrade
|
||||
args:
|
||||
@@ -37,13 +37,13 @@ repos:
|
||||
|
||||
# Autoformat: Python code
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.3.0
|
||||
rev: 23.7.0
|
||||
hooks:
|
||||
- id: black
|
||||
|
||||
# Autoformat: markdown, yaml
|
||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||
rev: v3.0.0-alpha.9-for-vscode
|
||||
rev: v3.0.0
|
||||
hooks:
|
||||
- id: prettier
|
||||
|
||||
@@ -64,7 +64,7 @@ repos:
|
||||
|
||||
# Lint: Python code
|
||||
- repo: https://github.com/pycqa/flake8
|
||||
rev: "6.0.0"
|
||||
rev: "6.1.0"
|
||||
hooks:
|
||||
- id: flake8
|
||||
|
||||
|
||||
27
docs/conf.py
27
docs/conf.py
@@ -20,6 +20,7 @@ author = "Project Jupyter Contributors"
|
||||
#
|
||||
extensions = [
|
||||
"sphinx_copybutton",
|
||||
"sphinx.ext.intersphinx",
|
||||
"sphinxext.opengraph",
|
||||
"sphinxext.rediraffe",
|
||||
"myst_parser",
|
||||
@@ -74,6 +75,32 @@ myst_enable_extensions = [
|
||||
"fieldlist",
|
||||
]
|
||||
|
||||
|
||||
# -- Options for intersphinx extension ---------------------------------------
|
||||
# ref: https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#configuration
|
||||
#
|
||||
# The extension makes us able to link like to other projects like below.
|
||||
#
|
||||
# rST - :external:py:class:`jupyterhub.spawner.Spawner`
|
||||
# MyST - {external:py:class}`jupyterhub.spawner.Spawner`
|
||||
#
|
||||
# rST - :external:py:attribute:`jupyterhub.spawner.Spawner.default_url`
|
||||
# MyST - {external:py:attribute}`jupyterhub.spawner.Spawner.default_url`
|
||||
#
|
||||
# To see what we can link to, do the following where "objects.inv" is appended
|
||||
# to the sphinx based website:
|
||||
#
|
||||
# python -m sphinx.ext.intersphinx https://jupyterhub.readthedocs.io/en/stable/objects.inv
|
||||
#
|
||||
intersphinx_mapping = {
|
||||
"jupyterhub": ("https://jupyterhub.readthedocs.io/en/stable/", None),
|
||||
}
|
||||
|
||||
# intersphinx_disabled_reftypes set based on recommendation in
|
||||
# https://docs.readthedocs.io/en/stable/guides/intersphinx.html#using-intersphinx
|
||||
intersphinx_disabled_reftypes = ["*"]
|
||||
|
||||
|
||||
# -- Options for linkcheck builder -------------------------------------------
|
||||
# ref: https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-the-linkcheck-builder
|
||||
#
|
||||
|
||||
64
docs/howto/admin/upgrade-tljh.md
Normal file
64
docs/howto/admin/upgrade-tljh.md
Normal file
@@ -0,0 +1,64 @@
|
||||
(howto-admin-upgrade-tljh)=
|
||||
|
||||
# Upgrade TLJH
|
||||
|
||||
A TLJH installation is supposed to be upgradable to get updates to JupyterHub
|
||||
itself and its dependencies in the [hub environment](hub-environment). For
|
||||
details on what is done during an upgrade, see
|
||||
[](topic-installer-upgrade-actions).
|
||||
|
||||
## Step 1: Read the changelog
|
||||
|
||||
Before making an upgrade, please read the [](changelog) to become aware about
|
||||
breaking changes. If there are breaking changes, you may need to update your
|
||||
configuration files or take other actions as well as part of the upgrade.
|
||||
|
||||
Adjusting to the breaking changes isn't part of this documentation, please rely
|
||||
on the TLJH changelog and the changelogs of related projects linked to from the
|
||||
TLJH changelog.
|
||||
|
||||
## Step 2: Consider making a backup
|
||||
|
||||
Before making an upgrade, consider if you want to first make a backup in some
|
||||
way. While upgrades between TLJH versions are tested with automation, there are
|
||||
no guarantees.
|
||||
|
||||
This project does't yet provide documentation on how to make backups, but if
|
||||
TLJH is installed on a virtual machine in a cloud, a good option is to try
|
||||
create a snapshot of the associated disk. If this isn't an option, you could
|
||||
consider making a backup of the files in `/opt/tljh` that contain most but not
|
||||
all things during an upgrade, or perhaps only the JupyterHub database with
|
||||
information about its users in `/opt/tljh/state` together with some other
|
||||
details.
|
||||
|
||||
## Step 3: Make the upgrade
|
||||
|
||||
To initialize the upgrade, do the following from a terminal on the machine where
|
||||
TLJH is installed.
|
||||
|
||||
```shell
|
||||
# IMPORTANT: This should NOT be run from a JupyterHub started user server, but
|
||||
# should only run from a standalone terminal session in the machine
|
||||
# where TLJH has been installed.
|
||||
#
|
||||
curl -L https://tljh.jupyter.org/bootstrap.py \
|
||||
| sudo python3 - \
|
||||
--version=latest
|
||||
```
|
||||
|
||||
You can also upgrade to specific version by changing `--version=latest` to
|
||||
`--version=1.0.0` or similar. There is no need to specify admin users etc again.
|
||||
|
||||
## Step 4: Verify function
|
||||
|
||||
After having made an upgrade its always good to verify that the JupyterHub
|
||||
installation still works as expected. You may want to try logging out, logging
|
||||
in, and starting a new server for example.
|
||||
|
||||
If you have issues consider the [](troubleshooting) documentation. If you need
|
||||
help you can ask questions in [Jupyter forum], and if you think there is a bug
|
||||
or documentation improvement that should be made you can open an issue or pull
|
||||
request in the [TLJH GitHub project].
|
||||
|
||||
[jupyter forum]: https://discourse.jupyter.org/c/jupyterhub/tljh
|
||||
[tljh github project]: https://github.com/jupyterhub/the-littlest-jupyterhub
|
||||
@@ -22,6 +22,7 @@ content/share-data
|
||||
user-env/user-environment
|
||||
user-env/notebook-interfaces
|
||||
user-env/server-resources
|
||||
user-env/override-lab-settings
|
||||
```
|
||||
|
||||
## Authentication
|
||||
@@ -55,6 +56,7 @@ admin/nbresuse
|
||||
admin/https
|
||||
admin/enable-extensions
|
||||
admin/systemd
|
||||
admin/upgrade-tljh
|
||||
```
|
||||
|
||||
## Cloud provider configuration
|
||||
|
||||
@@ -1,49 +1,47 @@
|
||||
(howto/user-env/notebook-interfaces)=
|
||||
|
||||
# Change default User Interface
|
||||
# Change default user interface
|
||||
|
||||
By default, logging into TLJH puts you in the classic Jupyter Notebook
|
||||
interface we all know and love. However, there are at least two other
|
||||
popular notebook interfaces you can use:
|
||||
By default a user starting a server will see the JupyterLab interface. This can
|
||||
be changed with TLJH config `user_environment.default_app` or with the
|
||||
JupyterHub config
|
||||
{external:py:attr}`jupyterhub.spawner.Spawner.default_url` directly.
|
||||
|
||||
1. [JupyterLab](http://jupyterlab.readthedocs.io/en/stable/)
|
||||
2. [nteract](https://nteract.io/)
|
||||
The TLJH config supports the options `jupyterlab` and `classic`, which
|
||||
translates to a `Spawner.default_url` config of `/lab` and `/tree`.
|
||||
|
||||
Both these interfaces are also shipped with TLJH by default. You can try
|
||||
them temporarily, or set them to be the default interface whenever you
|
||||
login.
|
||||
Both these interfaces are also shipped with TLJH by default. You can try them
|
||||
temporarily, or set them to be the default interface whenever you login.
|
||||
|
||||
## Trying an alternate interface temporarily
|
||||
|
||||
When you log in & start your server, by default the URL in your browser
|
||||
will be something like `/user/<username>/tree`. The `/tree` is what
|
||||
tells the notebook server to give you the classic notebook interface.
|
||||
When you log in and start your server, by default the URL in your browser will
|
||||
be something like `/user/<username>/lab`. The `/lab` is what tells the jupyter
|
||||
server to give you the JupyterLab user interface.
|
||||
|
||||
- **For the JupyterLab interface**: change `/tree` to `/lab`.
|
||||
- **For the nteract interface**: change `/tree` to `/nteract`
|
||||
As an example, you can update the URL to not end with `/lab`, but instead end
|
||||
with `/tree` to temporarily switch to the classic interface.
|
||||
|
||||
You can play around with them and see what fits your use cases best.
|
||||
## Changing the default user interface using TLJH config
|
||||
|
||||
## Changing the default user interface
|
||||
You can change the default url, and therefore the interface users get when they
|
||||
log in by modifying TLJH config as an admin user.
|
||||
|
||||
You can change the default interface users get when they log in by
|
||||
modifying `config.yaml` as an admin user.
|
||||
1. To launch the classic notebook interface when users log in, run the
|
||||
following in the admin console:
|
||||
|
||||
1. To launch **JupyterLab** when users log in, run the following in an
|
||||
admin console:
|
||||
```bash
|
||||
sudo tljh-config set user_environment.default_app classic
|
||||
```
|
||||
|
||||
1. To launch JupyterLab when users log in, run the following in an admin
|
||||
console:
|
||||
|
||||
```bash
|
||||
sudo tljh-config set user_environment.default_app jupyterlab
|
||||
```
|
||||
|
||||
2. Alternatively, to launch **nteract** when users log in, run the
|
||||
following in the admin console:
|
||||
|
||||
```bash
|
||||
sudo tljh-config set user_environment.default_app nteract
|
||||
```
|
||||
|
||||
3. Apply the changes by restarting JupyterHub. This should not disrupt
|
||||
1. Apply the changes by restarting JupyterHub. This should not disrupt
|
||||
current users.
|
||||
|
||||
```bash
|
||||
|
||||
121
docs/howto/user-env/override-lab-settings.md
Normal file
121
docs/howto/user-env/override-lab-settings.md
Normal file
@@ -0,0 +1,121 @@
|
||||
(topic-override-lab-settings)=
|
||||
|
||||
# Setting New Default JupyterLab Settings
|
||||
|
||||
If you or other users of your hub tend to use JupyterLab as your default notebook app,
|
||||
then you may want to override some of the default settings for the users of your hub.
|
||||
You can do this by creating a file `/opt/tljh/user/share/jupyter/lab/settings/overrides.json`
|
||||
with the necessary settings.
|
||||
|
||||
This how-to guide will go through the necessary steps to set new defaults
|
||||
for all users of your `TLJH` by example: setting the default theme to **JupyterLab Dark**.
|
||||
|
||||
## Step 1: Change your Personal Settings
|
||||
|
||||
The easiest way to set new default settings for all users starts with
|
||||
configuring your own settings preferences to what you would like everyone else to have.
|
||||
|
||||
1. Make sure you are in the [JupyterLab notebook interface](#howto/user-env/notebook-interfaces),
|
||||
which will look something like `http(s)://<YOUR-HUB-IP>/user/<YOUR_USERNAME/lab`.
|
||||
|
||||
1. Go to **Settings** in the menu bar and select **Theme -> JupyterLab Dark**.
|
||||
|
||||
## Step 2: Determine your Personal Settings Configuration
|
||||
|
||||
To set **JupyterLab Dark** as the default theme for all users, we will need to create
|
||||
a `json` formatted file with the setting override. Now that you have changed your
|
||||
personal setting, you can use the **JSON Settings Editor** to get the relevant
|
||||
setting snippet to add to the `overrides.json` file later.
|
||||
|
||||
1. Go to **Settings -> Advanced Settings Editor** then select **JSON Settings Editor** on the right.
|
||||
|
||||
1. Scroll down and select **Theme**. You should see the `json` formatted configuration:
|
||||
|
||||
```json
|
||||
{
|
||||
// Theme
|
||||
// @jupyterlab/apputils-extension:themes
|
||||
// Theme manager settings.
|
||||
// *************************************
|
||||
|
||||
// Theme CSS Overrides
|
||||
// Override theme CSS variables by setting key-value pairs here
|
||||
"overrides": {
|
||||
"code-font-family": null,
|
||||
"code-font-size": null,
|
||||
"content-font-family": null,
|
||||
"content-font-size1": null,
|
||||
"ui-font-family": null,
|
||||
"ui-font-size1": null
|
||||
},
|
||||
|
||||
// Selected Theme
|
||||
// Application-level visual styling theme
|
||||
"theme": "JupyterLab Dark",
|
||||
|
||||
// Scrollbar Theming
|
||||
// Enable/disable styling of the application scrollbars
|
||||
"theme-scrollbars": false
|
||||
}
|
||||
```
|
||||
|
||||
1. Determine the setting that you want to change. In this example it's the `theme`
|
||||
setting of `@jupyterlab/apputils-extension:theme` as can be seen above.
|
||||
|
||||
1. Build your `json` snippet. In this case, our snippet should look like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"@jupyterlab/apputils-extension:themes": {
|
||||
"theme": "JupyterLab Dark"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
We only want to change the **Selected Theme**, so we don't need to include
|
||||
the other theme-related settings for CSS and the scrollbar.
|
||||
|
||||
:::{note}
|
||||
To apply overrides for more than one setting, separate each setting by commas. For example,
|
||||
if you _also_ wanted to change the interval at which the notebook autosaves your content, you can use
|
||||
|
||||
```json
|
||||
{
|
||||
"@jupyterlab/apputils-extension:themes": {
|
||||
"theme": "JupyterLab Dark"
|
||||
},
|
||||
|
||||
"@jupyterlab/docmanager-extension:plugin": {
|
||||
"autosaveInterval": 30
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Step 3: Apply the Overrides to the Hub
|
||||
|
||||
Once you have your setting snippet created, you can add it to the `overrides.json` file
|
||||
so that it gets applied to all users.
|
||||
|
||||
1. First, create the settings directory if it doesn't already exist:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/tljh/user/share/jupyter/lab/settings
|
||||
```
|
||||
|
||||
1. Use `nano` to create and add content to the `overrides.json` file:
|
||||
|
||||
```bash
|
||||
sudo nano /opt/tljh/user/share/jupyter/lab/settings/overrides.json
|
||||
```
|
||||
|
||||
1. Copy and paste your snippet into the file and save.
|
||||
|
||||
1. Reload your configuration:
|
||||
```bash
|
||||
sudo tljh-config reload
|
||||
```
|
||||
|
||||
The new default settings should now be set for all users in your `TLJH` using the
|
||||
JupyterLab notebook interface.
|
||||
@@ -1,24 +1,10 @@
|
||||
(changelog)=
|
||||
|
||||
# Changelog
|
||||
|
||||
## 1.0
|
||||
|
||||
### 1.0.0b1 - 2023-07-07
|
||||
|
||||
````{warning}
|
||||
This is a beta release.
|
||||
|
||||
To upgrade to it, after having read the breaking changes below, you can do the
|
||||
following from a terminal on a machine TLJH is installed.
|
||||
|
||||
```shell
|
||||
# This should NOT be run from a JupyterHub started user server, but should
|
||||
# run from a standalone terminal session in the machine where TLJH has been
|
||||
# installed.
|
||||
curl -L https://tljh.jupyter.org/bootstrap.py \
|
||||
| sudo python3 - \
|
||||
--version=1.0.0b1
|
||||
```
|
||||
````
|
||||
### 1.0.0 - 2023-08-11
|
||||
|
||||
This release bundles with the latest available software from the JupyterHub
|
||||
ecosystem.
|
||||
@@ -27,9 +13,11 @@ The TLJH project now has tests to verify upgrades of installations between
|
||||
releases and procedures with automation to make releases. Going onwards, TLJH
|
||||
installations of version 0.2.0 and later are meant to be easy to upgrade.
|
||||
|
||||
For instructions on how to make an upgrade, see [](howto-admin-upgrade-tljh).
|
||||
|
||||
#### Breaking changes
|
||||
|
||||
- JupyterHub 1.\* has been upgraded to >=4.0.1,<5
|
||||
- JupyterHub 1.\* has been upgraded to >=4.0.2,<5
|
||||
- This upgrade requires user servers to be restarted if they were running
|
||||
during the upgrade.
|
||||
- Refer to the [JupyterHub changelog] for details where you pay attention to
|
||||
@@ -44,6 +32,9 @@ installations of version 0.2.0 and later are meant to be easy to upgrade.
|
||||
- The configured JupyterHub Spawner class `jupyterhub-systemdspawner` has been
|
||||
upgraded to a new major version, but no breaking change are expected to be
|
||||
noticed for users of this distribution.
|
||||
- User servers now launch into `/lab` by default, to revert this a JupyterHub
|
||||
admin user can do `sudo tljh-config set user_environment.default_app classic`
|
||||
or set the JupyterHub config `c.Spawner.default_url` directly.
|
||||
|
||||
[jupyterhub changelog]: https://jupyterhub.readthedocs.io/en/stable/changelog.html
|
||||
|
||||
@@ -62,15 +53,15 @@ user environment. The hub environment's dependencies are on the other hand
|
||||
always upgraded to the latest version within the specified version range defined
|
||||
in [tljh/requirements-hub-env.txt] and seen below.
|
||||
|
||||
[tljh/requirements-user-env-extras.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/1.0.0b1/tljh/requirements-user-env-extras.txt
|
||||
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/1.0.0b1/tljh/requirements-hub-env.txt
|
||||
[tljh/requirements-user-env-extras.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/1.0.0/tljh/requirements-user-env-extras.txt
|
||||
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/1.0.0/tljh/requirements-hub-env.txt
|
||||
|
||||
The changes in the respective environments between TLJH version 0.2.0 and
|
||||
1.0.0b1 are summarized below.
|
||||
The changes in the respective environments between TLJH version 0.2.0 and 1.0.0
|
||||
are summarized below.
|
||||
|
||||
| Dependency changes in the _hub environment_ | Version in 0.2.0 | Version in 1.0.0b1 | Changelog link | Note |
|
||||
| ------------------------------------------------------------------------------ | ---------------- | ------------------ | ---------------------------------------------------------------------------------------- | ---------------------------------------------------- |
|
||||
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | 1.\* | >=4.0.1,<5 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Running in the `jupyterhub` systemd service |
|
||||
| Dependency changes in the _hub environment_ | Version in 0.2.0 | Version in 1.0.0 | Changelog link | Note |
|
||||
| ------------------------------------------------------------------------------ | ---------------- | ---------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------- |
|
||||
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | 1.\* | >=4.0.2,<5 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Running in the `jupyterhub` systemd service |
|
||||
| [traefik](https://github.com/traefik/traefik) | 1.7.33 | 2.10.1 | [Changelog](https://github.com/traefik/traefik/blob/master/CHANGELOG.md) | Running in the `traefik` systemd service |
|
||||
| [traefik-proxy](https://github.com/jupyterhub/traefik-proxy) | 0.3.\* | >=1.1.0,<2 | [Changelog](https://jupyterhub-traefik-proxy.readthedocs.io/en/latest/changelog.html) | Run by jupyterhub, controls `traefik` |
|
||||
| [systemdspawner](https://github.com/jupyterhub/systemdspawner) | 0.16.\* | >=1.0.1,<2 | [Changelog](https://github.com/jupyterhub/systemdspawner/blob/master/CHANGELOG.md) | Run by jupyterhub, controls user servers via systemd |
|
||||
@@ -78,13 +69,13 @@ The changes in the respective environments between TLJH version 0.2.0 and
|
||||
| [firstuseauthenticator](https://github.com/jupyterhub/firstuseauthenticator) | 1.\* | >=1.0.0,<2 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
|
||||
| [tmpauthenticator](https://github.com/jupyterhub/tmpauthenticator) | 0.6.\* | >=1.0.0,<2 | [Changelog](https://github.com/jupyterhub/tmpauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
|
||||
| [nativeauthenticator](https://github.com/jupyterhub/nativeauthenticator) | 1.\* | >=1.2.0,<2 | [Changelog](https://github.com/jupyterhub/nativeauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
|
||||
| [oauthenticator](https://github.com/jupyterhub/oauthenticator) | 14.\* | >=16.0.2,<17 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
|
||||
| [oauthenticator](https://github.com/jupyterhub/oauthenticator) | 14.\* | >=16.0.4,<17 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
|
||||
| [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) | 1.\* | >=1.3.2,<2 | [Changelog](https://github.com/jupyterhub/ldapauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
|
||||
| [pip](https://github.com/pypa/pip) | 21.3.\* | >=23.1.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | - |
|
||||
|
||||
| Dependency changes in the _user environment_ | Version in 0.2.0 | Version in 1.0.0 | Changelog link | Note |
|
||||
| -------------------------------------------------------- | ---------------- | ---------------- | --------------------------------------------------------------------------------- | ------------------------ |
|
||||
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | 1.\* | >=4.0.1,<5 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Always upgraded. |
|
||||
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | 1.\* | >=4.0.2,<5 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Always upgraded. |
|
||||
| [pip](https://github.com/pypa/pip) | \* | >=23.1.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | Only upgraded if needed. |
|
||||
| [conda](https://docs.conda.io/projects/conda/en/stable/) | 0.16.0 | >=0.16.0 | [Changelog](https://docs.conda.io/projects/conda/en/stable/release-notes.html) | Only upgraded if needed. |
|
||||
| [mamba](https://mamba.readthedocs.io/en/latest/) | 4.10.3 | >=4.10.0 | [Changelog](https://github.com/mamba-org/mamba/blob/main/CHANGELOG.md) | Only upgraded if needed. |
|
||||
@@ -101,6 +92,8 @@ The changes in the respective environments between TLJH version 0.2.0 and
|
||||
|
||||
#### Maintenance and upkeep improvements
|
||||
|
||||
- Update Notebook, JupyterLab, Jupyter Resource Usage [#928](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/928) ([@jtpio](https://github.com/jtpio), [@consideRatio](https://github.com/consideRatio))
|
||||
- Launch into `/lab` by default by changing TLJH config's default value [#775](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/775) ([@raybellwaves](https://github.com/raybellwaves), [@consideRatio](https://github.com/consideRatio), [@GeorgianaElena](https://github.com/GeorgianaElena), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics))
|
||||
- breaking: update oauthenticator from 15.1.0 to >=16.0.2,<17, make tljh auth docs link out [#924](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/924) ([@consideRatio](https://github.com/consideRatio), [@manics](https://github.com/manics), [@minrk](https://github.com/minrk))
|
||||
- test refactor: add comment about python/conda/mamba [#921](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/921) ([@consideRatio](https://github.com/consideRatio))
|
||||
- --force-reinstall old conda to ensure it's working before we try to install conda packages [#920](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/920) ([@minrk](https://github.com/minrk), [@consideRatio](https://github.com/consideRatio))
|
||||
@@ -129,6 +122,8 @@ The changes in the respective environments between TLJH version 0.2.0 and
|
||||
|
||||
#### Documentation improvements
|
||||
|
||||
- docs: add docs about environments and upgrades [#932](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/932) ([@consideRatio](https://github.com/consideRatio), [@minrk](https://github.com/minrk))
|
||||
- Add `JupyterLab` setting overrides docs [#922](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/922) ([@jrdnbradford](https://github.com/jrdnbradford), [@consideRatio](https://github.com/consideRatio))
|
||||
- Quote `pwd` to prevent error if dir has spaces [#917](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/917) ([@jrdnbradford](https://github.com/jrdnbradford), [@consideRatio](https://github.com/consideRatio))
|
||||
- Google Cloud troubleshooting and configuration updates [#906](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/906) ([@jrdnbradford](https://github.com/jrdnbradford), [@consideRatio](https://github.com/consideRatio))
|
||||
- Add user env doc files [#902](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/902) ([@jrdnbradford](https://github.com/jrdnbradford), [@consideRatio](https://github.com/consideRatio))
|
||||
@@ -148,9 +143,9 @@ The changes in the respective environments between TLJH version 0.2.0 and
|
||||
The following people contributed discussions, new ideas, code and documentation contributions, and review.
|
||||
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports).
|
||||
|
||||
([GitHub contributors page for this release](https://github.com/jupyterhub/the-littlest-jupyterhub/graphs/contributors?from=2023-02-27&to=2023-06-09&type=c))
|
||||
([GitHub contributors page for this release](https://github.com/jupyterhub/the-littlest-jupyterhub/graphs/contributors?from=2023-02-27&to=2023-08-11&type=c))
|
||||
|
||||
@adonm ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aadonm+updated%3A2023-02-27..2023-06-09&type=Issues)) | @audiodude ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aaudiodude+updated%3A2023-02-27..2023-06-09&type=Issues)) | @consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AconsideRatio+updated%3A2023-02-27..2023-06-09&type=Issues)) | @eingemaischt ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aeingemaischt+updated%3A2023-02-27..2023-06-09&type=Issues)) | @GeorgianaElena ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AGeorgianaElena+updated%3A2023-02-27..2023-06-09&type=Issues)) | @Hannnsen ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AHannnsen+updated%3A2023-02-27..2023-06-09&type=Issues)) | @jawiv ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajawiv+updated%3A2023-02-27..2023-06-09&type=Issues)) | @jochym ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajochym+updated%3A2023-02-27..2023-06-09&type=Issues)) | @jrdnbradford ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajrdnbradford+updated%3A2023-02-27..2023-06-09&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Amanics+updated%3A2023-02-27..2023-06-09&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aminrk+updated%3A2023-02-27..2023-06-09&type=Issues)) | @MridulS ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AMridulS+updated%3A2023-02-27..2023-06-09&type=Issues)) | @nsurleraux-railnova ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ansurleraux-railnova+updated%3A2023-02-27..2023-06-09&type=Issues)) | @Rom1deTroyes ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3ARom1deTroyes+updated%3A2023-02-27..2023-06-09&type=Issues)) | @wjcapehart ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Awjcapehart+updated%3A2023-02-27..2023-06-09&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ayuvipanda+updated%3A2023-02-27..2023-06-09&type=Issues))
|
||||
@adonm ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aadonm+updated%3A2023-02-27..2023-08-11&type=Issues)) | @audiodude ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aaudiodude+updated%3A2023-02-27..2023-08-11&type=Issues)) | @choldgraf ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Acholdgraf+updated%3A2023-02-27..2023-08-11&type=Issues)) | @consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AconsideRatio+updated%3A2023-02-27..2023-08-11&type=Issues)) | @eingemaischt ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aeingemaischt+updated%3A2023-02-27..2023-08-11&type=Issues)) | @GeorgianaElena ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AGeorgianaElena+updated%3A2023-02-27..2023-08-11&type=Issues)) | @Hannnsen ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AHannnsen+updated%3A2023-02-27..2023-08-11&type=Issues)) | @jawiv ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajawiv+updated%3A2023-02-27..2023-08-11&type=Issues)) | @jochym ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajochym+updated%3A2023-02-27..2023-08-11&type=Issues)) | @jrdnbradford ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajrdnbradford+updated%3A2023-02-27..2023-08-11&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajtpio+updated%3A2023-02-27..2023-08-11&type=Issues)) | @kevmk04 ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Akevmk04+updated%3A2023-02-27..2023-08-11&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Amanics+updated%3A2023-02-27..2023-08-11&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aminrk+updated%3A2023-02-27..2023-08-11&type=Issues)) | @MridulS ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AMridulS+updated%3A2023-02-27..2023-08-11&type=Issues)) | @nsurleraux-railnova ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ansurleraux-railnova+updated%3A2023-02-27..2023-08-11&type=Issues)) | @raybellwaves ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Araybellwaves+updated%3A2023-02-27..2023-08-11&type=Issues)) | @Rom1deTroyes ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3ARom1deTroyes+updated%3A2023-02-27..2023-08-11&type=Issues)) | @wjcapehart ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Awjcapehart+updated%3A2023-02-27..2023-08-11&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ayuvipanda+updated%3A2023-02-27..2023-08-11&type=Issues))
|
||||
|
||||
## 0.2.0
|
||||
|
||||
|
||||
@@ -8,9 +8,11 @@ Topic guides provide in-depth explanations of specific topics.
|
||||
|
||||
whentouse
|
||||
requirements
|
||||
three-environments
|
||||
security
|
||||
customizing-installer
|
||||
installer-actions
|
||||
installer-upgrade-actions
|
||||
tljh-config
|
||||
authenticator-configuration
|
||||
escape-hatch
|
||||
|
||||
30
docs/topic/installer-upgrade-actions.md
Normal file
30
docs/topic/installer-upgrade-actions.md
Normal file
@@ -0,0 +1,30 @@
|
||||
(topic-installer-upgrade-actions)=
|
||||
|
||||
# What is done during an upgrade of TLJH?
|
||||
|
||||
Once TLJH has been installed, it should be possible to upgrade the installation.
|
||||
This documentation is meant to capture the changes made during an upgrade.
|
||||
|
||||
```{versionchanged} 1.0.0
|
||||
Ensuring upgrades work has only been done since 1.0.0 upgrading from version
|
||||
0.2.0.
|
||||
```
|
||||
|
||||
## Changes to the system environment
|
||||
|
||||
The [system environment](system-environment) is not meant to be influenced
|
||||
unless explicitly mentioned in the changelog, typically only during major
|
||||
version upgrades.
|
||||
|
||||
## Changes to the hub environment
|
||||
|
||||
The [hub environment](hub-environment) gets several packages upgraded based on
|
||||
version ranges specified in [tljh/requirements-hub-env.txt].
|
||||
|
||||
## Changes to the user environment
|
||||
|
||||
The [user environment](user-environment) gets is `jupyterhub` package upgraded,
|
||||
but no other packages gets upgraded unless explicitly mentioned in the
|
||||
changelog, typically only during major version upgrades.
|
||||
|
||||
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/HEAD/tljh/requirements-hub-env.txt
|
||||
76
docs/topic/three-environments.md
Normal file
76
docs/topic/three-environments.md
Normal file
@@ -0,0 +1,76 @@
|
||||
(topic-three-environments)=
|
||||
|
||||
# The system, hub, and user environments
|
||||
|
||||
TLJH's documentation mentions the _system environment_, the _hub environment_,
|
||||
and the _user environment_. This section will introduce what is meant with that
|
||||
and clarify the distinctions between the environments.
|
||||
|
||||
(system-environment)=
|
||||
|
||||
## The system environment
|
||||
|
||||
When this documentation mentions the _system environment_, it refers to the
|
||||
Linux environment with its installed `apt` packages, users in `/etc/passwd`,
|
||||
etc.
|
||||
|
||||
A part of the system environment is a Python environment setup via the `apt`
|
||||
package `python` installed by default in Linux distributions supported by TLJH.
|
||||
To be specific, we can refer to this as the _system's Python environment_.
|
||||
|
||||
If you would do `sudo python3 -m pip install <something>` you would end up
|
||||
installing something in the system's Python environment, and that would not be
|
||||
available in the hub environment or the user environment.
|
||||
|
||||
The system's Python environment is only used by TLJH to run the `bootstrap.py`
|
||||
script downloaded as part of installing or upgrading TLJH. This script is also
|
||||
responsible for setting up the hub environment.
|
||||
|
||||
(hub-environment)=
|
||||
|
||||
## The hub environment
|
||||
|
||||
The _hub environment_ is a [virtual Python environment] setup in `/opt/tljh/hub`
|
||||
by the `bootstrap.py` script using the system's Python environment during TLJH
|
||||
installation.
|
||||
|
||||
The hub environment has Python packages installed in it related to running
|
||||
JupyterHub itself such as an JupyterHub authenticator package, but it doesn't
|
||||
include packages to start user servers like JupyterLab.
|
||||
|
||||
When TLJH is installed/upgraded, the packages listed in
|
||||
[tljh/requirements-hub-env.txt] are installed/upgraded in this environment.
|
||||
|
||||
If you would do `sudo /opt/tljh/hub/bin/python3 -m pip install <something>` you
|
||||
would end up installing something in the hub environment, and that would not be
|
||||
available in the system's Python environment or the user environment.
|
||||
|
||||
[virtual Python environment]: https://docs.python.org/3/library/venv.html
|
||||
|
||||
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/HEAD/tljh/requirements-hub-env.txt
|
||||
|
||||
(user-environment)=
|
||||
|
||||
## The user environment
|
||||
|
||||
The _user environment_ is a Python environment setup in `/opt/tljh/user` by the
|
||||
TLJH installer during TLJH installation. The user environment is not a virtual
|
||||
environment because an entirely separate installation of Python has been made
|
||||
for it.
|
||||
|
||||
The user environment has packages installed in it related to running individual
|
||||
jupyter servers, such as `jupyterlab`.
|
||||
|
||||
When TLJH is _installed_, the packages listed in
|
||||
[tljh/requirements-user-env.txt] are installed in this environment. When TLJH is
|
||||
_upgraded_ though, as little as possible is done to this environment. Typically
|
||||
only `jupyterhub` is upgraded to match the version in the hub environment. If
|
||||
upgrading to a new major version of TLJH, then something small may be done
|
||||
besides this, and then it should be described the changelog.
|
||||
|
||||
If you would do `sudo /opt/tljh/user/bin/python3 -m pip install <something>`, or
|
||||
from a user server's terminal do `sudo -E pip install <something>` you would end
|
||||
up installing something in the user environment, and that would not be available
|
||||
in the system's Python environment or the hub environment.
|
||||
|
||||
[tljh/requirements-user-env-extras.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/HEAD/tljh/requirements-user-env-extras.txt
|
||||
@@ -1,3 +1,5 @@
|
||||
(troubleshooting)=
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
In time, all systems have issues that need to be debugged. Troubleshooting
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
|
||||
@@ -7,13 +8,13 @@ def test_serverextensions():
|
||||
"""
|
||||
# jupyter-serverextension writes to stdout and stderr weirdly
|
||||
proc = subprocess.run(
|
||||
["/opt/tljh/user/bin/jupyter-serverextension", "list", "--sys-prefix"],
|
||||
["/opt/tljh/user/bin/jupyter-server", "extension", "list", "--sys-prefix"],
|
||||
stderr=subprocess.PIPE,
|
||||
)
|
||||
|
||||
extensions = [
|
||||
"jupyterlab 3.",
|
||||
"nbgitpuller 1.",
|
||||
"jupyterlab",
|
||||
"nbgitpuller",
|
||||
"jupyter_resource_usage",
|
||||
]
|
||||
|
||||
@@ -21,27 +22,26 @@ def test_serverextensions():
|
||||
assert e in proc.stderr.decode()
|
||||
|
||||
|
||||
def test_nbextensions():
|
||||
def test_labextensions():
|
||||
"""
|
||||
Validate nbextensions we want are installed & enabled
|
||||
Validate JupyterLab extensions we want are installed & enabled
|
||||
"""
|
||||
# jupyter-nbextension writes to stdout and stderr weirdly
|
||||
# jupyter-labextension writes to stdout and stderr weirdly
|
||||
proc = subprocess.run(
|
||||
["/opt/tljh/user/bin/jupyter-nbextension", "list", "--sys-prefix"],
|
||||
["/opt/tljh/user/bin/jupyter-labextension", "list"],
|
||||
stderr=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
)
|
||||
|
||||
extensions = [
|
||||
"jupyter_resource_usage/main",
|
||||
# This is what ipywidgets nbextension is called
|
||||
"jupyter-js-widgets/extension",
|
||||
"@jupyter-server/resource-usage",
|
||||
# This is what ipywidgets lab extension is called
|
||||
"@jupyter-widgets/jupyterlab-manager",
|
||||
]
|
||||
|
||||
for e in extensions:
|
||||
assert f"{e} \x1b[32m enabled \x1b[0m" in proc.stdout.decode()
|
||||
|
||||
# Ensure we have 'OK' messages in our stdout, to make sure everything is importable
|
||||
assert proc.stderr.decode() == " - Validating: \x1b[32mOK\x1b[0m\n" * len(
|
||||
extensions
|
||||
)
|
||||
# jupyter labextension lists outputs to stderr
|
||||
out = proc.stderr.decode()
|
||||
enabled_ok_pattern = re.compile(rf"{e}.*enabled.*OK")
|
||||
matches = enabled_ok_pattern.search(out)
|
||||
assert matches is not None
|
||||
|
||||
@@ -67,7 +67,7 @@ omit = [
|
||||
github_url = "https://github.com/jupyterhub/the-littlest-jupyterhub"
|
||||
|
||||
[tool.tbump.version]
|
||||
current = "1.0.0b1"
|
||||
current = "1.0.0"
|
||||
regex = '''
|
||||
(?P<major>\d+)
|
||||
\.
|
||||
|
||||
2
setup.py
2
setup.py
@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
|
||||
|
||||
setup(
|
||||
name="the-littlest-jupyterhub",
|
||||
version="1.0.0b1",
|
||||
version="1.0.0",
|
||||
description="A small JupyterHub distribution",
|
||||
url="https://github.com/jupyterhub/the-littlest-jupyterhub",
|
||||
author="Jupyter Development Team",
|
||||
|
||||
@@ -58,18 +58,17 @@ def test_app_default():
|
||||
Test default application with no config overrides.
|
||||
"""
|
||||
c = apply_mock_config({})
|
||||
# default_url is not set, so JupyterHub will pick default.
|
||||
assert "default_url" not in c.Spawner
|
||||
|
||||
|
||||
def test_app_jupyterlab():
|
||||
"""
|
||||
Test setting JupyterLab as default application
|
||||
"""
|
||||
c = apply_mock_config({"user_environment": {"default_app": "jupyterlab"}})
|
||||
assert c.Spawner.default_url == "/lab"
|
||||
|
||||
|
||||
def test_app_classic():
|
||||
"""
|
||||
Test setting classic as default application
|
||||
"""
|
||||
c = apply_mock_config({"user_environment": {"default_app": "classic"}})
|
||||
assert c.Spawner.default_url == "/tree"
|
||||
|
||||
|
||||
def test_auth_default():
|
||||
"""
|
||||
Test default authentication settings with no overrides
|
||||
|
||||
@@ -52,7 +52,7 @@ default = {
|
||||
"password": "",
|
||||
},
|
||||
"user_environment": {
|
||||
"default_app": "classic",
|
||||
"default_app": "jupyterlab",
|
||||
},
|
||||
"services": {
|
||||
"cull": {
|
||||
@@ -231,6 +231,8 @@ def update_user_environment(c, config):
|
||||
# Set default application users are launched into
|
||||
if user_env["default_app"] == "jupyterlab":
|
||||
c.Spawner.default_url = "/lab"
|
||||
elif user_env["default_app"] == "classic":
|
||||
c.Spawner.default_url = "/tree"
|
||||
|
||||
|
||||
def update_user_account_config(c, config):
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
# If a dependency is bumped to a new major version, we should make a major
|
||||
# version release of tljh.
|
||||
#
|
||||
jupyterhub>=4.0.1,<5
|
||||
jupyterhub>=4.0.2,<5
|
||||
jupyterhub-systemdspawner>=1.0.1,<2
|
||||
jupyterhub-firstuseauthenticator>=1.0.0,<2
|
||||
jupyterhub-nativeauthenticator>=1.2.0,<2
|
||||
jupyterhub-ldapauthenticator>=1.3.2,<2
|
||||
jupyterhub-tmpauthenticator>=1.0.0,<2
|
||||
oauthenticator>=16.0.2,<17
|
||||
oauthenticator>=16.0.4,<17
|
||||
jupyterhub-idle-culler>=1.2.1,<2
|
||||
|
||||
# pycurl is installed to improve reliability and performance for when JupyterHub
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
# the requirements-txt-fixer pre-commit hook that sorted them and made
|
||||
# our integration tests fail.
|
||||
#
|
||||
notebook==6.*
|
||||
jupyterlab==3.*
|
||||
notebook==7.*
|
||||
jupyterlab==4.*
|
||||
# nbgitpuller for easily pulling in Git repositories
|
||||
nbgitpuller==1.*
|
||||
# jupyter-resource-usage to show people how much RAM they are using
|
||||
jupyter-resource-usage==0.7.*
|
||||
jupyter-resource-usage==1.*
|
||||
# Most people consider ipywidgets to be part of the core notebook experience
|
||||
ipywidgets==8.*
|
||||
|
||||
Reference in New Issue
Block a user