flagflag  
Page Top

Moodle & JupyterHub 連携 anchor.png

  • 現行システムは JupyterHub-2.3.1, 3.1.1 では動作するが,4.0.0 では動作しない
    • 動くようになりました.
Page Top

最新メモ anchor.png

Page Top
2023/05/07 anchor.png
  • 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.p​y の関数 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"):
       
Page Top

GitHub anchor.png

Page Top

Gitlab anchor.png

Page Top

既存システム anchor.png

Page Top

Moodle anchor.png

  • Moodle 3.5以上(それ未満でも動くかもしれない.要 LTIサポート)
  • JupyterHub が動くホストとは別のホストでもOK
  • 外部サービス,Webサービスを使用する.
  • LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも docker-ce-cli/docker-cli がインストールされている必要がある.
  • LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも podman-remote がインストールされている必要がある.
     
 
Page Top
外部サービス anchor.png
  • LTI 認証モジュールと連携して SSOを実現する.
  • 管理者IDで,「サイト管理」=> 「プラグイン」=> 「外部ツール:ツールを管理する」(=>「ツールを手動設定する」)
    • デフォルト起動コンテナは「新しいウィンドウ」にする.
       
Page Top
Webサービス anchor.png
  • Option
  • Feserver からの XML-RPC を受け入れて,データをDBに格納する.
    • データ収集を行わない(Feserverを使用しない)なら,不必要
       
Page Top

Container anchor.png

  • Docker または Podman が使用可能
     
Page Top
Docker anchor.png
  • 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
     
Page Top
Podman anchor.png
  • CentOS8
    (base) # dnf -y install podman
    (base) # dnf -y install podman-remote
    (base) # dnf -y install podman-docker
 
