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 | |