0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LTIカスタムパラメータによる Moodle + JupyterHub 連携システムの構築と運用(3)「JupyterHub (LTIContainerSpawner) のインストールと設定」

Last updated at Posted at 2025-12-24
Moodle + JupyterHub 連携システム シリーズ(3)

3. JupyterHub (LTIContainerSpawner) のインストールと設定

本システムは,JupyterHub を root 権限で動作させることを前提 に設計されています.
これは,LTI 連携によるユーザ管理,コンテナ生成,ネットワーク制御を 一貫して制御するための設計判断です.

また,サーバを JupyterHub 専用として使用する という設計思想に基づき,Python 環境についても 管理性と実効性を優先してグローバル環境に構築 しています.

そのため,本構成は 用途を限定した専用サーバでの運用を前提としており,仮想環境(venv)を用いる構成については本記事では扱いません.

注) 先頭に $ のないコマンドは,すべて root とし実行します.sudo を使用している場合は,随時先頭に sudo を挿入してください.

3.1 Rocky Linux 9

3.1.1 Rocky Linux 9 へのインストール

Python は 3.11 を使用していますが,Rocky Linux 9 のデフォルトの Python 3.9 でも本システムは実際に動作します.
本記事では,将来的なライブラリ互換性や保守性を考慮して Python 3.11 を使用しますが,既存環境で Python 3.9 を利用している場合でも,基本的には同様に構築可能です.

Python 3.9 を使用する場合は,「Python 3.11 & pip」 をスキップしてください.

Python 3.11 & pip

Python 3.11 と それ用の pip をインストールします.

dnf -y install python3.11
dnf -y install python3.11-pip
pip3.11 install --upgrade pip
configurable-http-proxy

configurable-http-proxy は v5 系では JupyterHub v4 と組み合わせた際に WebSocket 周りで不安定になる報告があり,本記事では安定動作を優先して v4 系を使用します.

npm install -g configurable-http-proxy@4
Jupyter 関連

Jupyter 関連の Python パッケージをインストールします.
JupyterHub v5 では,LTIContainerSpawner の親クラスである DockerSpawner を含む挙動に変更があり,本システムの構成では安定動作を確認できていないため,本記事では JupyterHub v4 系の最新版を使用します.

export PIP_ROOT_USER_ACTION=ignore
pip install jupyterhub==4.*       # JupyterHub5 は未サポート
pip install jupyterhub-ltiauthenticator
pip install dockerspawner
pip install notebook
pip install jupyterlab
pip install jupyterlab-language-pack-ja-JP
pip install jupyter_server_fileid
pip install jupyter_server_ydoc
pip install jnotice               # メッセージ表示用
Podman

Podman をインストールします.Podman はデーモンを常駐させる方式ではありませんが,Docker 互換の API を利用するために podman.socket を有効化しています.

dnf -y install podman
dnf -y install podman-remote
dnf -y install podman-docker

systemctl enable --now podman.socket
接続用ユーザの作成

JupyterHub のコンテナ情報を SSH ポートフォワーディング を使用して Moodle へ送信するための専用ユーザを作成します.
ユーザ名は任意ですが,podman としておくことで,jupyterhub.service のデフォルト設定を変更せずに利用できます.
なお,本ユーザは対話的にログインすることを想定していないため,ログインシェルは不要 です.

mkdir /home/others
chmod a+rx /home/others
adduser podman -d /home/others/podman -s /sbin/nologin
passwd podman            # パスワードの設定

3.1.2 firewall の最小設定

FireWalld が動いている場合は,JupyterHub に接続するための TCP の 443番ポートを開放する必要があります.

firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

3.2 Ubuntu Server 24

3.2.1 Ubuntu Server 24 へのインストール

Ubuntu Server 24 のデフォルトである Python 3.12 でも,本システムは 基本的な機能については実際に動作することを確認しています.ただし,本記事では,将来的なライブラリ互換性および既存の運用・検証実績を考慮し,Python 3.11 を用いた構成を解説します.Python 3.12 を用いた場合も,基本的な構築手順は同様です.

