JupyterHub: Customizing JupyterLab Launcher
Ты ~~сделал самый удобный JupyterHub на свете~~ настроил идеальный инстанс JupyterLab для своей команды. Пользователи заходят, а видят голый, стандартный лаунче
Ты сделал самый удобный JupyterHub на свете настроил идеальный инстанс JupyterLab для своей команды. Пользователи заходят, а видят голый, стандартный лаунчер. Хочется добавить туда приветствие, ссылки на документацию, предупреждения — чтобы всё было красиво и информативно.
Ты лезешь в код лаунчера, видишь простой React-компонент. Кажется, что нужно просто подправить разметку. Но где это делать в продакшене? И как заставить JupyterLab использовать твою версию?
Лаунчер — это не (совсем) расширение
Корень проблемы в том, что лаунчер (@jupyterlab/launcher-extension) — это системное расширение, встроенное в JupyterLab. Оно не предназначено для простой замены через jupyter labextension install.
Оно живёт глубоко в node_modules твоего окружения. Можно, конечно, патчить файлы прямо в образе контейнера, но это хрупко и не переживёт следующего обновления базового образа.
Нужен правильный способ переопределения.
Решение: украсть, изменить, отключить старое
Ответ нашёлся в проекте Elyra. Они кастомизируют интерфейс JupyterLab, и им тоже нужен был свой лаунчер.
Алгоритм такой: создать своё расширение, которое будет предоставлять новую реализацию лаунчера, и отключить встроенную.
Сначала смотрим на их пример. Берем исходник лаунчера из репозитория JupyterLab (аккуратно, нужна совместимая версия!) и копируем его в код своего расширения — например, в src/launcher.tsx.
Ключевая правка — в методе render(). Туда можно вставить любой HTML.
return (
<div className="jp-Launcher-body">
<div className="jp-Launcher-content">
<div className="jp-Launcher-cwd">
<h3>Добро пожаловать в нашу платформу!</h3>
<p>Здесь лежат данные за последний квартал. Осторожно с запросами к продакшен-базе. <a href="https://wiki/guide">Гайд для новичков</a>.</p>
</div>
{categories}
</div>
</div>
);
Всё, что добавишь в этот блок jp-Launcher-cwd, появится сверху лаунчера, над стандартными кнопками создания ноутбуков.
Как заставить это работать
Само расширение нужно упаковать и установить. Это отдельная история с package.json, tsconfig.json и сборкой.
Но главный трюк — после установки расширения надо отключить родной лаунчер. В командной строке это просто:
jupyter labextension disable @jupyterlab/launcher-extension
В среде JupyterHub на Kubernetes команду нужно прописать в конфигурации. Например, в config.yaml для zero-to-jupyterhub-k8s можно добавить её в singleuser.extraInitContainers или через postStart хук, чтобы она выполнялась после старта сервера.
Или, как делает Elyra, прописать отключение прямо в настройках расширения (package.json), но это уже тонкости сборки.
Итог
Порядок действий: форкнуть код лаунчера → вставить свой HTML/CSS в render() → собрать как расширение → установить его в образ → отключить стандартный лаунчер командой.
Да, это не две кнопки в интерфейсе. Зато это надёжно и переносимо между обновлениями. Теперь твои пользователи увидят персональное приветствие, а не безликий список шаблонов.