Page Top
with pip anchor.png
# 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
Page Top
with conda anchor.png
(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   #(必要なら)
Page Top
設定&起動 anchor.png
  • 作業ディレクトリ
    • 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
       
Page Top
SystemUserSpawner anchor.png
  • 最新版では未使用
  • Container として Docker を使用する場合に必要.Podman を使用する場合は不要.
    • JupyterHub の DockerSpawner を継承.
      • システムのユーザを使用可能.
      • システムのユーザのホーム領域をマウント可能.
Page Top

NSS anchor.png

  • ユーザ情報として /etc/passwd(/etc/group) の情報が必要
  • システム(Containerを動かすホスト上)のユーザでなくても良い.
    • LDAP か下記の altfiles を使用する
       
Page Top
altfiles anchor.png
  • ユーザの 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が被っていないかチェックする.
       
Page Top

LTI Authenticator anchor.png

  • Moodle と連携する為の 認証モジュール(Moodleの外部サービスを使用)
  • 先に authlib を入れておく.
    • conda install oauthlib or pip install oauthlib
(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'
Page Top
old anchor.png
  • ltiauthenticator-1.0.0.path は MDLDockerSpanwer に同梱
    pip install jupyterhub-ltiauthenticator
    cd ......./ltiauthenticator
    patch -p1 < ~/mdldockerspawner/etc/ltiauthenticator-1.0.0.path
     
Page Top

Culler(option) anchor.png

  • オプション機能.無くても良い.
  • 接続の切れた docker コンテナを削除する
  • 使用しない場合は,LTIDockerSpawner/LTIPodmanSpawner の設定ファイルの該当部分をコメントアウトする.
 
Page Top
cull_idle_servers.py anchor.png
Page Top

連携拡張 by NSL anchor.png

  • MS Windows のことは何も考慮していませんので,MS Windowsでは多分動きません.
     
Page Top

Moodle anchor.png

  • LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも docker-ce-cli/docker-cli がインストールされている必要がある.
  • LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも podman-remote がインストールされている必要がある.
     
Page Top

LTIContainerSpawner anchor.png

  • Moodle(その他の LTIコンシューマ) と JupyterHub の連携をとるための Spawner クラス.
  • LTIContainerSpawner は LTIDockerSpawner と LTIPodmanSpawner を纏めた呼び方.
    • LTIContainerSpawner = LTIDockerSpawner + LTIPodmanSpawner
git clone https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner.git
cd lticontainerspawner/
make 
 
Page Top
LTIDockerSpawner anchor.png
  • JupyterHub/SystemUserSpawner クラスを継承.
  • 現時点(2021/10)では etc/jupyterhub_docker_config.py の中で実装
     
Page Top
LTIPodmanSpawner anchor.png
  • 現時点(2021/10) では pod の起動に Popen() を使用している.
  • 設定ファイルは etc/jupyter_podman_config.py
     
Page Top
機能 anchor.png
  • ユーザグループ機能の完全サポート
  • Moodle(その他の LTIコンシューマ)からの LTI カスタムパラメータを受信して動作.
  • 環境変数を使用した start.sh による Jupyter Lab/Notebook コンテナの動作制御.
     
  • 以下の機能をコースの外部サービス毎に設定可能
    • 教師ユーザと学生ユーザの分離.
    • ユーザ毎の Volume のマウント,及びアクセス権(教師と学生)の設定.
      • 教材の配布と収集に便利
    • ユーザの作業用 Volumeの設定
    • Volume への任意名でのアクセス.
    • 起動イメージのリモート選択.表示名のフィルタリング.Jupyter Lab/Notebook でないイメージを選択すると漏れなく死にます :-o
    • 起動 URL(Lab/Notebook)の選択.
    • iframe サポート 一部のみサポート:動くための条件がシビア(tornado のバージョンやブラウザの種類によって条件が変わる)
    • CPU/Momery の制限
       
Page Top
Volume 名に関する制約 anchor.png
  • ボリューム名には小文字のアルファベット・数字以外は使用できない.特殊文字も使用できない.(snake_case)
  • 大文字のボリューム名は小文字に変換される.
  • ボリュームに対して同じボリューム名・アクセス名を指定した場合は,最初の物が優先される.
  • 一個の JupyterHub に対して複数の Moodle からのアクセスをサポート
  • アクセス名の先頭に - を付けた場合は,教師ユーザのみシンボリックリンクが張られる
  • 注)アクセス名:ボリュームへ張られるシンボリックリンクの名前
     
Page Top
注意事項 anchor.png
  • iframe
    • Moodle で埋め込み(iframe)表示を行う場合は,Moodle と JupyterHub を同じホストにするか,Moodle のホスト上で feserver を動かす.
    • iframe 対応.ただし tornado が cookie の samesite を解釈可能なこと.(python3.8以上)
    • tornado のバージョンやブラウザの種類によって条件が変わるので,部分的サポートとする.
       
Page Top
起動 anchor.png
  • jupyterhub -f lticontainerspawner/etc/jupyterhub_docke​r_config.py
  • jupyterhub -f lticontainerspawner/etc/jupyterhub_podma​n_config.py
     
Page Top

mod_lticontainer anchor.png

  • MDLDockerSpawner/LTIPodmanSpawner サポート用 Moodleモジュール
  • docker のリモート制御について
    • docker クライアント(docker-cd-cli : /usr/bin/docker) が必要
    • dockerd が動いているホストに ssh できる,ホスト上のユーザ(dockerのソケットのグループに所属)が必要
  • podman のリモート制御について
    • podman コマンド(podman-remote) が必要
    • podman が動いているホストに ssh できる,ホスト上のユーザ(podmanのソケットのグループに所属)が必要
       
Page Top
機能 anchor.png
  • LTI のカスタムパラメータ管理
  • Docker/Podman のリモート制御
    • イメージの一覧の取得
    • Volume 管理(作成,表示,削除)
  • WebService
    • feserver (feplg_nbws.so)からのデータを XML-RPC で受信し,データベースに格納
    • データ利用については 未実装
  • https://docs.moodle.org/dev/Charts_API
 
Page Top
Docker を使う場合 anchor.png
  • JupyterHub/Docker が起動するホスト上にアクセス用ユーザを用意する.
    • アクセス用ユーザのホームディレクトリについて,アクセス用ユーザが書き込み可能であること.
      • CentOS8 で嵌った.ユーザを dockerにしたんだが,dockerのホームディレクトリなのに,dockerが書き込み可能でなかった. (勘違い?)
    • アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため).
    • アクセス用ユーザのログインシェルは不要-- アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため).
    • アクセス用ユーザのログインシェルは不要
  • Webサーバの実効ユーザが自分のホームディレクトリについて,書き込み可能であること.
 
