13: 2021-09-05 (Sun) 00:18:15 iseki  |
Cur: 1970-01-01 (Thu) 18:00:00  |
- | * Moodle & JupyterHub 連携 [#t72c88ce] | |
- | - LTI カスタムパラメータを使用した Moodle + JupyterHub 連携を研究中 | |
- | - iseki@rsch.tuis.ac.jp | |
| | | |
- | - [[Moodle]] | |
- | - [[JupyterHub]] | |
- | - [[Docker]] | |
- | - [[LTI]] | |
- | - [[LTI Hack>Moodle/Moodle-LTI]] | |
- | | |
- | - [[MDLDockerSpawner>JupyterHub/MDLDockerSpawner]] | |
- | - [[mod_mdlds]] | |
- | - [[feserver]] | |
- | #br | |
- | | |
- | ** 既存システム [#yb4a054d] | |
- | | |
- | *** [[Moodle]] [#y96f887e] | |
- | - Moodle 3.5以上(それ未満でも動くかもしれない.要 LTIサポート) | |
- | - JupyterHub が動くホストとは別のホストでもOK | |
- | - 外部サービス,Webサービスを使用する. | |
- | #br | |
- | | |
- | **** 外部サービス [#ia78ee48] | |
- | - LTI 認証モジュールと連携して SSOを実現する. | |
- | - 管理者IDで,「サイト管理」=> 「プラグイン」=> 「外部ツール:ツールを管理する」(=>「ツールを手動設定する」) | |
- | -- デフォルト起動コンテナは「新しいウィンドウ」にする. | |
- | #br | |
- | | |
- | **** Webサービス [#k4138c47] | |
- | - Feserver からの XML-RPC を受け入れて,データをDBに格納する. | |
- | #br | |
- | | |
- | *** [[Docker]] [#cd2ef212] | |
- | **** CentOS8 [#ufeb99f8] | |
- | (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 | |
- | #br | |
- | | |
- | *** [[JupyterHub]]/[[SystemUserSpawner>JupyterHub/SystemUserSpawner]] [#z52a6900] | |
- | **** [[JupyterHub]] [#m57f62f0] | |
- | (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 | |
- | -- jupyterhub -f jupyterhub_config.py | |
- | #br | |
- | | |
- | **** [[SystemUserSpawner>JupyterHub/SystemUserSpawner]] [#m07110de] | |
- | - JupyterHub の DockerSpawner を継承. | |
- | -- システムのユーザを使用可能. | |
- | -- システムのユーザのホーム領域をマウント可能. | |
- | | |
- | - 2021 7/12(またはそれ以降) 版推奨 | |
- | - https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/systemuserspawner.py | |
- | - JupyterHub のインストールで,一緒にインストールされる.(バージョンが古い場合は手動インストール) | |
- | | |
- | - SystemUserSpawner を動かすには /etc/passwd(/etc/group) 情報が必要 | |
- | -- LDAP か下記の altfiles を使用する | |
- | #br | |
- | | |
- | **** [[altfiles>NSS]] [#n90bdca5] | |
- | - 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://el.mml.tuis.ac.jp/system/passwd | |
- | # wget https://el.mml.tuis.ac.jp/system/group (group は 必要な物だけ /etc/group を編集しても良い) | |
- | | |
- | - /etc/nsswitch.conf | |
- | passwd: files altfiles | |
- | group: files altfiles | |
- | - ユーザアカウントの整合性を取る. | |
- | #br | |
- | | |
- | **** [[LTI]] [#g284e3bf] | |
- | - Moodle と連携する為の 認証モジュール(Moodleの外部サービスを使用) | |
- | - 先に authlib を入れておく. | |
- | -- conda install oauthlib | |
- | | |
- | - v1.2.0 release (2021 9/2) | |
- | -- https://pypi.org/project/jupyterhub-ltiauthenticator/1.2.0/ | |
- | -- Patch 不要 | |
- | | |
- | (jupyterhub)# pip install jupyterhub-ltiauthenticator==1.2.0 | |
- | | |
- | - 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 [#i7f50c71] | |
- | - ltiauthenticator-1.0.0.path は MDLDockerSpanwer に同梱 | |
- | pip install jupyterhub-ltiauthenticator | |
- | cd ......./ltiauthenticator | |
- | patch -p1 < ~/mdldockerspawner/etc/ltiauthenticator-1.0.0.path | |
- | #br | |
- | | |
- | **** cull_idle_servers.py [#n8a3f52c] | |
- | - [[cull_idle_servers>JupyterHub/DockerSpawner#zc9428f7]] | |
- | - 接続の切れた docker コンテナを削除 | |
- | | |
- | - https://github.com/jupyterhub/jupyterhub/tree/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle | |
- | - wget で DLして /usr/local/bin にコピー | |
- | -- wget https://raw.githubusercontent.com/jupyterhub/jupyterhub/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle/cull_idle_servers.py | |
- | #br | |
- | | |
- | ** 連携拡張 by [[NSL]] [#ma810a39] | |
- | - MS Windows のことは何も考慮していませんので,MS Windowsでは多分動きません. | |
- | #br | |
- | | |
- | *** [[MDLDockerSpawner>JupyterHub/MDLDockerSpawner]] [#k758b918] | |
- | - https://gitlab.nsl.tuis.ac.jp/iseki/mdldockerspawner | |
- | | |
- | - [[Moodle]] と [[JupyterHub]] の連携をとるための Spawner クラス. | |
- | - [[SystemUserSpawner>JupyterHub/SystemUserSpawner]] クラスを継承. | |
- | - 現時点(2021/08)では jupyterhub_config.py の中で実装 | |
- | #br | |
- | | |
- | **** 機能 [#o44dc5d5] | |
- | - ユーザグループ機能の完全サポート | |
- | - Moodle からの LTI カスタムパラメータを受信して動作. | |
- | - 環境変数を使用した start.sh による Jupyter Lab/Notebook コンテナの動作制御. | |
- | #br | |
- | - 教師ユーザと学生ユーザの分離. | |
- | - ユーザ毎の Volume のマウント,及びアクセス権(教師と学生)の設定. | |
- | -- 教材の配布と収集に便利 | |
- | - Volume への任意名でのアクセス. | |
- | - 起動イメージのリモート選択.Jupyter Lab/Notebook でないイメージを選択すると漏れなく死にます :-o | |
- | - 起動 URL(Lab/Notebook)のリモート選択. | |
- | - iframe サポート | |
- | #br | |
- | | |
- | **** Volume 名に関する制約 [#q7b847fc] | |
- | - ボリューム名には小文字のアルファベット・数字以外は使用できない.特殊文字も使用できない. | |
- | - 大文字のボリューム名は小文字に変換される. | |
- | - 同じボリューム名・アクセス名を指定した場合は,最初の物が優先される. | |
- | - 一個の JupyterHub に対して複数の Moodle からのアクセスをサポート | |
- | | |
- | #br | |
- | | |
- | **** 注意事項 [#n57178a3] | |
- | - Moodle で埋め込み(iframe)表示を行う場合は,Moodle と JupyterHub を同じホストにするか,Moodle のホスト上で feserver を動かす. | |
- | #br | |
- | | |
- | **** 起動 [#bdc8edbc] | |
- | - jupyterhub -f mdldockerspawner/etc/jupyterhub_config.py | |
- | #br | |
- | | |
- | *** [[mod_mdlds]] [#hbfc4f2f] | |
- | - https://gitlab.nsl.tuis.ac.jp/iseki/mod_mdlds | |
- | | |
- | - MDLDockerSpawner サポート用 Moodleモジュール | |
- | | |
- | - docker のリモート制御について | |
- | -- docker クライアント(/usr/bin/docker)が必要 | |
- | -- dockerd が動いているホストに ssh できる,ホスト上のユーザ(dockerグループに所属)が必要 | |
- | #br | |
- | | |
- | **** 機能 [#m538ed2a] | |
- | - LTI のカスタムパラメータ管理 | |
- | - Docker のリモート制御 | |
- | -- イメージの一覧の取得 | |
- | -- Volume 管理(作成,表示,削除) | |
- | - WebService | |
- | -- feserver (feplg_nbws.so)からのデータを XML-RPC で受信し,データベースに格納 | |
- | -- データ利用については ''&font(Red){未実装};''. | |
- | - https://docs.moodle.org/dev/Charts_API | |
- | | |
- | #br | |
- | | |
- | *** [[feserver]] [#va0d030b] | |
- | - http://www.nsl.tuis.ac.jp/svn/linux/feserver/trunk | |
- | | |
- | - feserver フロントエンドサーバ(TCP中継サーバ) | |
- | - MITM 的動作を行う私的試験用ツール.(一応公開もしている) | |
- | - 各種モジュールを読み込むことにより,色々な通信データの処理が可能. | |
- | - コンパイルに [[JunkBox_Lib]] が必要 | |
- | #br | |
- | **** 起動例 [#d9e04c03] | |
- | - ./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/postfix.pem | |
- | -- --key : -c を指定した場合のサーバの秘密鍵:PEM形式.デフォルトは /etc/pki/tls/private/postfix.key | |
- | #br | |
- | | |
- | **** feplg_nbws.so モジュール [#abc6a346] | |
- | - Moodle と JupyterHub の中間に位置し,通信情報(主に WebSocktの通信情報)を収集して XML-RPC で Moodle に返すためのモジュール | |
- | - ユーザから見ると,リバースプロキシのように見える. | |
- | - 機能 | |
- | -- 通信の中継 | |
- | -- WebSocket 通信の解析. | |
- | -- HTTP(S)通信の解析. | |
- | -- Cookie の挿入. | |
- | -- Moodle への XML-RPC 通信.(MoodleのWebサービスを使用) | |
- | #br | |
- | | |
- | ***** feplg_nbws.so の 設定ファイル [#jce86de4] | |
- | - 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 | |
- | #br | |
- | - 以下,各モジュール共通の設定.コマンドラインで指定した場合は,そちらが優先. | |
- | -- Fesvr_Server_Cert = Feserver 本体用の設定.HTTPS通信を行う場合のサーバ証明書(PEM形式) | |
- | --- デフォルトは /etc/pki/tls/certs/postfix.pem | |
- | -- Fesvr_Private_Key = Feserver 本体用の設定.HTTPS通信を行う場合の秘密鍵ファイル(PEM形式) | |
- | ---デフォルトは /etc/pki/tls/private/postfix.key | |
- | | |
- | #br | |
- | | |
- | ***** Moodle 側の設定 (Webサービスを利用するためのトークンの取得)[#a1c43efd] | |
- | + 管理者IDで「サイト設定」 -> 「プラグイン」 -> 「ウェブサービス」 -> 「外部サービス」 | |
- | ++ 「Jupyter Lab/Notebook Data」の項目を確認 | |
- | ++ 「Jupyter Lab/Notebook Data」の 「許可ユーザ」をクリック | |
- | +++ 適当なユーザ(教師ロールのユーザ)を選択し,許可ユーザとする | |
- | + ウェブサービスのメニューまで戻って,「トークンを管理する」を選択. | |
- | ++ 「追加」をクリック. | |
- | +++ ユーザ名に先程選択したユーザ名を入れる. | |
- | +++ サービスは「Jupyter Lab/Notebook Data」を選択 | |
- | +++ 「変更を保存する」をクリック | |
- | ++ 「トークンを管理する」まで戻ると,ユーザ用のトークンができているので,それをコピーする. | |
- | ++ トークンは feplg_nbws の設定ファイルの Moodle_Token に設定する. | |
- | | |
- | #br | |
- | | |
- | *** ipynb_conv [#b15438d1] | |
- | - ipynb ファイルの(コード)タグに解析用の通し番号を入れるツール | |
- | - MDLDockerSpawner に同梱(C言語) | |
- | - phpバージョンもあり (現時点で使用予定なし.サンプルコード.) | |
- | #br | |
- | | |
- | *** Jupyter Lab/Notebook コンテナイメージ [#qc8d3ed8] | |
- | - 機能を全て利用するには,専用の(''start.sh'' を入れ替えた)コンテナイメージが必要. | |
- | - MDLDockerSpawner に Dokerfile 同梱 | |
- | - [[JupyterHub/devel]] | |
- | #br | |
- | - start.sh 入れ替え後でも,通常の DockerSpanwer で問題なく起動できるようにしたい(下位互換性) | |
- | #br | |