flagflag  If you want to see English page, please click "English" Button at Left.
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


トップ   凍結 差分 バックアップ 複製 名前変更 リロード   新規 ページ一覧 単語検索 最終更新   ヘルプ   最終更新のRSS 1.0 最終更新のRSS 2.0 最終更新のRSS Atom
Counter: 1792, today: 1, yesterday: 1
最終更新: 2024-04-17 (水) 20:19:46 (JST) (31d) by iseki

サイト内 検索

ログイン

ユーザー名:

パスワード:


パスワード紛失
新規登録

サブ メニュー

ミニカレンダー

前月2024年 5月翌月
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 31
<今日>

オンライン状況

38 人のユーザが現在オンラインです。 (11 人のユーザが xpwiki を参照しています。)

登録ユーザ: 0
ゲスト: 38

もっと...

アクセスカウンタ

今日 : 1869186918691869
昨日 : 5790579057905790
総計 : 2365466523654665236546652365466523654665236546652365466523654665
Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project
Design by XoopsDesign.com