Python 3.12 を使用する場合は,「Python 3.11 & pip」 をスキップしてください.

Python 3.11 & pip

Python 3.11 と それ用の pip をインストールします.最後に,JupyterHub 関連パッケージと Ubuntu 標準の jsonschema が衝突するため,これを一旦削除しています.

add-apt-repository -y ppa:deadsnakes/ppa
apt -y install python3.11 python3.11-distutils
apt -y install python3-pip
python3.11 -m pip install --ignore-installed --break-system-packages pip   # これで /usr/local/bin/pip 使用可
pip --version
apt -y remove python3-jsonschema      # 衝突したパッケージを削除
configurable-http-proxy

configurable-http-proxy は v5 系では JupyterHub v4 と組み合わせた際に WebSocket 周りで不安定になる報告があり,本記事では安定動作を優先して v4 系を使用します.

npm install -g configurable-http-proxy@4
Jupyter 関連

Jupyter 関連の Python パッケージをインストールします.
JupyterHub v5 では,LTIContainerSpawner の親クラスである DockerSpawner を含む挙動に変更があり,本システムの構成では安定動作を確認できていないため,本記事では JupyterHub v4 系の最新版を使用します.

export PIP_ROOT_USER_ACTION=ignore  # Warning を抑制
pip install jupyterhub==4.*         # JupyterHub5 は未サポート
pip install jupyterhub-ltiauthenticator
pip install dockerspawner
pip install notebook
pip install jupyterlab
pip install jupyterlab-language-pack-ja-JP
pip install jupyter_server_fileid
pip install jupyter_server_ydoc
pip install jnotice                 # メッセージ表示用
リポジトリの鍵とリスト

Docker をインストール(ダウンロード)するための,リポジトリの鍵とリストを設定します.

  • リポジトリ鍵
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
  • リポジトリリスト
. /etc/os-release
echo \
   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
   https://download.docker.com/linux/ubuntu noble stable" \
   | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker

正規版の Docker をインストールする前に,Snap版の Docker が既にインストールされている場合があります.Snap版の場合は,本システムは動作しませんので,念のため削除コマンドを実行します,

snap remove docker --purge 

正式版の Docker をインストールします.インストール後はデーモンとして常時起動させます.

apt update
apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

systemctl enable --now docker
ps ax | grep docker               # 確認
接続用ユーザの作成

JupyterHub のコンテナ情報を SSH ポートフォワーディング を使用して Moodle へ送信するための専用ユーザを作成します.
ユーザ名は任意ですが,docker としておくことで,jupyterhub.service のデフォルト設定を変更せずに利用できます.
なお,本ユーザは対話的にログインすることを想定していないため,ログインシェルは不要 です.

mkdir /home/others
chmod a+rx /home/others
useradd docker -g docker -d /home/others/docker -s /sbin/nologin
passwd docker            # パスワードの設定

3.3 LTIContainerSpawner

3.3.1 LTIContainerSpawner のインストール

本システムの中核となる LTIContainerSpawner をダウンロードし,インストールします.
LTIContainerSpawner ディレクトリ内で make コマンドを実行すると,必要なファイルが自動的に配置されます.

make jp を実行した場合は,アラートメッセージとして日本語用の設定ファイルが使用されます.英語のアラートを使用する場合は,make のみを実行してください.
make を実行すると,いくつかのツールをコンパイル しますので,すこし時間がかかります.

make の実行後,本システムで使用する コンテナイメージ(デフォルトイメージ) をダウンロードし,正しく取得できていることを確認します.
一般的な JupyterHub 用のコンテナイメージを使用することも可能ですが,本システム固有の拡張機能の多くは利用できません.

なお,Podman を使用している環境でも docker コマンドは利用可能 です.
実行時に警告メッセージが表示される場合がありますが,動作上の問題はありません.

git clone https://github.com/jupyter-fumihax/lticontainerspawner
cd lticontainerspawner/
make jp

