99 Commits

Author SHA1 Message Date
Raniere Silva
8963e62044 Merge pull request #1055 from rgaiacs/1054-avoid-white-space
Enclose ${PATH} in double-quotes
2025-12-08 15:43:10 +01:00
Raniere Gaia Costa da Silva
daec71b149 Enclose ${PATH} in double-quotes
to avoid problems with white space.

Closes https://github.com/jupyterhub/the-littlest-jupyterhub/issues/1054
2025-12-08 15:42:00 +01:00
Min RK
e17af65b38 Merge pull request #1051 from jupyterhub/dependabot/github_actions/actions/checkout-6
Bump actions/checkout from 5 to 6
2025-12-02 11:46:42 -08:00
dependabot[bot]
5c2d688937 Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 05:05:10 +00:00
Simon Li
1df02de795 Merge pull request #1050 from jasongrout/plausible
Add plausible stats tracking, consolidated with jupyter.org stats
2025-11-18 12:02:59 +00:00
pre-commit-ci[bot]
181aa975f5 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-11-17 19:01:13 +00:00
Jason Grout
243fcf7be0 Add plausible stats tracking, consolidated with jupyter.org stats
This PR is similar to https://github.com/jupyter/jupyter/pull/797
2025-11-17 11:59:37 -07:00
Min RK
8b55d5f5bc Merge pull request #1038 from zonca/update-jetstream-docs
Update jetstream docs
2025-11-04 11:42:37 -08:00
Min RK
c9d971b239 Merge pull request #1049 from jupyterhub/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-11-04 11:35:20 -08:00
pre-commit-ci[bot]
a047de1e79 [pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/pyupgrade: v3.20.0 → v3.21.0](https://github.com/asottile/pyupgrade/compare/v3.20.0...v3.21.0)
- [github.com/pycqa/isort: 6.1.0 → 7.0.0](https://github.com/pycqa/isort/compare/6.1.0...7.0.0)
2025-11-03 21:11:40 +00:00
Yuvi
96550b678a Merge pull request #1048 from teward/patch-1
Update systemd.md with clearer override instructions
2025-10-26 12:21:28 -07:00
pre-commit-ci[bot]
1bbbeacc06 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-10-19 04:38:21 +00:00
Thomas Ward
d906fe8c5d Update systemd.md with clearer override instructions
Clarify instructions for overriding traefik settings.

SystemD has inbuilt ways to *create* the override files without users having to create the files themselves.

To that end, just using `sudo systemctl edit [SERVICENAME].service` will work to create the service's override files.
2025-10-19 00:38:00 -04:00
Andrea Zonca
79adc7de2a add the last of @julianpistorious fixes 2025-10-15 13:12:28 -07:00
Min RK
27cf17d68c Merge pull request #1041 from jrdnbradford/fixme-req-url
Installer `FIXME`: Only warn on failed install from requirements url
2025-10-07 12:02:54 -07:00
Min RK
ca25444915 Merge pull request #1040 from jrdnbradford/testing-updates
Local integration testing updates
2025-10-07 12:02:06 -07:00
Min RK
5415cc471a Merge pull request #1045 from jrdnbradford/remove-tests
Remove deprecated tests due to image changes
2025-10-07 11:25:28 -07:00
Min RK
5891f0456b Merge pull request #1046 from jupyterhub/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-10-07 11:25:02 -07:00
Min RK
36efbc52f8 Merge pull request #1047 from jrdnbradford/pycurl-whl
Use `pycurl` `.whl` for hub environment
2025-10-07 11:24:50 -07:00
Jordan Bradford
dbcaf22ae0 Use pycurl .whl 2025-10-07 12:27:18 -04:00
pre-commit-ci[bot]
74b863ce22 [pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pycqa/isort: 6.0.1 → 6.1.0](https://github.com/pycqa/isort/compare/6.0.1...6.1.0)
- https://github.com/psf/blackhttps://github.com/psf/black-pre-commit-mirror
- [github.com/psf/black-pre-commit-mirror: 25.1.0 → 25.9.0](https://github.com/psf/black-pre-commit-mirror/compare/25.1.0...25.9.0)
2025-10-06 21:54:59 +00:00
Jordan Bradford
0b1da67264 Add curl for codecov-action 2025-10-05 20:28:10 -04:00
Jordan Bradford
9802473764 Remove old miniconda test 2025-10-05 20:14:40 -04:00
Jordan Bradford
9d8c66467c Remove 0.2.0 upgrade test 2025-10-05 20:14:09 -04:00
Erik Sundell
c9efb93278 Merge pull request #1042 from jupyterhub/dependabot/github_actions/actions/setup-python-6
Bump actions/setup-python from 5 to 6
2025-10-01 08:15:40 +02:00
dependabot[bot]
596984ccbd Bump actions/setup-python from 5 to 6
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 06:08:59 +00:00
Erik Sundell
a2e80cc89d Merge pull request #1043 from jupyterhub/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-10-01 08:07:37 +02:00
dependabot[bot]
f49c59898a Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 05:01:32 +00:00
Jordan Bradford
fb1e1063d2 Revert doc change 2025-09-30 23:01:03 -04:00
Jordan Bradford
939c2b37fd Fix mising link 2025-09-29 20:41:39 -04:00
Jordan Bradford
da5a5abafa Only warn on failed install from requirements url 2025-09-28 14:18:51 -04:00
Jordan Bradford
784e237831 Update test docs 2025-09-27 22:11:32 -04:00
Jordan Bradford
50a74417f6 Update run-test args 2025-09-27 22:07:47 -04:00
Andrea Zonca
72967f2b17 Document how to reveal exouser passphrase in Exosphere 2025-09-23 22:21:09 -07:00
Andrea Zonca
6b2d93aacf Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:09:31 -07:00
pre-commit-ci[bot]
752f605c53 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-09-24 05:07:44 +00:00
Andrea Zonca
0cd259b6a1 Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:07:42 -07:00
Andrea Zonca
684481fd5d Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:07:32 -07:00
Andrea Zonca
c639c75637 Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:07:20 -07:00
Andrea Zonca
45bec8e9f8 Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:07:13 -07:00
Andrea Zonca
519415395f Apply suggestion from @julianpistorius
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:06:52 -07:00
pre-commit-ci[bot]
c3703985ee [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-09-24 05:05:30 +00:00
Andrea Zonca
e6851d946d Apply suggestions from code review
Co-authored-by: Julian Pistorius <github@soulsick.net>
2025-09-23 22:05:19 -07:00
Min RK
f13aef7568 Merge pull request #1011 from jupyterhub/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-09-04 14:13:54 -07:00
pre-commit-ci[bot]
354a8d47cc [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-09-01 20:46:41 +00:00
pre-commit-ci[bot]
4263e4c85e [pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/pyupgrade: v3.17.0 → v3.20.0](https://github.com/asottile/pyupgrade/compare/v3.17.0...v3.20.0)
- [github.com/pycqa/isort: 5.13.2 → 6.0.1](https://github.com/pycqa/isort/compare/5.13.2...6.0.1)
- [github.com/psf/black: 24.8.0 → 25.1.0](https://github.com/psf/black/compare/24.8.0...25.1.0)
- [github.com/pre-commit/pre-commit-hooks: v4.6.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.6.0...v6.0.0)
- [github.com/pycqa/flake8: 7.1.1 → 7.3.0](https://github.com/pycqa/flake8/compare/7.1.1...7.3.0)
2025-09-01 20:44:35 +00:00
pre-commit-ci[bot]
4807b7da89 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-08-27 00:18:19 +00:00
Andrea Zonca
ae503c3096 Clarify instructions for running the TLJH bootstrap script in the Jetstream installation guide 2025-08-26 17:17:58 -07:00
pre-commit-ci[bot]
512935abb7 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-08-27 00:14:45 +00:00
Andrea Zonca
a4858da978 Update Jetstream tutorial 2025-08-26 17:12:01 -07:00
Yuvi
134ddd9ef6 Merge pull request #1035 from paololazzari/patch-1
Fix default settings for culler instructions
2025-08-15 09:49:37 -07:00
Paolo
7e929fb78c Fix default settings for culler 2025-05-15 11:30:19 +02:00
Sarah Gibson
3eeb028f1f Merge pull request #1026 from jrdnbradford/schema-unittests
`tljh-config` JSON schema unit tests
2025-04-17 13:39:57 +01:00
Sarah Gibson
0384a46720 Merge pull request #1031 from GeorgianaElena/rm-old-ubuntu
Remove unit tests against Ubuntu 20.04 and Python 3.9
2025-04-17 12:50:30 +01:00
pre-commit-ci[bot]
142d22616c [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-04-16 17:30:33 +00:00
Jordan Bradford
5ff2c8aa6f Simplify testing of schema 2025-04-16 13:30:14 -04:00
Georgiana Dolocan
bba39bdfde Rm test with old Ubuntu and Python version 2025-04-16 20:05:37 +03:00
Sarah Gibson
c1134a5341 Merge pull request #1025 from jrdnbradford/integration-test-extensions
Fix `test_serverextensions` integration test
2025-04-16 17:51:36 +01:00
Sarah Gibson
989f772872 Merge pull request #1030 from jnywong/update-docs
Remove references to tls.domain config
2025-04-16 17:44:47 +01:00
Jordan Bradford
d5752b6c76 decode instead of capture_text 2025-04-15 13:15:24 -04:00
jnywong
dcdf2dc9b4 Remove references to tls.domain config 2025-04-15 15:51:27 +01:00
Jordan Bradford
251099caac Remove tls tests 2025-03-11 14:42:22 -04:00
Jordan Bradford
fa83068cdb Remove required properties for TLS 2025-03-11 14:38:26 -04:00
Jordan Bradford
3ee67e1581 Add test file for config validation 2025-03-11 14:13:28 -04:00
Jordan Bradford
a1f1c5e046 Remove FIXME 2025-03-11 14:12:40 -04:00
Jordan Bradford
8e318586c3 Make cert and key required for TLS 2025-03-11 14:12:09 -04:00
Jordan Bradford
a099bf647d Capture text output 2025-03-07 16:41:09 -05:00
Yuvi Panda
8cb42a9fc1 Merge pull request #1022 from manics/readme-ubuntu
Fix Ubuntu version in README
2025-02-18 10:38:31 -08:00
Simon Li
29dda40b33 Fix Ubuntu version in README 2025-02-14 16:24:30 +00:00
Min RK
4b066766d9 Merge pull request #1015 from yuvipanda/local-dev
Set development env vars in dev documentation correctly
2024-12-10 10:49:22 +01:00
Min RK
947eb028a9 Merge pull request #1016 from yuvipanda/classi
Link what 'jupyterlab' and 'classic' link to
2024-12-09 10:40:37 +01:00
YuviPanda
d695d29a6d Link what 'jupyterlab' and 'classic' link to 2024-12-08 19:31:41 -08:00
YuviPanda
53eceabd11 Set development env vars in dev documentation correctly
Without this, the current dev setup documentation does not
work.
2024-12-08 19:23:21 -08:00
Min RK
0f7d4f4748 Merge pull request #1014 from jupyterhub/dependabot/github_actions/codecov/codecov-action-5
Bump codecov/codecov-action from 4 to 5
2024-12-02 08:57:30 +01:00
dependabot[bot]
0907ca4ad4 Bump codecov/codecov-action from 4 to 5
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 05:16:04 +00:00
Min RK
3397e75dc5 Merge pull request #1013 from jrdnbradford/fix-cpu-schema
Fix `cpu` and `memory` config validation in JSON schema
2024-11-15 08:26:36 +01:00
Jordan Bradford
cd53b41b49 Also allow None for memory 2024-11-14 23:17:32 -05:00
Jordan Bradford
5916407a50 Update tljh/config_schema.py
Co-authored-by: Min RK <benjaminrk@gmail.com>
2024-11-14 23:14:17 -05:00
Jordan Bradford
e515bcad26 Fix None config test 2024-11-14 22:56:43 -05:00
Jordan Bradford
5a9cb2b395 Update tljh-config --help 2024-11-14 22:51:43 -05:00
Jordan Bradford
9ed2a92585 Parse None 2024-11-14 22:51:15 -05:00
Jordan Bradford
e7555ae29c Remove integer 2024-11-14 15:01:57 -05:00
Jordan Bradford
73331f28fd Use anyOf 2024-11-14 12:07:35 -05:00
Jordan Bradford
6531b6b7aa Update cpu types 2024-11-14 11:49:54 -05:00
Erik Sundell
c0563ab573 Bump to 2.0.1.dev 2024-10-21 10:26:00 +02:00
Erik Sundell
a47a171850 Bump to 2.0.0 2024-10-21 10:25:07 +02:00
Erik Sundell
04e2568fb3 Merge pull request #1010 from consideRatio/pr/cl200
Add changelog for 2.0.0
2024-10-21 10:24:18 +02:00
Erik Sundell
145d58f86e Add changelog for 2.0.0 2024-10-20 21:22:24 +02:00
Erik Sundell
3ebdbe1d83 Merge pull request #1009 from consideRatio/pr/betastate
Remove mention about beta state
2024-10-20 21:05:00 +02:00
Erik Sundell
f573525bf0 Remove mention about beta state 2024-10-20 21:01:28 +02:00
Erik Sundell
0370b57b32 Merge pull request #1008 from consideRatio/pr/unpin-jh
Update jupyterhub pinning to >=5.2.0,<6 from ==5.1.0
2024-10-20 15:49:33 +02:00
Erik Sundell
cbe577e596 Update systemdspawner pinning to >=1.0.2,<2 from >=1.0.1,<2 2024-10-20 14:53:50 +02:00
Erik Sundell
64790b4c95 Update jupyterhub pinning to >=5.2.0,<6 from ==5.1.0 2024-10-20 10:32:17 +02:00
Min RK
d2b0fd2c6c Merge pull request #1006 from consideRatio/pr/pycurl 2024-10-19 11:57:39 +02:00
Erik Sundell
e581232920 hub env: avoid installing pycurl using wheel with an issue 2024-10-18 23:10:01 +02:00
Erik Sundell
7514616e23 Merge pull request #1007 from consideRatio/pr/pin-jh
hub env: pin to jupyterhub 5.1.0
2024-10-18 23:07:47 +02:00
Erik Sundell
06d4670512 hub env: pin to jupyterhub 5.1.0 2024-10-18 22:51:31 +02:00
Erik Sundell
f4538ab06b Merge pull request #1004 from consideRatio/pr/lower-bound-user-env
hub env: bump to ldapauthenticator 2.0.0 and other lower bounds
2024-10-18 22:38:45 +02:00
Erik Sundell
bb17a1b980 hub env: bump to ldapauthenticator 2.0.0 and other lower bounds 2024-10-18 22:37:23 +02:00
35 changed files with 268 additions and 268 deletions

View File

@@ -226,12 +226,35 @@ def main():
copy_parser.add_argument("src")
copy_parser.add_argument("dest")
run_test_parser = subparsers.add_parser("run-test")
run_test_parser.add_argument("--installer-args", action="append")
run_test_parser.add_argument("--upgrade-from", default="")
run_test_parser.add_argument("--bootstrap-pip-spec", default="/srv/src")
run_test_parser.add_argument("container_name")
run_test_parser.add_argument("test_files", nargs="+")
run_test_parser = subparsers.add_parser(
"run-test",
help="Runs the bootstrap script in a container, then executes specified integration tests.",
)
run_test_parser.add_argument(
"--installer-args",
action="append",
default=[],
help="Additional arguments to pass to bootstrap.py during the main installation. Can be used multiple times.",
)
run_test_parser.add_argument(
"--upgrade-from",
default="",
help="A version/tag (e.g., 'main', 'v0.1.0') to install first, simulating an upgrade to the current source code.",
)
run_test_parser.add_argument(
"--bootstrap-pip-spec",
default="/srv/src",
help="The pip specification used by the bootstrap script to install TLJH (for example: '--bootstrap-pip-spec=git+https://github.com/your-username/the-littlest-jupyterhub.git@branch-name'). Defaults to the local source code path.",
)
run_test_parser.add_argument(
"container_name",
help="An identifier for the container/test run (for example: 'basic-tests').",
)
run_test_parser.add_argument(
"test_files",
nargs="+",
help="A list of one or more test files under 'integration-tests/' to be executed.",
)
show_logs_parser = subparsers.add_parser("show-logs")
show_logs_parser.add_argument("container_name")

View File

@@ -51,16 +51,13 @@ jobs:
- name: "Ubuntu 22.04, Py 3.10, from latest"
distro_image: "ubuntu:22.04"
extra_flags: --upgrade-from=latest
- name: "Ubuntu 22.04, Py 3.10, from 0.2.0"
distro_image: "ubuntu:22.04"
extra_flags: --upgrade-from=0.2.0
- name: "Ubuntu 22.04, Py 3.10, from 1.*"
distro_image: "ubuntu:22.04"
extra_flags: --upgrade-from=1
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.10"
@@ -122,8 +119,8 @@ jobs:
distro_image: "ubuntu:22.04"
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.10"
cache: pip

View File

@@ -40,9 +40,6 @@ jobs:
fail-fast: false
matrix:
include:
- name: "Ubuntu 20.04, Py 3.9"
ubuntu_version: "20.04"
python_version: "3.9"
- name: "Ubuntu 22.04, Py 3.10"
ubuntu_version: "22.04"
python_version: "3.10"
@@ -51,12 +48,12 @@ jobs:
python_version: "3.12"
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "${{ matrix.python_version }}"
- name: Install venv, git, pip and setup venv
- name: Install system dependencies and setup venv
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
@@ -64,7 +61,8 @@ jobs:
python3-venv \
python3-pip \
bzip2 \
git
git \
curl
python3 -m venv /srv/venv
echo '/srv/venv/bin' >> $GITHUB_PATH
@@ -82,4 +80,4 @@ jobs:
run: pytest tests
timeout-minutes: 15
- uses: codecov/codecov-action@v4
- uses: codecov/codecov-action@v5

View File

@@ -11,7 +11,7 @@
repos:
# Autoformat: Python code, syntax patterns are modernized
- repo: https://github.com/asottile/pyupgrade
rev: v3.17.0
rev: v3.21.0
hooks:
- id: pyupgrade
args:
@@ -31,13 +31,13 @@ repos:
# Autoformat: Python code
- repo: https://github.com/pycqa/isort
rev: 5.13.2
rev: 7.0.0
hooks:
- id: isort
# Autoformat: Python code
- repo: https://github.com/psf/black
rev: 24.8.0
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 25.9.0
hooks:
- id: black
@@ -49,7 +49,7 @@ repos:
# Misc...
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
rev: v6.0.0
# ref: https://github.com/pre-commit/pre-commit-hooks#hooks-available
hooks:
# Autoformat: Makes sure files end in a newline and only a newline.
@@ -64,7 +64,7 @@ repos:
# Lint: Python code
- repo: https://github.com/pycqa/flake8
rev: "7.1.1"
rev: "7.3.0"
hooks:
- id: flake8

View File

@@ -27,22 +27,15 @@ for information on the different ways of contributing to The Littlest JupyterHub
See [this blog post](http://words.yuvi.in/post/the-littlest-jupyterhub/) for
more information.
## Development Status
This project is currently in **beta** state. Folks have been using installations
of TLJH for more than a year now to great success. While we try hard not to, we
might still make breaking changes that have no clear upgrade pathway.
## Installation
The Littlest JupyterHub (TLJH) can run on any server that is running at least
**Ubuntu 20.04**. Earlier versions of Ubuntu are not supported.
**Ubuntu 22.04**. Earlier versions of Ubuntu are not supported.
We have several tutorials to get you started.
- Tutorials to create a new server from scratch on a cloud provider & run TLJH
on it. These are **recommended** if you do not have much experience setting up
servers.
- [Digital Ocean](https://the-littlest-jupyterhub.readthedocs.io/en/latest/install/digitalocean.html)
- [OVH](https://the-littlest-jupyterhub.readthedocs.io/en/latest/install/ovh.html)
- [Google Cloud](https://the-littlest-jupyterhub.readthedocs.io/en/latest/install/google.html)

View File

@@ -138,3 +138,14 @@ rediraffe_redirects = {
"howto/env/notebook-interfaces": "howto/user-env/notebook-interfaces",
"howto/env/server-resources": "howto/user-env/server-resources",
}
def setup(app):
# Enable Plausible.io stats
app.add_js_file(
"https://plausible.io/js/pa-B75UO5--FNXYQSG7GBWkf.js", loading_method="async"
)
app.add_js_file(
filename=None,
body="window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};plausible.init({hashBasedRouting:true})",
)

View File

@@ -24,6 +24,9 @@ The easiest & safest way to develop & test TLJH is with [Docker](https://www.doc
--detach \
--name=tljh-dev \
--publish 12000:80 \
--env TLJH_BOOTSTRAP_DEV=yes \
--env TLJH_BOOTSTRAP_PIP_SPEC=/srv/src \
--env "PATH=/opt/tljh/hub/bin:${PATH}" \
--mount type=bind,source="$(pwd)",target=/srv/src \
tljh-systemd
```
@@ -58,7 +61,6 @@ The easiest & safest way to develop & test TLJH is with [Docker](https://www.doc
8. Make some changes to the repository. You can test easily depending on what
you changed.
- If you changed the `bootstrap/bootstrap.py` script or any of its dependencies,
you can test it by running `python3 /srv/src/bootstrap/bootstrap.py`.
- If you changed the `tljh/installer.py` code (or any of its dependencies),

View File

@@ -28,35 +28,43 @@ against the same installation of TLJH.
### Running integration tests locally
You need `docker` installed and callable by the user running
the integration tests without needing sudo.
You need `docker` or `podman` installed and callable by the user
running the integration tests without needing sudo.
You can then run the tests with:
First build the container with a Ubuntu-based image:
```bash
.github/integration-test.py run-test <name-of-run> <test-file-names>
.github/integration-test.py build-image \
--build-arg "BASE_IMAGE=ubuntu:22.04"
```
- `<name-of-run>` is an identifier for the tests - you can choose anything you want
- `<test-file-names>>` is list of test files (under `integration-tests`) that should be run in one go.
Then you can then run the tests with the `run-test` function. For usage run:
```bash
.github/integration-test.py run-test --help
```
For example, to run all the basic tests, you would write:
```bash
.github/integration-test.py run-test basic-tests \
test_hub.py \
test_proxy.py \
test_install.py \
test_extensions.py
test_hub.py \
test_proxy.py \
test_install.py \
test_extensions.py
```
This will run the tests in the three files against the same installation
This will run the tests in the four files against the same installation
of TLJH and report errors.
If you would like to run the tests with a custom pip spec for the bootstrap script, you can use the `--bootstrap-pip-spec`
If you would like to run the tests with a custom `pip` spec for the bootstrap script, you can use the `--bootstrap-pip-spec`
parameter:
```bash
.github/integration-test.py run-test <name-of-run> <test-file-names> \
--bootstrap-pip-spec="git+https://github.com/your-username/the-littlest-jupyterhub.git@branch-name"
.github/integration-test.py run-test custom-pip-spec \
test_hub.py \
test_proxy.py \
test_install.py \
test_extensions.py \
--bootstrap-pip-spec="git+https://github.com/your-username/the-littlest-jupyterhub.git@branch-name"
```

View File

@@ -82,14 +82,13 @@ renew them for you before they expire.
## Manual HTTPS with existing key and certificate
You may already have an SSL key and certificate.
You may already have an SSL key and certificate for your domain.
If so, you can tell your deployment to use these files:
```
sudo tljh-config set https.enabled true
sudo tljh-config set https.tls.key /etc/mycerts/mydomain.key
sudo tljh-config set https.tls.cert /etc/mycerts/mydomain.cert
sudo tljh-config add-item https.tls.domains yourhub.yourdomain.edu
```
Once you have loaded this, your config should look like:
@@ -104,8 +103,6 @@ https:
tls:
key: /etc/mycerts/mydomain.key
cert: /etc/mycerts/mydomain.cert
domains:
- yourhub.yourdomain.edu
```
Finally, you can reload the proxy to load the new configuration:
@@ -114,7 +111,7 @@ Finally, you can reload the proxy to load the new configuration:
sudo tljh-config reload proxy
```
and now access your Hub securely at <https://yourhub.yourdomain.edu>.
and now access your Hub securely at the domain associated with your certificate.
## Troubleshooting

View File

@@ -38,6 +38,8 @@ these namespacing settings might be a bit too strict and prevent users from acce
To override the `jupyterhub` settings, it is possible to provide a custom `/etc/systemd/system/jupyterhub.service.d/override.conf` file.
You can create this file with `sudo systemctl edit jupyterhub.service`
Here is an example for the content of the file:
```bash
@@ -72,7 +74,7 @@ The output should look like the following:
```
To override the `traefik` settings, create a new file under `/etc/systemd/system/traefik.service.d/override.conf`
and follow the same steps.
(or use `sudo systemctl edit traefik.service`) and follow the same steps.
## References

View File

@@ -24,7 +24,6 @@ application to your `tljh` configuration.
1. Create a user pool [Getting Started with User Pool](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-cognito-user-pools.html).
When you have completed creating a user pool, app, and domain you should have the following settings available to you:
- **App client id**: From the App client page
- **App client secret** From the App client page

View File

@@ -26,7 +26,6 @@ You'll need a GitHub account in order to complete these steps.
## Step 1: Create a GitHub application
1. Go to the [GitHub OAuth app creation page](https://github.com/settings/applications/new).
- **Application name**: Choose a descriptive application name (e.g. `tljh`)
- **Homepage URL**: Use the IP address or URL of your JupyterHub. e.g. `` http(s)://<my-tljh-url>` ``.

View File

@@ -51,7 +51,6 @@ and create a new project:
```
- You will have to fill a form with:
- **Application type**: Choose _Web application_
- **Name**: A descriptive name for your OAuth client ID (e.g. `tljh-client`)

View File

@@ -7,7 +7,8 @@ be changed with TLJH config `user_environment.default_app` or with the
JupyterHub config
{external:py:attr}`jupyterhub.spawner.Spawner.default_url` directly.
The TLJH config supports the options `jupyterlab` and `classic`, which
The TLJH config supports the options [`jupyterlab`](https://github.com/jupyterlab/jupyterlab/)
and [`classic`](https://github.com/jupyter/notebook), 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

View File

@@ -180,7 +180,6 @@ To upgrade the Python version of the user environment, one can:
environment, but you may do so manually.
**Steps:**
1. Activate the user environment, if using ssh. If the terminal was
started with JupyterHub, this step can be skipped:

View File

@@ -4,12 +4,6 @@ A simple [JupyterHub](https://github.com/jupyterhub/jupyterhub) distribution for
a small (0-100) number of users on a single server. We recommend reading
[](/topic/whentouse) to determine if this is the right tool for you.
## Development Status
This project is currently in **beta** state. Folks have been using installations
of TLJH for more than a year now to great success. While we try hard not to, we
might still make breaking changes that have no clear upgrade pathway.
## Installation
The Littlest JupyterHub (TLJH) can run on any server that is running **Debian 11** or **Ubuntu 20.04** or **22.04** on an amd64 or arm64 CPU architecture.

View File

@@ -51,7 +51,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
```
5. **Choose an Ubuntu server for your VM**:
- Click `Ubuntu Server 22.04 LTS.`
- Make sure `Resource Manager` is selected in the next screen and click **Create**
@@ -61,7 +60,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
```
6. Customise the Virtual Machine basics:
- **Subscription**. Choose the "Free Trial" if this is what you're using. Otherwise, choose a different plan. This is the billing account that will be charged.
- **Resource group**. Resource groups let you keep your Azure tools/resources together in an availability region (e.g. WestEurope). If you already have one you'd like to use it select that resource.
@@ -89,7 +87,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
- **Inbound port rules**. Leave the defaults for now, and we will update these later on in the Network configuration step.
7. Before clicking on "Next" we need to select the RAM size for the image.
- For this we need to make sure we have enough RAM to accommodate your users. For example, if each user needs 2GB of RAM, and you have 10 total users, you need at least 20GB of RAM on the machine. It's also good to have a few GB of "buffer" RAM beyond what you think you'll need.
- Click on **Change size** (see image below)
@@ -105,7 +102,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
- Select a suitable image (to check available images and prices in your region [click on this link](https://azuremarketplace.microsoft.com/en-gb/marketplace/apps/Canonical.UbuntuServer?tab=PlansAndPrice/?wt.mc_id=TLJH-github-taallard)).
8. Disks (Storage):
- **Disk options**: select the OS disk type there are options for SDD and HDD. **SSD persistent disk** gives you a faster but more expensive disk than HDD.
- **Data disk**. Click on create and attach a new disk. Select an appropriate type and size and click ok.
@@ -120,7 +116,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
```
9. Networking
- **Virtual network**. Leave the default values selected.
- **Subnet**. Leave the default values selected.
- **Public IP address**.Leave the default values selected. This will make your server accessible from a browser.
@@ -132,9 +127,7 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
```
10. Management
- Monitoring
- **Boot diagnostics**. Choose "On".
- **OS guest diagnostics**. Choose "Off".
- **Diagnostics storage account**. Leave as the default.
@@ -150,7 +143,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
```
11. Advanced settings
- **Extensions**. Make sure there are no extensions listed
- **Cloud init**. We are going to use this section to install TLJH directly into our Virtual Machine.
@@ -177,7 +169,6 @@ We start by creating the Virtual Machine in which we can run TLJH (The Littlest
12. Check the summary and confirm the creation of your Virtual Machine.
13. Check that the creation of your Virtual Machine worked.
- Wait for the virtual machine to be created. This might take about 5-10 minutes.
- After completion, you should see a similar screen to the one below:

View File

@@ -1,152 +1,112 @@
(install-jetstream)=
# Installing on Jetstream
# Installing on Jetstream2
## Goal
By the end of this tutorial, you should have a JupyterHub with some admin
users and a user environment with packages you want installed running on
[Jetstream](https://jetstream-cloud.org/).
[Jetstream2](https://jetstream-cloud.org/).
## Prerequisites
1. A Jetstream account with an XSEDE allocation; for more information,
see the [Jetstream Allocations help page](http://wiki.jetstream-cloud.org/Jetstream+Allocations).
1. An ACCESS ID, and membership in an allocation with access to Jetstream2 resources; for more information,
see the [Jetstream2 Allocations Overview page](https://docs.jetstream-cloud.org/alloc/overview/) and the [Get started with Jetstream2 guide](https://jetstream-cloud.org/get-started/).
## Step 1: Installing The Littlest JupyterHub
## Step 1: Launch a Jetstream2 instance
Let's create the server on which we can run JupyterHub.
We'll create a new Jetstream2 instance:
1. Log in to [the Jetstream portal](https://use.jetstream-cloud.org/). You need an allocation
to launch instances.
1. Log in to the [Jetstream2 portal](https://use.jetstream-cloud.org/). You must have (and select) an allocation in order to launch instances. Click the allocation you want to charge.
2. Click **Create****Instance**.
3. From the list of images, select **Ubuntu 24.04** (Jammy or newer is required for current TLJH releases).
4. In the **Create Instance** dialog:
1. Set a descriptive **Instance Name** (this is used in the default hostname and helps users recognize it).
2. Choose an **Instance Size**. We suggest `m3.small` (2 vCPUs / 6 GiB RAM) or larger for more than a couple of users. The absolute minimum TLJH can start with is about **1GiB** RAM, but you'll quickly run out with real workloads.
- See the resource estimation guide: [Choosing resources](/howto/admin/resource-estimation) for help picking CPU, RAM, and disk.
3. (Optional) Increase the **Volume Size** if you expect many users or large datasets. You can not easily shrink later.
5. Launch the instance (click **Create** button at the bottom of the form).
2. Select the **Launch New Instance** option to get going.
## Step 2: Install The Littlest JupyterHub
```{image} ../images/providers/jetstream/launch-instance-first-button.png
:alt: Launch new instance button with description.
```
1. Wait a few minutes for the instance to show the status "Ready"
2. Copy the **Hostname** under **Credentials**, it will be of the form: `yourinstancename.xxx0000000.projects.jetstream-cloud.org`, where `xxx000000` is the allocation ID. Keep it handy, we will use it multiple times in the next steps.
This takes you to a page with a list of base images you can choose for your
server.
3. SSH into the instance with the `exouser` user:
3. Under **Image Search**, search for **Ubuntu 22.04**, and select the
**Ubuntu 22.04 Devel and Docker** image.
```bash
ssh exouser@yourinstancename.xxx0000000.projects.jetstream-cloud.org
```
```{image} ../images/providers/jetstream/select-image.png
:alt: Select Ubuntu 22.04 x64 image from image list
```
Need the passphrase? In Exosphere, open **Instances**, select your
JupyterHub instance, and expand **Credentials**. Click **Show Passphrase**
next to the `exouser` entry to reveal or copy it before running the
`ssh` command.
4. Once selected, you will see more information about this image. Click the
**Launch** button on the top right.
4. Run the TLJH bootstrap script, replace <admin-user-name> with the name of the first admin user for this JupyterHub. Choose any name you like (dont forget to remove the brackets!). This admin user can log in after the JupyterHub is set up, and can configure it to their needs.
```{image} ../images/providers/jetstream/launch-instance-second-button.png
:alt: Launch selected image with Launch button on top right
```
```bash
curl -L https://tljh.jupyter.org/bootstrap.py | sudo -E python3 - --admin <admin-user-name>
```
5. A dialog titled **Launch an Instance / Basic Options** pops up, with various
options for configuring your instance.
5. Open the Hostname in a web browser (http on port 80). You should see the JupyterHub login page. Your browser will warn about the site not being secure (no HTTPS)—we'll enable HTTPS in the next step. Do not login yet, first setup HTTPS, so we avoid transmitting the password in clear text.
```{image} ../images/providers/jetstream/launch-instance-dialog.png
:alt: Launch an Instance / Basic Options dialog box
```
## Step 2: Enable HTTPS
1. Give your server a descriptive **Instance Name**.
Encrypted (HTTPS) access is strongly recommended before inviting users.
2. Select an appropriate **Instance Size**. We suggest m1.medium or larger.
Make sure your instance has at least **1GB** of RAM.
See the full guide: [Enable HTTPS](/howto/admin/https). Below is a quick recipe for using the default Jetstream-provided hostname.
Check out our guide on How To [](/howto/admin/resource-estimation) to help pick
how much Memory, CPU & disk space your server needs.
1. In the terminal inside the instance, configure Let's Encrypt (replace with a real email you control, and the correct hostname):
```bash
sudo tljh-config set https.enabled true
sudo tljh-config set https.letsencrypt.email you@example.com
sudo tljh-config add-item https.letsencrypt.domains yourinstancename.xxx0000000.projects.jetstream-cloud.org
sudo tljh-config reload proxy
```
2. Wait ~3060 seconds, then reload the site using https://. If certificate issuance fails, check the logs:
```bash
sudo journalctl -u traefik --since "10 minutes ago" | grep -i acme
```
3. If you have multiple allocations, make sure you are 'charging' this server
to the correct allocation.
Tips:
6. Click the **Advanced Options** link in the bottom left of the popup. This
lets us configure what the server should do when it starts up. We will use
this to install The Littlest JupyterHub.
- Make sure ports 80 and 443 are open in your Jetstream security group (they are open by default for new projects; adjust only if you customized network policies).
- If you later attach a custom domain, add it with another `add-item` command and reload the proxy again.
A dialog titled **Launch an Instance / Advanced Options** should pop up.
## Step 3: Log in as the administrative user and set a password
```{image} ../images/providers/jetstream/add-deployment-script-dialog.png
:alt: Dialog box allowing you to add a new script.
```
1. Now log in with the `<admin-user-name>` at https://yourinstancename.xxx000000.projects.jetstream-cloud.org. Since this is the first login, you'll be prompted to set a password. Choose a strong password and store it safely. This password is now the credential for that admin user.
2. Congratulations, you have a running working JupyterHub!
7. Click the **Create New Script** button. This will open up another dialog
box!
```{image} ../images/providers/jetstream/create-script-dialog.png
:alt: Launch an Instance / Advanced Options dialog box
```
8. Under **Input Type**, select **Raw Text**. This should make a text box titled
**Raw Text** visible on the right side of the dialog box.
Copy the text below, and paste it into the **Raw Text** text box. Replace
`<admin-user-name>` with the name of the first **admin user** for this
JupyterHub. This admin user can log in after the JupyterHub is set up, and
can configure it to their needs. **Remember to add your username**!
```bash
#!/bin/bash
curl -L https://tljh.jupyter.org/bootstrap.py \
| sudo python3 - \
--admin <admin-user-name>
```
:::{note}
See [](/topic/installer-actions) if you want to understand exactly what the installer is doing.
[](/topic/customizing-installer) documents other options that can be passed to the installer.
:::
9. Under **Execution Strategy Type**, select **Run script on first boot**.
10. Under **Deployment Type**, select **Wait for script to complete**.
11. Click the **Save and Add Script** button on the bottom right. This should hide
the dialog box.
12. Click the **Continue to Launch** button on the bottom right. This should put you
back in the **Launch an Instance / Basic Options** dialog box again.
13. Click the **Launch Instance** button on the bottom right. This should turn it
into a spinner, and your server is getting created!
```{image} ../images/providers/jetstream/launching-spinner.png
:alt: Launch button turns into a spinner
```
14. You'll now be shown a dashboard with all your servers and their states. The
server you just launched will progress through various stages of set up,
and you can see the progress here.
```{image} ../images/providers/jetstream/deployment-in-progress.png
:alt: Instances dashboard showing deployment in progress.
```
15. It will take about ten minutes for your server to come up. The status will
say **Active** and the progress bar will be a solid green. At this point,
your JupyterHub is ready for use!
16. Copy the **IP Address** of your server, and try accessing it from a web
browser. It should give you a JupyterHub login page.
```{image} ../images/first-login.png
:alt: JupyterHub log-in page
```
17. Login using the **admin user name** you used in step 8, and a password. Use a
strong password & note it down somewhere, since this will be the password for
the admin user account from now on.
18. Congratulations, you have a running working JupyterHub!
## Step 2: Adding more users
## Step 4: Adding more users
```{include} add-users.md
```
## Step 3: Install conda / pip packages for all users
```{include} add-packages.md
Next common tasks:
- [](howto-admin-admin-users)
- [](howto-user-env-user-environment-apt)
- [](howto-admin-enable-extensions)
- []topic-installer-upgrade-actions)
Browse the full [How-To index](/howto/index) for more.
## Ask for help
Need a hand?
- For Jetstream2 specific questions (allocations, quotas, instance lifecycle, networking, etc.), use the [Jetstream support resources](https://docs.jetstream-cloud.org/overview/support/).
- For The Littlest JupyterHub usage, configuration, or upgrade questions, search or post in the [Jupyter forum TLJH category](https://discourse.jupyter.org/c/jupyterhub/tljh).
- If you believe you have found a TLJH bug or have a clear documentation improvement, open an issue (or pull request if you have a proposed fix) in the [TLJH GitHub repository](https://github.com/jupyterhub/the-littlest-jupyterhub).
When asking for help about TLJH, it is often useful to provide:
- A short description of what you were trying to do and what happened instead
- Relevant log excerpts (see [](/troubleshooting/logs))
- Your TLJH version (`sudo tljh-config show | grep version` if present in config) and the output of `lsb_release -a` for the OS
- Any custom installer flags or `tljh-config` changes you have applied
This information helps others debug and answer more quickly.
```

View File

@@ -4,7 +4,7 @@
## 2.0
### 2.0.0b1 - 2024-09-30
### 2.0.0 - 2024-10-21
This release bundles with the latest available software from the JupyterHub
ecosystem.
@@ -13,17 +13,17 @@ For instructions on how to make an upgrade, see [](howto-admin-upgrade-tljh).
#### Breaking changes
- JupyterHub 4.\* has been upgraded to >=5.1.0,<6
- JupyterHub 4.\* has been upgraded to >=5.2.0,<6
- Refer to the [JupyterHub changelog] for details and pay attention to the
entries for JupyterHub version 5.0.0.
- OAuthenticator 16.0.4 has been upgraded to >=17.0.0,<18
changelog entry for JupyterHub version 5.0.0.
- OAuthenticator 16.0.4 has been upgraded to >=17.1.0,<18
- If you are using an OAuthenticator based authenticator class
(GitHubOAuthenticator, GoogleOAuthenticator, ...), refer to the
[OAuthenticator changelog] for details and pay attention to the entries for
JupyterHub version 17.0.0.
[OAuthenticator changelog] for details and pay attention to the changelog
entry for OAuthenticator version 17.0.0.
- LDAPAuthenticator 1.3.2 has been upgraded to >=2.0.0,<3
- If you are using this authenticator class, refer to the [LDAPAuthenticator
changelog] for details and pay attention to the entries for
changelog] for details and pay attention to the changelog entry for
LDAPAuthenticator version 2.0.0.
- The configured JupyterHub Proxy class `traefik-proxy` and the `traefik` server
controlled by JupyterHub via the proxy class has been upgraded to a new major
@@ -47,32 +47,32 @@ 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/2.0.0b1/tljh/requirements-user-env-extras.txt
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/2.0.0b1/tljh/requirements-hub-env.txt
[tljh/requirements-user-env-extras.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/2.0.0/tljh/requirements-user-env-extras.txt
[tljh/requirements-hub-env.txt]: https://github.com/jupyterhub/the-littlest-jupyterhub/blob/2.0.0/tljh/requirements-hub-env.txt
The changes in the respective environments between TLJH version 1.0.0 and 2.0.0b1
The changes in the respective environments between TLJH version 1.0.0 and 2.0.0
are summarized below.
| Dependency changes in the _hub environment_ | Version in 1.0.0 | Version in 2.0.0b1 | Changelog link | Note |
| ------------------------------------------------------------------------------ | ---------------- | ------------------ | ---------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | >=4.0.2,<5 | >=5.1.0,<6 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Running in the `jupyterhub` systemd service |
| [traefik](https://github.com/traefik/traefik) | 2.10.1 | 3.1.4 | [Changelog](https://github.com/traefik/traefik/blob/master/CHANGELOG.md) | Running in the `traefik` systemd service |
| [traefik-proxy](https://github.com/jupyterhub/traefik-proxy) | >=1.1.0,<2 | 2.\* | [Changelog](https://jupyterhub-traefik-proxy.readthedocs.io/en/latest/changelog.html) | Run by jupyterhub, controls `traefik` |
| [systemdspawner](https://github.com/jupyterhub/systemdspawner) | >=1.0.1,<2 | >=1.0.1,<2 | [Changelog](https://github.com/jupyterhub/systemdspawner/blob/master/CHANGELOG.md) | Run by jupyterhub, controls user servers via systemd |
| [jupyterhub-idle-culler](https://github.com/jupyterhub/jupyterhub-idle-culler) | >=1.2.1,<2 | >=1.4.0,<2 | [Changelog](https://github.com/jupyterhub/jupyterhub-idle-culler/blob/main/CHANGELOG.md) | Run by jupyterhub, stops inactivate servers etc. |
| [firstuseauthenticator](https://github.com/jupyterhub/firstuseauthenticator) | >=1.0.0,<2 | 1.1.0,<2 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
| [tmpauthenticator](https://github.com/jupyterhub/tmpauthenticator) | >=1.0.0,<2 | 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.2.0,<2 | >=1.3.0,<2 | [Changelog](https://github.com/jupyterhub/nativeauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
| [oauthenticator](https://github.com/jupyterhub/oauthenticator) | >=16.0.4,<17 | >=17.0.0,<18 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
| [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) | >=1.3.2,<2 | ==2.0.0b2 | [Changelog](https://github.com/jupyterhub/ldapauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
| [pip](https://github.com/pypa/pip) | >=23.1.2 | >=23.1.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | - |
| Dependency changes in the _hub environment_ | Version in 1.0.0 | Version in 2.0.0 | Changelog link | Note |
| ------------------------------------------------------------------------------ | ---------------- | ---------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | >=4.0.2,<5 | >=5.2.0,<6 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Running in the `jupyterhub` systemd service |
| [traefik](https://github.com/traefik/traefik) | 2.10.1 | 3.1.4 | [Changelog](https://github.com/traefik/traefik/blob/master/CHANGELOG.md) | Running in the `traefik` systemd service |
| [traefik-proxy](https://github.com/jupyterhub/traefik-proxy) | >=1.1.0,<2 | 2.\* | [Changelog](https://jupyterhub-traefik-proxy.readthedocs.io/en/latest/changelog.html) | Run by jupyterhub, controls `traefik` |
| [systemdspawner](https://github.com/jupyterhub/systemdspawner) | >=1.0.1,<2 | >=1.0.2,<2 | [Changelog](https://github.com/jupyterhub/systemdspawner/blob/master/CHANGELOG.md) | Run by jupyterhub, controls user servers via systemd |
| [jupyterhub-idle-culler](https://github.com/jupyterhub/jupyterhub-idle-culler) | >=1.2.1,<2 | >=1.4.0,<2 | [Changelog](https://github.com/jupyterhub/jupyterhub-idle-culler/blob/main/CHANGELOG.md) | Run by jupyterhub, stops inactivate servers etc. |
| [firstuseauthenticator](https://github.com/jupyterhub/firstuseauthenticator) | >=1.0.0,<2 | 1.1.0,<2 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
| [tmpauthenticator](https://github.com/jupyterhub/tmpauthenticator) | >=1.0.0,<2 | 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.2.0,<2 | >=1.3.0,<2 | [Changelog](https://github.com/jupyterhub/nativeauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
| [oauthenticator](https://github.com/jupyterhub/oauthenticator) | >=16.0.4,<17 | >=17.1.0,<18 | [Changelog](https://oauthenticator.readthedocs.io/en/latest/reference/changelog.html) | An optional way to authenticate users |
| [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) | >=1.3.2,<2 | ==2.0.0 | [Changelog](https://github.com/jupyterhub/ldapauthenticator/blob/HEAD/CHANGELOG.md) | An optional way to authenticate users |
| [pip](https://github.com/pypa/pip) | >=23.1.2 | >=23.1.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | - |
| Dependency changes in the _user environment_ | Version in 1.0.0 | Version in upgrade to 2.0.0b1 | Version in fresh install of 2.0.0b1 | Changelog link | Note |
| -------------------------------------------------------- | ---------------- | ----------------------------- | ----------------------------------- | --------------------------------------------------------------------------------- | ------------------------ |
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | >=4.0.2,<5 | >=5.1.0,<6 | >=5.1.0,<6 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Always upgraded. |
| [pip](https://github.com/pypa/pip) | >=23.1.2 | >=23.1.2 | >=24.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | Only upgraded if needed. |
| [conda](https://docs.conda.io/projects/conda/en/stable/) | >=4.10.0 | >=4.10.0 | ==24.7.1 | [Changelog](https://docs.conda.io/projects/conda/en/stable/release-notes.html) | Only upgraded if needed. |
| [mamba](https://mamba.readthedocs.io/en/latest/) | >=0.16.0 | >=0.16.0 | ==1.5.9 | [Changelog](https://github.com/mamba-org/mamba/blob/main/CHANGELOG.md) | Only upgraded if needed. |
| Dependency changes in the _user environment_ | Version in 1.0.0 | Version in upgrade to 2.0.0 | Version in fresh install of 2.0.0 | Changelog link | Note |
| -------------------------------------------------------- | ---------------- | --------------------------- | --------------------------------- | --------------------------------------------------------------------------------- | ------------------------ |
| [jupyterhub](https://github.com/jupyterhub/jupyterhub) | >=4.0.2,<5 | >=5.2.0,<6 | >=5.2.0,<6 | [Changelog](https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html) | Always upgraded. |
| [pip](https://github.com/pypa/pip) | >=23.1.2 | >=23.1.2 | >=24.2 | [Changelog](https://pip.pypa.io/en/stable/news/) | Only upgraded if needed. |
| [conda](https://docs.conda.io/projects/conda/en/stable/) | >=4.10.0 | >=4.10.0 | ==24.7.1 | [Changelog](https://docs.conda.io/projects/conda/en/stable/release-notes.html) | Only upgraded if needed. |
| [mamba](https://mamba.readthedocs.io/en/latest/) | >=0.16.0 | >=0.16.0 | ==1.5.9 | [Changelog](https://github.com/mamba-org/mamba/blob/main/CHANGELOG.md) | Only upgraded if needed. |
#### New features added
@@ -82,12 +82,16 @@ are summarized below.
#### Bugs fixed
- hub env: avoid installing pycurl using wheel with an issue [#1006](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1006) ([@consideRatio](https://github.com/consideRatio), [@minrk](https://github.com/minrk))
- fix `-m` invocation of jupyterhub [#988](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/988) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics))
- Re-install conda/mamba for every tljh upgrade (doesn't imply upgrade) [#968](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/968) ([@consideRatio](https://github.com/consideRatio), [@minrk](https://github.com/minrk))
- Add missing oauthenticator dependency for AzureADOAuthenticator [#959](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/959) ([@consideRatio](https://github.com/consideRatio))
#### Maintenance and upkeep improvements
- Update jupyterhub pinning to >=5.2.0,<6 from ==5.1.0 [#1008](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1008) ([@consideRatio](https://github.com/consideRatio))
- hub env: pin to jupyterhub 5.1.0 [#1007](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1007) ([@consideRatio](https://github.com/consideRatio))
- hub env: bump to ldapauthenticator 2.0.0 and other lower bounds [#1004](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1004) ([@consideRatio](https://github.com/consideRatio))
- Bump the requirements-user-env-extras.txt lower version bounds [#1002](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1002) ([@consideRatio](https://github.com/consideRatio))
- Update traefik from 2.10.1 to 3.1.4 [#1001](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1001) ([@consideRatio](https://github.com/consideRatio))
- Update to install miniforge 24.7.1-2 from 24.7.1-0 [#999](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/999) ([@consideRatio](https://github.com/consideRatio))
@@ -100,6 +104,7 @@ are summarized below.
#### Documentation improvements
- Remove mention about beta state [#1009](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1009) ([@consideRatio](https://github.com/consideRatio))
- Added missing details on how to add custom domain from manual HTTPS configuration [#983](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/983) ([@josedaudi](https://github.com/josedaudi), [@yuvipanda](https://github.com/yuvipanda))
- Reword documentation sentence [#970](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/970) ([@davidalber](https://github.com/davidalber), [@consideRatio](https://github.com/consideRatio))
- Fix typo and replace word [#969](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/969) ([@davidalber](https://github.com/davidalber), [@consideRatio](https://github.com/consideRatio))
@@ -108,6 +113,7 @@ are summarized below.
#### Continuous integration improvements
- Test upgrade from 1.\* [#1003](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/1003) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk), [@consideRatio](https://github.com/consideRatio))
- ci: cache pip only when no container is used [#997](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/997) ([@consideRatio](https://github.com/consideRatio))
- ci: run unit tests in ubuntu-24.04 github actions environment as well [#993](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/993) ([@consideRatio](https://github.com/consideRatio))
- ci: add tests for debian 12 and ubuntu 24.04 [#967](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/967) ([@consideRatio](https://github.com/consideRatio))
@@ -116,14 +122,14 @@ are summarized below.
- build(deps): bump actions/setup-python from 4 to 5 [#958](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/958) ([@consideRatio](https://github.com/consideRatio))
- build(deps): bump actions/checkout from 3 to 4 [#943](https://github.com/jupyterhub/the-littlest-jupyterhub/pull/943) ([@consideRatio](https://github.com/consideRatio))
#### Contributors to this release
## Contributors to this release
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-08-11&to=2024-09-30&type=c))
([GitHub contributors page for this release](https://github.com/jupyterhub/the-littlest-jupyterhub/graphs/contributors?from=2023-08-11&to=2024-10-21&type=c))
@consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AconsideRatio+updated%3A2023-08-11..2024-09-30&type=Issues)) | @davidalber ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Adavidalber+updated%3A2023-08-11..2024-09-30&type=Issues)) | @josedaudi ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajosedaudi+updated%3A2023-08-11..2024-09-30&type=Issues)) | @jrdnbradford ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajrdnbradford+updated%3A2023-08-11..2024-09-30&type=Issues)) | @kiliansinger ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Akiliansinger+updated%3A2023-08-11..2024-09-30&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Amanics+updated%3A2023-08-11..2024-09-30&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aminrk+updated%3A2023-08-11..2024-09-30&type=Issues)) | @MridulS ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AMridulS+updated%3A2023-08-11..2024-09-30&type=Issues)) | @pdebuyl ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Apdebuyl+updated%3A2023-08-11..2024-09-30&type=Issues)) | @schwebke ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aschwebke+updated%3A2023-08-11..2024-09-30&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ayuvipanda+updated%3A2023-08-11..2024-09-30&type=Issues))
@consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AconsideRatio+updated%3A2023-08-11..2024-10-21&type=Issues)) | @davidalber ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Adavidalber+updated%3A2023-08-11..2024-10-21&type=Issues)) | @josedaudi ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajosedaudi+updated%3A2023-08-11..2024-10-21&type=Issues)) | @jrdnbradford ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ajrdnbradford+updated%3A2023-08-11..2024-10-21&type=Issues)) | @kiliansinger ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Akiliansinger+updated%3A2023-08-11..2024-10-21&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Amanics+updated%3A2023-08-11..2024-10-21&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aminrk+updated%3A2023-08-11..2024-10-21&type=Issues)) | @MridulS ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3AMridulS+updated%3A2023-08-11..2024-10-21&type=Issues)) | @pdebuyl ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Apdebuyl+updated%3A2023-08-11..2024-10-21&type=Issues)) | @schwebke ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Aschwebke+updated%3A2023-08-11..2024-10-21&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fthe-littlest-jupyterhub+involves%3Ayuvipanda+updated%3A2023-08-11..2024-10-21&type=Issues))
## 1.0

View File

@@ -18,12 +18,12 @@ the idle culler configuration can be extended beyond tljh-config options, using
## Default settings
By default, JupyterHub will ping the user notebook servers every 60s to check their
status. Every server found to be idle for more than 10 minutes will be culled.
By default, JupyterHub will ping the user notebook servers every 10 min to check their
status. Every server found to be idle for more than 1 hour will be culled.
```python
services.cull.every = 60
services.cull.timeout = 600
services.cull.every = 600
services.cull.timeout = 3600
```
Because the servers don't have a maximum age set, an active server will not be shut down

View File

@@ -227,7 +227,7 @@ it after an argument like `remove-item` gives information about this specific co
```bash
sudo tljh-config --help
usage: tljh-config [-h] [--config-path CONFIG_PATH] {show,unset,set,add-item,remove-item,reload} ...
usage: tljh-config [-h] [--config-path CONFIG_PATH] [--validate] [--no-validate] {show,unset,set,add-item,remove-item,reload} ...
positional arguments:
{show,unset,set,add-item,remove-item,reload}
@@ -238,10 +238,12 @@ positional arguments:
remove-item Remove a value from a list for a configuration property
reload Reload a component to apply configuration change
optional arguments:
options:
-h, --help show this help message and exit
--config-path CONFIG_PATH
Path to TLJH config.yaml file
--validate Validate the TLJH config
--no-validate Do not validate the TLJH config
```
```bash

View File

@@ -22,11 +22,9 @@ container technology in administering user sessions.
The choice between TLJH and Z2JH ultimately comes down to only a few questions:
1. Do you want your hub and all users to live on a **single, larger machine** vs. spreading users on a **cluster of smaller machines** that are scaled up or down?
- If you can use a single machine, we recommend **The Littlest JupyterHub**.
- If you wish to use multiple machines, we recommend **Zero to JupyterHub for Kubernetes**.
2. Do you **need to use container technology**?
- If no, we recommend **The Littlest JupyterHub**.
- If yes, we recommend **Zero to JupyterHub for Kubernetes**.

View File

@@ -81,7 +81,6 @@ easier. Here are some very basic tips on effective `journalctl` usage.
[less](<https://en.wikipedia.org/wiki/Less_(Unix)>). This allows you to
scroll up / down, search for specific words, etc. Some common keyboard shortcuts
are:
- Arrow keys to move up / down / left / right
- `G` to navigate to the end of the logs
- `g` to navigate to the start of the logs

View File

@@ -1,4 +1,4 @@
# Systemd inside a Docker container, for CI only
# Systemd inside a Docker container, for CI and local development
ARG BASE_IMAGE=ubuntu:22.04
FROM $BASE_IMAGE
@@ -28,9 +28,4 @@ RUN systemctl set-default multi-user.target
STOPSIGNAL SIGRTMIN+3
# Uncomment these lines for a development install
# ENV TLJH_BOOTSTRAP_DEV=yes
# ENV TLJH_BOOTSTRAP_PIP_SPEC=/srv/src
# ENV PATH=/opt/tljh/hub/bin:${PATH}
CMD ["/bin/bash", "-c", "exec /lib/systemd/systemd --log-target=journal 3>&1"]

View File

@@ -9,9 +9,12 @@ def test_serverextensions():
# jupyter-serverextension writes to stdout and stderr weirdly
proc = subprocess.run(
["/opt/tljh/user/bin/jupyter-server", "extension", "list", "--sys-prefix"],
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
output = proc.stdout.decode()
extensions = [
"jupyterlab",
"nbgitpuller",
@@ -19,7 +22,7 @@ def test_serverextensions():
]
for e in extensions:
assert e in proc.stderr.decode()
assert e in output, f"'{e}' not found in server extensions: {output}"
def test_labextensions():

View File

@@ -65,7 +65,7 @@ omit = [
github_url = "https://github.com/jupyterhub/the-littlest-jupyterhub"
[tool.tbump.version]
current = "2.0.0b1"
current = "2.0.1.dev"
regex = '''
(?P<major>\d+)
\.

View File

@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
setup(
name="the-littlest-jupyterhub",
version="2.0.0b1",
version="2.0.1.dev",
description="A small JupyterHub distribution",
url="https://github.com/jupyterhub/the-littlest-jupyterhub",
author="Jupyter Development Team",

View File

@@ -220,7 +220,8 @@ def test_cli_remove_int(tljh_dir):
("x", "x"),
("1x", "1x"),
("1.2x", "1.2x"),
(None, None),
("None", None),
("none", None),
("", ""),
],
)

View File

@@ -0,0 +1,13 @@
"""
Unit test functions to test JSON Schema validation
"""
import jsonschema
from tljh.config_schema import config_schema
def test_valid_config_json_schema():
"""Validate that the JSON schema fits its $schema specification"""
validator_class = jsonschema.validators.validator_for(config_schema)
validator_class.check_schema(config_schema)

View File

@@ -161,12 +161,6 @@ def _specifier(version):
"mamba": ">=1.1.0",
},
),
# too-old Python (3.7), abort
(
"miniconda",
"4.7.10",
ValueError,
),
],
)
def test_ensure_user_environment(

View File

@@ -317,8 +317,8 @@ def reload_component(component):
def parse_value(value_str):
"""Parse a value string"""
if value_str is None:
return value_str
if value_str.lower() == "none":
return None
if re.match(r"^\d+$", value_str):
return int(value_str)
elif re.match(r"^\d+\.\d*$", value_str):

View File

@@ -79,7 +79,20 @@ config_schema = {
"description": "User CPU and memory limits.",
"type": "object",
"additionalProperties": False,
"properties": {"memory": {"type": "string"}, "cpu": {"type": "integer"}},
"properties": {
"memory": {
"anyOf": [
{"type": "string"},
{"type": "null"},
]
},
"cpu": {
"anyOf": [
{"type": "number", "minimum": 0},
{"type": "null"},
]
},
},
},
"UserEnvironment": {
"type": "object",

View File

@@ -5,7 +5,6 @@ Config should never append or mutate, only set. Functions here could
be called many times per lifetime of a jupyterhub.
Traitlets that modify the startup of JupyterHub should not be here.
FIXME: A strong feeling that JSON Schema should be involved somehow.
"""
import os

View File

@@ -293,12 +293,16 @@ def ensure_user_environment(user_requirements_txt_file):
)
if user_requirements_txt_file:
# FIXME: This currently fails hard, should fail soft and not abort installer
conda.ensure_pip_requirements(
USER_ENV_PREFIX,
user_requirements_txt_file,
upgrade=True,
)
try:
conda.ensure_pip_requirements(
USER_ENV_PREFIX,
user_requirements_txt_file,
upgrade=True,
)
except Exception as e:
logger.warning(
f"Failed to install requirements for user env from {user_requirements_txt_file}: {e}"
)
def ensure_admins(admin_password_list):
@@ -530,7 +534,7 @@ def main():
ensure_admins(args.admin)
ensure_usergroups()
if args.user_requirements_txt_url:
logger.info("installing packages from user_requirements_txt_url")
logger.info("Installing packages from user_requirements_txt_url")
ensure_user_environment(args.user_requirements_txt_url)
logger.info("Setting up JupyterHub...")

View File

@@ -8,13 +8,13 @@
# If a dependency is bumped to a new major version, we should make a major
# version release of tljh.
#
jupyterhub>=5.1.0,<6
jupyterhub-systemdspawner>=1.0.1,<2
jupyterhub>=5.2.0,<6
jupyterhub-systemdspawner>=1.0.2,<2
jupyterhub-firstuseauthenticator>=1.1.0,<2
jupyterhub-nativeauthenticator>=1.3.0,<2
jupyterhub-ldapauthenticator==2.0.0b2 # FIXME: update to >=2.0.0,<3
jupyterhub-ldapauthenticator>=2.0.0,<3
jupyterhub-tmpauthenticator>=1.0.0,<2
oauthenticator>=17,<18
oauthenticator>=17.1.0,<18
jupyterhub-idle-culler>=1.4.0,<2
# pycurl is installed to improve reliability and performance for when JupyterHub
@@ -25,4 +25,4 @@ jupyterhub-idle-culler>=1.4.0,<2
# ref: https://www.tornadoweb.org/en/stable/httpclient.html#module-tornado.simple_httpclient
# ref: https://github.com/jupyterhub/the-littlest-jupyterhub/issues/289
#
pycurl>=7.45.3,<8
pycurl>=7.45.7,<8