#author("2024-09-02T07:18:50+00:00","default:iseki","iseki") #author("2024-09-02T07:19:29+00:00","default:iseki","iseki") * Moodle & JupyterHub 連携 [#t72c88ce] ** Over View - LTI カスタムパラメータを使用した Moodle + JupyterHub 連携を研究中 - [[Moodle]] - [[JupyterHub]] - [[Docker]] - [[Podman]] - [[LTI]] - [[LTI Hack>Moodle/Moodle-LTI]] - [[LTIDockerSpawner>JupyterHub/LTIDockerSpawner]] - [[LTIPodmanSpawner>JupyterHub/LTIPodmanSpawner]] - [[mod_lticontainer]] - %%[[feserver]]%% - [[Ltictr_Proxy]] ** 最新メモ [#k8d9209c] *** Todo Works - JupyterLab のグループが rootになる(TEACHER になるべき) - JupyterLab コンテナが早期に終了する(health が関係?) - Moodle のグラフ選択の見直し *** Trouble **** Moodle 4.3.3 で JupyterLab にログインする途中で止まる(プログレスバーの表示で,半分くらいでタイムアウトする) - 不思議なことに 前のバージョンで作った外部ツールのインスタンスでは繋がる. - データベースを見たら mdl_lti の instructorchoicesendname が 1 だと繋がる. - サイト管理の「プラグイン」の外部ツールの設定で,「''プライバシー''」(Privacy)の「''ランチャ名をツールと共有する''」(Share launcher's name with tool)を「''常に''」(Always)にする. - なかなか焦る仕様変更だね. **** 2023/12/27 docker.errors.DockerException: Error while fetching server API version: request() got an unexpected keyword argument 'chunked'[#c2502fce] - エラーが出て全く繋がらん! けしからん! Proxy を作り直していたので,Proxyのせいかと思って半日潰した!! - requests が 2.30.0 だと動かんらしい. pip install requests==2.29.0 **** podman での Internal Server Error 500 [#v573988b] - /var/lib/containers/storage/overlay-containers/[[volatile-containers.json>/JupyterHub/volatile-containers.json]] でロックしている模様. - ロックを外すプログラムを [[LTIContainerSpawner>https://github.com/jupyter-fumihax/lticontainerspawner]] に実装(2023/12/27) **** 2023/05/07 [#mc229461] - 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>LTI#o7520050]] が使用できない.[[JupyterHub>JupyterHub#s373921d]] -- site-packages/jupyterhub/handlers/base.py の関数 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"): ** GitHub [#ad573858] *** LTIContainerSpawner [#r4c1946d] - https://github.com/jupyter-fumihax/lticontainerspawner - https://github.com/jupyter-fumihax/lticontainerspawner/wiki - 日本語: https://github.com/jupyter-fumihax/lticontainerspawner/wiki/LTIContainerSpawner-(J) *** mod_lticontainer [#mdf183de] - https://github.com/moodle-fumihax/mod_lticontainer - https://github.com/moodle-fumihax/mod_lticontainer/wiki - 日本語: https://github.com/moodle-fumihax/mod_lticontainer/wiki/mod_lticontainer-(J) ** 既存システム [#yb4a054d] *** [[Moodle]] [#y96f887e] - Moodle 3.5以上(それ未満でも動くかもしれない.要 LTIサポート) - JupyterHub が動くホストとは別のホストでもOK - 外部サービス,Webサービスを使用する. - LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも ''docker-ce-cli''/docker-cli がインストールされている必要がある. - LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも ''podman-remote'' がインストールされている必要がある. **** 外部サービス [#ia78ee48] - LTI 認証モジュールと連携して SSOを実現する. - 管理者IDで,「サイト管理」=> 「プラグイン」=> 「外部ツール:ツールを管理する」(=>「ツールを手動設定する」) -- デフォルト起動コンテナは「新しいウィンドウ」にする. **** Webサービス [#k4138c47] - Option - Feserver からの XML-RPC を受け入れて,データをDBに格納する. -- データ収集を行わない(Feserverを使用しない)なら,不必要 *** Container [#od457509] - Docker または Podman が使用可能 **** [[Docker]] [#cd2ef212] - 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 **** [[Podman]] [#k2bdffda] - CentOS8 (base) # dnf -y install podman (base) # dnf -y install podman-remote (base) # dnf -y install podman-docker *** [[JupyterHub]] [#z52a6900] **** with pip [#fe40fb20] # 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 jupyter # pip install --upgrade notebook # pip install --upgrade jupyterlab # pip install jupyterlab-language-pack-ja-JP # pip install jupyter_server_fileid # pip install jupyter_server_ydoc # jupyterhub --version # jupyter --version # jupyter notebook --version # jupyter lab --version - update # pip install --upgrade pip # pip install --upgrade jupyter # pip install --upgrade jupyterhub # pip install --upgrade dockerspawner # pip install --upgrade notebook # pip install --upgrade jupyterlab **** with conda [#b575bbb0] (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 #(必要なら) **** 設定&起動 [#qd28c9f2] - 作業ディレクトリ -- 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 **** %%[[SystemUserSpawner>JupyterHub/SystemUserSpawner]]%% [#m07110de] - ''最新版では未使用'' - ''Container として Docker を使用する場合に必要.Podman を使用する場合は不要.'' -- JupyterHub の DockerSpawner を継承. --- システムのユーザを使用可能. --- システムのユーザのホーム領域をマウント可能. -- 2021 7/12(またはそれ以降) 版推奨 -- https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/systemuserspawner.py -- JupyterHub のインストールで,一緒にインストールされる.(バージョンが古い場合は手動インストール) *** NSS [#x24645ee] - ユーザ情報として /etc/passwd(/etc/group) の情報が必要 - システム(Containerを動かすホスト上)のユーザでなくても良い. -- LDAP か下記の altfiles を使用する **** [[altfiles>NSS]] [#n90bdca5] - ユーザの 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が被っていないかチェックする. *** [[LTI Authenticator>LTI]] [#g284e3bf] - Moodle と連携する為の 認証モジュール(Moodleの外部サービスを使用) - 先に authlib を入れておく. -- conda install oauthlib or pip install oauthlib - v1.5.0 release -- https://pypi.org/project/jupyterhub-ltiauthenticator/1.5.0/ - v1.2.0 release (2021 9/2) -- https://pypi.org/project/jupyterhub-ltiauthenticator/1.2.0/ -- Moodle に対して Patch 不要 (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' ***** old [#i7f50c71] - ltiauthenticator-1.0.0.path は MDLDockerSpanwer に同梱 pip install jupyterhub-ltiauthenticator cd ......./ltiauthenticator patch -p1 < ~/mdldockerspawner/etc/ltiauthenticator-1.0.0.path *** Culler(option) [#w04c68db] - オプション機能.無くても良い. - 接続の切れた docker コンテナを削除する - 使用しない場合は,LTIDockerSpawner/LTIPodmanSpawner の設定ファイルの該当部分をコメントアウトする. -- [[cull_idle_servers>JupyterHub/DockerSpawner#zc9428f7]] **** cull_idle_servers.py [#n8a3f52c] - https://github.com/jupyterhub/jupyterhub/tree/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle -- 色々と試した中ではこれが一番良かった. - wget で DLして /usr/local/bin にコピー pip3 install wheel pip3 install pycurl (pthon3-devel が必要) wget https://raw.githubusercontent.com/jupyterhub/jupyterhub/a6b7e303df03865d6420f6bccdf627b39f1d0dc1/examples/cull-idle/cull_idle_servers.py cp cull_idle_servers.py /usr/local/bin chmod a+rx /usr/local/bin/cull_idle_servers.py ** 連携拡張 by [[NSL]] [#ma810a39] - MS Windows のことは何も考慮していませんので,MS Windowsでは多分動きません. *** Moodle [#dea0e11b] - LTIDockerSpawner を使用する場合はMoodle ホスト側に,少なくとも ''docker-ce-cli''/docker-cli がインストールされている必要がある. - LTIPodmanSpawner を使用する場合はMoodle ホスト側に,少なくとも ''podman-remote'' がインストールされている必要がある. *** [[LTIContainerSpawner>JupyterHub/LTIContainerSpawner]] [#va019dd5] - https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner -- git clone https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner.git - [[Moodle]](その他の LTIコンシューマ) と [[JupyterHub]] の連携をとるための Spawner クラス. - LTIContainerSpawner は LTIDockerSpawner と LTIPodmanSpawner を纏めた呼び方. -- ''LTIContainerSpawner = LTIDockerSpawner + LTIPodmanSpawner'' git clone https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner.git cd lticontainerspawner/ make **** [[LTIDockerSpawner>JupyterHub/LTIDockerSpawner]] [#kfa79499] - JupyterHub/[[SystemUserSpawner>JupyterHub/SystemUserSpawner]] クラスを継承. - 現時点(2021/10)では ''etc/jupyterhub_docker_config.py'' の中で実装 **** [[LTIPodmanSpawner>JupyterHub/LTIPodmanSpawner]] [#u1b06d85] - [[Podman]] が使用可能 - JupyterHub/Spawner クラスを継承 - niklas netter 氏の [[podmanspawner>PodmanSpawner]] を利用 (very thanks!) -- https://github.com/gatoniel/podmanspawner - 現時点(2021/10) では pod の起動に Popen() を使用している. - 設定ファイルは'' etc/jupyter_podman_config.py'' **** 機能 [#o44dc5d5] - ユーザグループ機能の完全サポート - Moodle(その他の LTIコンシューマ)からの LTI カスタムパラメータを受信して動作. - 環境変数を使用した start.sh による Jupyter Lab/Notebook コンテナの動作制御. - 以下の機能をコースの外部サービス毎に設定可能 -- 教師ユーザと学生ユーザの分離. -- ユーザ毎の Volume のマウント,及びアクセス権(教師と学生)の設定. --- 教材の配布と収集に便利 -- ユーザの作業用 Volumeの設定 -- Volume への任意名でのアクセス. -- 起動イメージのリモート選択.表示名のフィルタリング.Jupyter Lab/Notebook でないイメージを選択すると漏れなく死にます :-o -- 起動 URL(Lab/Notebook)の選択. -- %%iframe サポート%% 一部のみサポート:動くための条件がシビア(tornado のバージョンやブラウザの種類によって条件が変わる) -- CPU/Momery の制限 **** Volume 名に関する制約 [#q7b847fc] - ボリューム名には小文字のアルファベット・数字以外は使用できない.特殊文字も使用できない.(snake_case) - 大文字のボリューム名は小文字に変換される. - ボリュームに対して同じボリューム名・アクセス名を指定した場合は,最初の物が優先される. - 一個の JupyterHub に対して複数の Moodle からのアクセスをサポート - アクセス名の先頭に - を付けた場合は,教師ユーザのみシンボリックリンクが張られる - 注)アクセス名:ボリュームへ張られるシンボリックリンクの名前 **** 注意事項 [#n57178a3] - iframe -- %%Moodle で埋め込み(iframe)表示を行う場合は,Moodle と JupyterHub を同じホストにするか,Moodle のホスト上で feserver を動かす.%% -- %%iframe 対応.ただし tornado が cookie の samesite を解釈可能なこと.(python3.8以上)%% -- tornado のバージョンやブラウザの種類によって条件が変わるので,部分的サポートとする. **** 起動 [#bdc8edbc] - jupyterhub -f lticontainerspawner/etc/jupyterhub_docker_config.py - jupyterhub -f lticontainerspawner/etc/jupyterhub_podman_config.py *** [[mod_lticontainer]] [#hbfc4f2f] - https://gitlab.nsl.tuis.ac.jp/iseki/mod_lticontainer - MDLDockerSpawner/LTIPodmanSpawner サポート用 Moodleモジュール - docker のリモート制御について -- docker クライアント(docker-cd-cli : /usr/bin/docker) が必要 -- dockerd が動いているホストに ssh できる,ホスト上のユーザ(dockerのソケットのグループに所属)が必要 - podman のリモート制御について -- podman コマンド(podman-remote) が必要 -- podman が動いているホストに ssh できる,ホスト上のユーザ(podmanのソケットのグループに所属)が必要 **** 機能 [#m538ed2a] - LTI のカスタムパラメータ管理 - Docker/Podman のリモート制御 -- イメージの一覧の取得 -- Volume 管理(作成,表示,削除) - WebService -- feserver (feplg_nbws.so)からのデータを XML-RPC で受信し,データベースに格納 -- データ利用については ''&font(Red){未実装};''. - https://docs.moodle.org/dev/Charts_API **** [[Docker]] を使う場合 [#d9c2f77c] - JupyterHub/Docker が起動するホスト上にアクセス用ユーザを用意する. -- %%アクセス用ユーザのホームディレクトリについて,アクセス用ユーザが書き込み可能であること.%% --- %%CentOS8 で嵌った.ユーザを dockerにしたんだが,dockerのホームディレクトリなのに,dockerが書き込み可能でなかった.%% (勘違い?) -- アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため). -- アクセス用ユーザのログインシェルは不要-- アクセス用ーザが docker のグループに属していること(UNIXソケットファイルにアクセスするため). -- アクセス用ユーザのログインシェルは不要 - Webサーバの実効ユーザが自分のホームディレクトリについて,書き込み可能であること. **** [[Podman]] を使う場合 [#nd0d330c] - 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では問題なし. *** [[Ltictr_Proxy]] [#wb4130d9] - feserver + feplg_nbws.so の代わりとなる ''[[Ltictr_Proxy]]'' を作成したので,今後はこちらを用いる(2022/2/13) *** 参考:[[feserver]] [#va0d030b] - http://www.nsl.tuis.ac.jp/svn/linux/feserver/trunk - feserver フロントエンドサーバ(TCP中継サーバ) - MITM 的動作を行う私的試験用ツール.(一応公開もしている. svn co http://www.nsl.tuis.ac.jp/svn/linux/feserver/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 **** 起動例 [#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/server.pem -- --key : -c を指定した場合のサーバの秘密鍵:PEM形式.設定ファイル内でも指定可能. デフォルトは /etc/pki/tls/private/key.pem **** feplg_nbws.so モジュール [#abc6a346] - Moodle と JupyterHub の中間に位置し,通信情報(主に WebSocktの通信情報)を収集して XML-RPC で Moodle に返すためのモジュール - ユーザから見ると,リバースプロキシのように見える. - 機能 -- 通信の中継 -- WebSocket 通信の解析. -- HTTP(S)通信の解析. -- Cookie の挿入. -- Moodle への XML-RPC 通信.(MoodleのWebサービスを使用) ***** feplg_nbws.so の 設定ファイル(nbws.conf) [#d9285c96] - 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 ***** Moodle 側の設定 (Webサービスを利用するためのトークンの取得)[#a1c43efd] + 管理者IDで「サイト設定」 -> 「プラグイン」 -> 「ウェブサービス」 -> 「外部サービス」 ++ 「Jupyter Lab/Notebook Data」の項目を確認 ++ 「Jupyter Lab/Notebook Data」の 「許可ユーザ」をクリック +++ 適当なユーザ(教師ロールのユーザ)を選択し,許可ユーザとする + ウェブサービスのメニューまで戻って,「トークンを管理する」を選択. ++ 「追加」をクリック. +++ ユーザ名に先程選択したユーザ名を入れる. +++ サービスは「Jupyter Lab/Notebook Data」を選択 +++ 「変更を保存する」をクリック ++ 「トークンを管理する」まで戻ると,ユーザ用のトークンができているので,それをコピーする. ++ トークンは feplg_nbws の設定ファイルの Moodle_Token に設定する. *** ipynb_conv [#b15438d1] - ipynb ファイルの(コード)タグに解析用の通し番号を入れるツール - LTIContainerSpawner に同梱(C言語) - %%phpバージョンもあり (現時点で使用予定なし.サンプルコード)%% -- PHPバージョンは,C言語バージョンにバグがあった場合の保険.(最初から PHPバージョンを使えと言う指摘は最もですが.... C言語バージョンを折角作ったので....) *** Jupyter Lab/Notebook コンテナイメージ [#qc8d3ed8] - 機能を全て利用するには,専用の(''start.sh'' を入れ替えた)コンテナイメージが必要. - MDLDockerSpawner に Dokerfile 同梱 - [[JupyterHub/devel]] - start.sh 入れ替え後でも,通常の DockerSpanwer で問題なく起動できるようにしたい(下位互換性) ** Trouble Shooting [#c5d119dc] *** mod_lticontainer [#b6461f04] **** 500 Server Error [#jc469646] - mod_lticontainer でユーザを削除する. or - admin で入って,adminメニューから該当ユーザを削除する, **** local user で JupyterHubにアクセスできない.アクセスバーは途中まで. [#c06188d6] - ホームディレクトリ内のドット付きディレクトリのユーザを調べる. - 本来のオーナでない場合は,修正する. ** Setup [#q4494417] *** Example [#eca873a2] - Rocky Linux - [[Debian>./Debian]]