Errors
JupyterHub

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() → собрать как расширение → установить его в образ → отключить стандартный лаунчер командой.

Да, это не две кнопки в интерфейсе. Зато это надёжно и переносимо между обновлениями. Теперь твои пользователи увидят персональное приветствие, а не безликий список шаблонов.