|
1: 2021-09-14 (火) 19:13:53 iseki |
| + | * 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://XXXX.tuis.ac.jp/.../passwd |
| + | # wget https://XXXX.tuis.ac.jp/.../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 |