ページ内コンテンツ
This page is out of date.
Moodle & JupyterHub 連携
現行システムは JupyterHub-2.3.1, 3.1.1 では動作するが,4.0.0 では動作しない- 動くようになりました.
- LTI カスタムパラメータを使用した Moodle + JupyterHub 連携を研究中
- Moodle
- JupyterHub
- Docker
- Podman
2023/05/07
- JupyterHub v3 で Podman も Docker 同様に扱えるようになった模様.
- JupyterHub v3 では jupyterhub_podman_config.py と最新の Dockerイメージ(ltids)の組み合わせは使用できない.(パーミッションエラーが出る)
- JupyterHub v3 で最新の Dockerイメージ(ltids)を使用したい場合は,Podmanであっても jupyterhub_docker_config.py を使用すること.
- JupyterHub v4 では XSRFクッキー関連で,ltiauthenticator が使用できない.JupyterHub
- site-packages/jupyterhub/handlers/base.py の関数 check_xsrf_cookie(self) でそまま True を返させる.
--- base.py- 2023-05-07 01:44:18.173130119 -0400 +++ base.py 2023-05-07 01:44:31.750265669 -0400 @@ -235,7 +235,8 @@ def check_xsrf_cookie(self): try: - return super().check_xsrf_cookie() + return True + #return super().check_xsrf_cookie() except Exception as e: # ensure _juptyerhub_user is defined on rejected requests if not hasattr(self, "_jupyterhub_user"):
- site-packages/jupyterhub/handlers/base.py の関数 check_xsrf_cookie(self) でそまま True を返させる.
Gitlab Wiki
Moodle
- Moodle 3.5以上(それ未満でも動くかもしれない.要 LTIサポート)
- JupyterHub が動くホストとは別のホストでもOK
- 外部サービス,Webサービスを使用する.
- LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも docker-ce-cli/docker-cli がインストールされている必要がある.
- LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも podman-remote がインストールされている必要がある.
外部サービス
- LTI 認証モジュールと連携して SSOを実現する.
- 管理者IDで,「サイト管理」=> 「プラグイン」=> 「外部ツール:ツールを管理する」(=>「ツールを手動設定する」)
- デフォルト起動コンテナは「新しいウィンドウ」にする.
- デフォルト起動コンテナは「新しいウィンドウ」にする.
Docker
- CentOS8
(base) # dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo (base) # dnf -y install docker-ce docker-ce-cli containerd.io --nobest --allowerasing (base) # systemctrl enable docker (base) # systemctrl start docker (base) # docker pull jupyterhub/singleuser (base) # docker pull jupyter/datascience-notebook
Podman
- CentOS8
(base) # dnf -y install podman (base) # dnf -y install podman-remote (base) # dnf -y install podman-docker
with pip
# yum install python39 # alternatives --config python3 # /usr/bin/pip3.9 install --upgrade pip # yum install npm # npm install -g configurable-http-proxy # pip install setuptools_rust # pip install jupyterhub # pip install dockerspawner # pip install --upgrade notebook # pip install --upgrade jupyterlab # jupyterhub --version # jupyter --version # jupyter notebook --version # jupyter lab --version
with conda
(base) # conda create -n jupyterhub python=3.8 -y (base) # conda activate jupyterhub (jupyterhub) # conda install -c conda-forge notebook -y (jupyterhub) # conda install -c conda-forge jupyterlab -y (jupyterhub) # conda install -c conda-forge jupyterhub==1.4.2 -y (jupyterhub) # conda install -c conda-forge voila -y (jupyterhub) # conda install jupyter_client -y (jupyterhub) # pip --no-cache-dir install git+https://github.com/jupyterhub/dockerspawner.git #(必要なら)
設定&起動
- 作業ディレクトリ
- mkdir -p /var/lib/jupyterhub/
- FireWall
- firewall-cmd --add-port 8000/tcp --permanent
- firewall-cmd --reload
- vi jupyterhub_config.py
- IPアドレス,サーバ証明書,Dockerイメージの選択
- 起動
- conda activate jupyterhub (condaの場合)
- jupyterhub -f jupyterhub_config.py
SystemUserSpawner
- 最新版では未使用
- Container として Docker を使用する場合に必要.Podman を使用する場合は不要.
- JupyterHub の DockerSpawner を継承.
- システムのユーザを使用可能.
- システムのユーザのホーム領域をマウント可能.
- JupyterHub の DockerSpawner を継承.
- 2021 7/12(またはそれ以降) 版推奨
- https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/systemuserspawner.py
- JupyterHub のインストールで,一緒にインストールされる.(バージョンが古い場合は手動インストール)
NSS
- ユーザ情報として /etc/passwd(/etc/group) の情報が必要
- システム(Containerを動かすホスト上)のユーザでなくても良い.
- LDAP か下記の altfiles を使用する
- LDAP か下記の altfiles を使用する
altfiles
- ユーザの passwd, grouop 情報が必要
- SystemUserSpawner 用の NSS を使用した システムのユーザ情報の入手方法(LDAP を使用する手もある)
- getent passwd と getent group で情報が取れるようになれば OK
- ファイルの設置場所はコンパイル時に指定
# git clone https://github.com/aperezdc/nss-altfiles.git # cd nss-altfiles/ # ./configure --prefix=/usr --datadir=/usr/local/etc --with-type=pwd,grp # make # make install # ln -s /usr/lib/libnss_altfiles.so.2 /usr/lib64/libnss_altfiles.so # ldconfig
# cd /usr/local/etc # wget https://XXXX/.../passwd # wget https://XXXX/.../group (group は 必要な物だけ /etc/group を編集しても良い)
- /etc/nsswitch.conf
passwd: files altfiles group: files altfiles
- ユーザアカウントの整合性を取る.
- システム(Containerを動かすホスト上)のユーザとユーザ名,ユーザIDが被っていないかチェックする.
- システム(Containerを動かすホスト上)のユーザとユーザ名,ユーザIDが被っていないかチェックする.
LTI Authenticator
- Moodle と連携する為の 認証モジュール(Moodleの外部サービスを使用)
- 先に authlib を入れておく.
- conda install oauthlib or pip install oauthlib
- v1.5.0 release
- v1.2.0 release (2021 9/2)
- https://pypi.org/project/jupyterhub-ltiauthenticator/1.2.0/
- Moodle に対して Patch 不要
(jupyterhub)# pip install --upgrade jupyterhub-ltiauthenticator
- Jupyterhub_conifg.py
# for LTI v1.2.0 c.JupyterHub.authenticator_class = 'ltiauthenticator.LTIAuthenticator' c.LTI11Authenticator.consumers = { "b18e82ec683724743236fade71350720029a29144a585c66f6741d8e9c6e0d83" : "c0fe2924dbb0f4701d898d36aaf9fd89c7a3ed3a7db6f0003d0e825a7eccb41c" } c.LTI11Authenticator.username_key = 'ext_user_username'
old
- ltiauthenticator-1.0.0.path は MDLDockerSpanwer に同梱
pip install jupyterhub-ltiauthenticator cd ......./ltiauthenticator patch -p1 < ~/mdldockerspawner/etc/ltiauthenticator-1.0.0.path
Culler(option)
- オプション機能.無くても良い.
- 接続の切れた docker コンテナを削除する
- 使用しない場合は,LTIDockerSpawner/LTIPodmanSpawner の設定ファイルの該当部分をコメントアウトする.
cull_idle_servers.py
- https://github.com/jupyterhub/jupyterhub/tree/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle
- 色々と試した中ではこれが一番良かった.
- wget で DLして /usr/local/bin にコピー
pip3 install wheel pip3 install pycurl (pthon3-devel が必要) 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
連携拡張 by NSL
- MS Windows のことは何も考慮していませんので,MS Windowsでは多分動きません.
Moodle
- LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも docker-ce-cli/docker-cli がインストールされている必要がある.
- LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも podman-remote がインストールされている必要がある.
LTIContainerSpawner
- Moodle(その他の LTIコンシューマ) と JupyterHub の連携をとるための Spawner クラス.
- LTIContainerSpawner は LTIDockerSpawner と LTIPodmanSpawner を纏めた呼び方.
- LTIContainerSpawner = LTIDockerSpawner + LTIPodmanSpawner
git clone https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner.git cd lticontainerspawner/ make
LTIDockerSpawner
- JupyterHub/SystemUserSpawner クラスを継承.
- 現時点(2021/10)では etc/jupyterhub_docker_config.py の中で実装
LTIPodmanSpawner
- Podman が使用可能
- JupyterHub/Spawner クラスを継承
- niklas netter 氏の podmanspawner を利用 (very thanks!)
- 現時点(2021/10) では pod の起動に Popen() を使用している.
- 設定ファイルは etc/jupyter_podman_config.py
機能
- ユーザグループ機能の完全サポート
- Moodle(その他の LTIコンシューマ)からの LTI カスタムパラメータを受信して動作.
- 環境変数を使用した start.sh による Jupyter Lab/Notebook コンテナの動作制御.
- 以下の機能をコースの外部サービス毎に設定可能
- 教師ユーザと学生ユーザの分離.
- ユーザ毎の Volume のマウント,及びアクセス権(教師と学生)の設定.
- 教材の配布と収集に便利
- ユーザの作業用 Volumeの設定
- Volume への任意名でのアクセス.
- 起動イメージのリモート選択.表示名のフィルタリング.Jupyter Lab/Notebook でないイメージを選択すると漏れなく死にます
- 起動 URL(Lab/Notebook)の選択.
iframe サポート一部のみサポート:動くための条件がシビア(tornado のバージョンやブラウザの種類によって条件が変わる)- CPU/Momery の制限
Volume 名に関する制約
- ボリューム名には小文字のアルファベット・数字以外は使用できない.特殊文字も使用できない.(snake_case)
- 大文字のボリューム名は小文字に変換される.
- ボリュームに対して同じボリューム名・アクセス名を指定した場合は,最初の物が優先される.
- 一個の JupyterHub に対して複数の Moodle からのアクセスをサポート
- アクセス名の先頭に - を付けた場合は,教師ユーザのみシンボリックリンクが張られる
- 注)アクセス名:ボリュームへ張られるシンボリックリンクの名前
注意事項
- iframe
Moodle で埋め込み(iframe)表示を行う場合は,Moodle と JupyterHub を同じホストにするか,Moodle のホスト上で feserver を動かす.iframe 対応.ただし tornado が cookie の samesite を解釈可能なこと.(python3.8以上)- tornado のバージョンやブラウザの種類によって条件が変わるので,部分的サポートとする.
起動
- jupyterhub -f lticontainerspawner/etc/jupyterhub_docker_config.py
- jupyterhub -f lticontainerspawner/etc/jupyterhub_podman_config.py
mod_lticontainer
- MDLDockerSpawner/LTIPodmanSpawner サポート用 Moodleモジュール
- docker のリモート制御について
- docker クライアント(docker-cd-cli : /usr/bin/docker) が必要
- dockerd が動いているホストに ssh できる,ホスト上のユーザ(dockerのソケットのグループに所属)が必要
- podman のリモート制御について
- podman コマンド(podman-remote) が必要
- podman が動いているホストに ssh できる,ホスト上のユーザ(podmanのソケットのグループに所属)が必要
機能
- LTI のカスタムパラメータ管理
- Docker/Podman のリモート制御
- イメージの一覧の取得
- Volume 管理(作成,表示,削除)
- WebService
- feserver (feplg_nbws.so)からのデータを XML-RPC で受信し,データベースに格納
- データ利用については 未実装.
- https://docs.moodle.org/dev/Charts_API
Docker を使う場合
- JupyterHub/Docker が起動するホスト上にアクセス用ユーザを用意する.
アクセス用ユーザのホームディレクトリについて,アクセス用ユーザが書き込み可能であること.CentOS8 で嵌った.ユーザを dockerにしたんだが,dockerのホームディレクトリなのに,dockerが書き込み可能でなかった.(勘違い?)
- アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため).
- アクセス用ユーザのログインシェルは不要-- アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため).
- アクセス用ユーザのログインシェルは不要
- Webサーバの実効ユーザが自分のホームディレクトリについて,書き込み可能であること.
Podman を使う場合
- JupyterHub/Podman が起動するホスト上にアクセス用ユーザを用意する.
- アクセス用ユーザのログインシェルは不要
- Moodleホストからのアクセスには podman-remote か podman --remote コマンドを使用する
- Webサーバの実効ユーザが自分のホームディレクトリについて,書き込み可能であること.
- Podman が起動するホスト上の socket は /var/run/podman/podman.sock
- /var/run/podman/ のパーミッションを drwxrws--- とし,グループを root 以外に設定.
- socket を読み書きできるアクセス用ユーザを作成する(グループが同じになるようにする).
- 例えば podman グループ(アクセス用ユーザはこのグループに参加する必要がある)を作成した場合 (root podman drwxrws---)
- /usr/lib/systemd/system/podman.socket
[Unit] Description=Podman API Socket Documentation=man:podman-system-service(1) [Socket] ExecStartPre=/usr/bin/chgrp podman /var/run/podman ExecStartPre=/usr/bin/chmod g+rwxs /var/run/podman ListenStream=%t/podman/podman.sock SocketMode=0660 [Install] WantedBy=sockets.target
# adduser podman # passwd podman # vi /usr/lib/systemd/system/podman.socket # mkdir /var/run/podman # systemctl enable podman # systemctl start podman
- Trouble
- podman.socket が勝手に再起動を繰り返す.
- 再起動する度に /var/run/podman が作り直されるので,パーミッションが rwx------ に戻ってしまう.
- 制御用のユーザプロセスが ソケットにアクセスできなくなる.
- これは CentOS7 での現象(バージョンが古いせいかも).CentOS8では問題なし.
- これは CentOS7 での現象(バージョンが古いせいかも).CentOS8では問題なし.
Ltictr_Proxy
- feserver + feplg_nbws.so の代わりとなる Ltictr_Proxy を作成したので,今後はこちらを用いる(2022/2/13)
参考:feserver
- feserver フロントエンドサーバ(TCP中継サーバ)
- MITM 的動作を行う私的試験用ツール.(一応公開もしている. svn co http://www.nsl.tuis.ac.jp/svn/linux/feserver/trunk feserver)
- 各種モジュールを読み込むことにより,色々な通信データの処理が可能.
- コンパイルに JunkBox_Lib が必要
# svn co http://www.nsl.tuis.ac.jp/svn/linux/JunkBox_Lib/trunk JunkBox_Lib # cd JunkBox_Lib # ./config.sh # ./configure --enable-ssl # make # cd .. # svn co http://www.nsl.tuis.ac.jp/svn/linux/feserver/trunk feserver # cd feserver # make # vi nbsw.conf # ./fesvr ...... -m feplg_nbws.so --conf nbsw.conf
起動例
- ./fesvr -h 172.22.1.75:8000 -p 9000 -m feplg_nbws.so -c -s --conf nbsw.conf
- Usage... ./fesvr -h host_name[:port] -p port -m module_path [-s] [-c] [-i] [-u user] [-f pid_file] [-d] [--conf config_file] [--cert cert_file] [--key key_file]
- -h : サーバFQDN + ポート番号.サーバのポート番号を省略した場合は,ローカルポートの番号と同じになる.必須
- -p : ローカルポート番号.必須
- -m : 処理モジュール.必須
- -u : 実効ユーザ名
- -i : デーモンモードを無効化.スーパデーモン経由で使用する場合に指定する
- -d : デバッグモード.喧しモード.
- -s : サーバに対してSSL/TLS接続になる(fesrv はSSL/TLSクライアントとなる).サーバ証明書の検証は行わない.
- -c : クライアントに対してSSL/TLS接続になる(fesrv はSSL/TLSサーバとなる).
- --conf : 設定ファイル指定
- --cert : -c を指定した場合のサーバ証明書:PEM形式.設定ファイル内でも指定可能. デフォルトは /etc/pki/tls/certs/server.pem
- --key : -c を指定した場合のサーバの秘密鍵:PEM形式.設定ファイル内でも指定可能. デフォルトは /etc/pki/tls/private/key.pem
feplg_nbws.so モジュール
- Moodle と JupyterHub の中間に位置し,通信情報(主に WebSocktの通信情報)を収集して XML-RPC で Moodle に返すためのモジュール
- ユーザから見ると,リバースプロキシのように見える.
- 機能
- 通信の中継
- WebSocket 通信の解析.
- HTTP(S)通信の解析.
- Cookie の挿入.
- Moodle への XML-RPC 通信.(MoodleのWebサービスを使用)
feplg_nbws.so の 設定ファイル(nbws.conf)
- Moodle_Host = XML-RPC を行うホスト名(FQDNまたはIPアドレス).デフォルトは localhost
- Moodle_Port = XML-RPC を行うホストのポート番号.デフォルトは 80
- Moodle_TLS = XML-RPC を行う際に HTTPS を使用するかどうか.デフォルトは FALSE.
- 注:HTTPS通信を行う場合,相手(Moodleホスト)のサーバ証明書は検証しない.
- Moodle_URL = XML-RPC を行うURLのディレクトリ情報.デフォルトは /webservice/xmlrpc/server.php
- Moodle_Token = Moodle から発行されたトークン.下記参照(必須)
- Moodle_DBAns = XML-RPC を行った場合の返答を表示するかどうか.デバッグ用.デフォルトは FALSE
- Moodle_Servide = XML-RPC のサービス名.デフォルトから変更する必要はない.変更すると動かなくなる.デバッグ用.デフォルトは mod_mdlds_write_nbdata
- Moodle_HTTP = XML-RPC を行う際の HTTPのプロトコルバージョン.1.1 か 1.0 を指定.多分 1.1 で問題ない.デフォルトは 1.1
- 以下,各モジュール共通の設定.コマンドラインで指定した場合は,そちらが優先.
- Fesvr_Server_Cert = Feserver 本体用の設定.HTTPS通信を行う場合のサーバ証明書(PEM形式)
- デフォルトは /etc/pki/tls/certs/server.pem
- Fesvr_Private_Key = Feserver 本体用の設定.HTTPS通信を行う場合の秘密鍵ファイル(PEM形式)
- デフォルトは /etc/pki/tls/private/key.pem
- Fesvr_Server_Cert = Feserver 本体用の設定.HTTPS通信を行う場合のサーバ証明書(PEM形式)
Moodle 側の設定 (Webサービスを利用するためのトークンの取得)
- 管理者IDで「サイト設定」 -> 「プラグイン」 -> 「ウェブサービス」 -> 「外部サービス」
- 「Jupyter Lab/Notebook Data」の項目を確認
- 「Jupyter Lab/Notebook Data」の 「許可ユーザ」をクリック
- 適当なユーザ(教師ロールのユーザ)を選択し,許可ユーザとする
- ウェブサービスのメニューまで戻って,「トークンを管理する」を選択.
- 「追加」をクリック.
- ユーザ名に先程選択したユーザ名を入れる.
- サービスは「Jupyter Lab/Notebook Data」を選択
- 「変更を保存する」をクリック
- 「トークンを管理する」まで戻ると,ユーザ用のトークンができているので,それをコピーする.
- トークンは feplg_nbws の設定ファイルの Moodle_Token に設定する.
- 「追加」をクリック.
ipynb_conv
- ipynb ファイルの(コード)タグに解析用の通し番号を入れるツール
- LTIContainerSpawner に同梱(C言語)
phpバージョンもあり (現時点で使用予定なし.サンプルコード)- PHPバージョンは,C言語バージョンにバグがあった場合の保険.(最初から PHPバージョンを使えと言う指摘は最もですが.... C言語バージョンを折角作ったので....)
- PHPバージョンは,C言語バージョンにバグがあった場合の保険.(最初から PHPバージョンを使えと言う指摘は最もですが.... C言語バージョンを折角作ったので....)
Jupyter Lab/Notebook コンテナイメージ
- 機能を全て利用するには,専用の(start.sh を入れ替えた)コンテナイメージが必要.
- MDLDockerSpawner に Dokerfile 同梱
- JupyterHub/devel
- start.sh 入れ替え後でも,通常の DockerSpanwer で問題なく起動できるようにしたい(下位互換性)
Example
- Rocky Linux
- Debian
Counter: 1924,
today: 1,
yesterday: 2
最終更新: 2024-04-17 (水) 20:19:46 (JST) (150d) by iseki