Page Top
Podman を使う場合 anchor.png
  • 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では問題なし.
         
Page Top

Ltictr_Proxy anchor.png

  • feserver + feplg_nbws.so の代わりとなる Ltictr_Proxy を作成したので,今後はこちらを用いる(2022/2/13)
     
Page Top

参考:feserver anchor.png

  • feserver フロントエンドサーバ(TCP中継サーバ)
  • MITM 的動作を行う私的試験用ツール.(一応公開もしている. svn co http://www.nsl.tuis.ac.jp/svn/linux/fese​rver/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
     
Page Top
起動例 anchor.png
  • ./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
       
Page Top
feplg_nbws.so モジュール anchor.png
  • Moodle と JupyterHub の中間に位置し,通信情報(主に WebSocktの通信情報)を収集して XML-RPC で Moodle に返すためのモジュール
  • ユーザから見ると,リバースプロキシのように見える.
  • 機能
    • 通信の中継
    • WebSocket 通信の解析.
    • HTTP(S)通信の解析.
    • Cookie の挿入.
    • Moodle への XML-RPC 通信.(MoodleのWebサービスを使用)
       
Page Top
feplg_nbws.so の 設定ファイル(nbws.conf) anchor.png
  • 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
 
Page Top
Moodle 側の設定 (Webサービスを利用するためのトークンの取得) anchor.png
  1. 管理者IDで「サイト設定」 -> 「プラグイン」 -> 「ウェブサービス」 -> 「外部サービス」
    1. 「Jupyter Lab/Notebook Data」の項目を確認
    2. 「Jupyter Lab/Notebook Data」の 「許可ユーザ」をクリック
      1. 適当なユーザ(教師ロールのユーザ)を選択し,許可ユーザとする
  2. ウェブサービスのメニューまで戻って,「トークンを管理する」を選択.
    1. 「追加」をクリック.
      1. ユーザ名に先程選択したユーザ名を入れる.
      2. サービスは「Jupyter Lab/Notebook Data」を選択
      3. 「変更を保存する」をクリック
    2. 「トークンを管理する」まで戻ると,ユーザ用のトークンができているので,それをコピーする.
    3. トークンは feplg_nbws の設定ファイルの Moodle_Token に設定する.
 
Page Top

ipynb_conv anchor.png

  • ipynb ファイルの(コード)タグに解析用の通し番号を入れるツール
  • LTIContainerSpawner に同梱(C言語)
  • phpバージョンもあり (現時点で使用予定なし.サンプルコード)
    • PHPバージョンは,C言語バージョンにバグがあった場合の保険.(最初から PHPバージョンを使えと言う指摘は最もですが.... C言語バージョンを折角作ったので....)
       
Page Top

Jupyter Lab/Notebook コンテナイメージ anchor.png

  • 機能を全て利用するには,専用の(start.sh を入れ替えた)コンテナイメージが必要.
  • MDLDockerSpawner に Dokerfile 同梱
  • JupyterHub​/devel
     
  • start.sh 入れ替え後でも,通常の DockerSpanwer で問題なく起動できるようにしたい(下位互換性)
     
Page Top

Trouble Shooting anchor.png

Page Top

mod_lticontainer anchor.png

Page Top
500 Server Error anchor.png
  • mod_lticontainer でユーザを削除する.
     
Page Top
local user で JupyterHubにアクセスできない.アクセスバーは途中まで. anchor.png
  • ホームディレクトリ内のドット付きディレクトリのユーザを調べる.
  • 本来のオーナでない場合は,修正する.
     
Page Top

Setup anchor.png

Page Top

Example anchor.png


Front page   Freeze Diff Backup Copy Rename Reload   New List of Pages Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 1776, today: 2, yesterday: 1
Last-modified: 2024-04-17 (Wed) 20:19:46 (JST) (11d) by iseki

Site Search

Login

Username:

Password:


Lost Password?
Register now!!

Sub Menu

mini Calendar

Last MonthApr 2024Next Month
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Today

Who's Online

87 user(s) are online (26 user(s) are browsing xpwiki)

Members: 0
Guests: 87

more...

Access Counter

Today : 7239723972397239
Yesterday : 1529415294152941529415294
Total : 2340193923401939234019392340193923401939234019392340193923401939
Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project
Design by XoopsDesign.com