docker pull ghcr.io/jupyter-fumihax/jupyterhub-ltictr.singleuser
docker images            # イメージファイルの確認

3.3.2 LTIConainerSpawner の最小設定

openssl (TEST用のサーバ証明書)

JupyterHub で TLS (SSL) 通信を行うためのサーバ証明書を設定します.JupyterHub を外部などに公開する場合は,サーバ証明書を買うか Let's Encrypt を使用します.
内部だけで使用する場合やテストの場合は オレオレ証明書でも十分です.

オレオレ証明書を作成する場合は以下のようにします.
作成するディレクトリは自由ですが,以下で指定したディレクトリに作成した場合は,次での設定ファイルの書き換えが楽になります.

mkdir -p /etc/ssl/private/
mkdir -p /etc/ssl/certs/
chmod o-rx /etc/ssl/private/

openssl req -x509 -newkey rsa:2048 -sha256 -days 365 -nodes \
   -keyout /etc/ssl/private/jh_test.key \
   -out /etc/ssl/certs/jh_test.crt \
   -subj "/CN=localhost"
jupyterhub_lticontainer_config.py の設定

メインの設定ファイルである jupyterhub_lticontainer_config.py を自分の環境に合わせて書き換えます.

vi /usr/local/etc/ltictr/jupyterhub_lticontainer_config.py 

デフォルト設定で良い場合,かつ 上記 「openssl (TEST用のサーバ証明書)」 で指定されたディレクトリにサーバ証明書(および秘密鍵)を作成した場合は,my_ip_addr に自分の IPアドレスを指定するだけで終了です.

my_ip_addr = '192.168.107.128'

もし,openssl (TEST用のサーバ証明書) で指定されたディレクトリ以外の場所に,サーバ証明書と秘密鍵を持っている場合は,ssl_server_certssl_private_key にそれぞれのファイルのパスを指定します.

例)
ssl_server_cert = '/etc/letsencrypt/live/polaris.star-dust.jp/fullchain.pem'
ssl_private_key = '/etc/letsencrypt/live/polaris.star-dust.jp/privkey.pem'
起動

JupyterHub を常時起動させます.起動した後,念のためプロセスの存在を確認します.
なお,make により jupyterhub.service は LTIConainerSpawner の make コマンド実行時に自動的に /usr/lib/systemd/system に配置されています.

systemctl enable --now jupyterhub
ps ax | grep jupyterhub              # 確認

3.4 JupyterHub への接続テスト

JupyterHub(JupyterLab)への接続

JupyterHub を起動した後,Webブラウザで https://サーバ名 (or IPアドレス)/ にアクセスします.
ログイン画面が出た場合は,Linux に 実際に存在するユーザ名とパスワードでログインします.

正常な状態であれば JupyterLab に接続できます.JupyterLab の画面が表示された場合,これで JupyterHub 側の設定は一旦終わり です.


3.5 JupyterHub のオプション機能

3.5.1 Culler

Culler は不要になった JupyterLab コンテナを刈り取るプログラムです.色々な Culler が公開されていますが,比較的使えると感じたのが下記の Culler です.

しかしながら,本システムの最新版には JupyterLab コンテナの自動終了機能 が実装されていますので,特に別途 Culler をインストールする必要はありません.
一応,参考のために挙げておきます.

pip install wheel 
pip install pycurl
wget https://raw.githubusercontent.com/jupyterhub/jupyterhub/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle/cull_idle_servers.py
cp cull_idle_servers.py /usr/local/bin
chmod a+rx /usr/local/bin/cull_idle_servers.py
vi /usr/local/etc/ltictr/jupyterhub_lticontainer_config.py  # Culler 設定部分をアンコメントする

シリーズ「LTI カスタムパラメータによる Moodle+JupyterHub 連携システムの構築と運用」第3回
第1回に戻る前へ:Linux と Moodle のインストールと設定次へ:Moodle モジュール mod_lticontainer のインストールと設定

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?