|
|
# Index
|
|
|
[[_TOC_]]
|
|
|
# mod_lticontainer
|
|
|
## 概要
|
|
|
- [**mod_lticontainer**](https://gitlab.nsl.tuis.ac.jp/iseki/mod_lticontainer) はMoodle のLTIカスタムパラメータの設定をサポートするモジュールである.
|
|
|
- 現バージョンは **v0.9β** (2021/10/17)
|
|
|
- [**LTIContainerSpawner**](https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner) との組み合わせで使用する.
|
|
|
- LTIContainerSpawner との組み合わせで使用しなければ意味は無い.
|
|
|
|
|
|
* 追加参照 Wiki
|
|
|
* [**Moodle + JupyterHub**](https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner/-/wikis/Moodle---JupyterHub-(J))
|
|
|
* [**LTIContainerSpawner**](https://gitlab.nsl.tuis.ac.jp/iseki/lticontainerspawner/-/wikis/md/LTIContainerSpawner(J).md)
|
|
|
|
|
|
<img src="uploads/43458ae4a767ad9b710b0470227b0b00/LTIContainerSpawner.png" width="70%">
|
|
|
|
|
|
## 機能
|
|
|
- **LTIカスタムパラメータ**の設定サポートを行う.
|
|
|
- Docker/Podmanホストとの通信機能を有する.(container_rsock.sh)
|
|
|
- コンテナイメージの名称を取得する.
|
|
|
- Volume のリモート作成(デフォルトではこの機能はOFF),リモート削除を行う.
|
|
|
|
|
|
## インストール
|
|
|
- Moodle ホストにログインし,root で作業.
|
|
|
```
|
|
|
# cd [Moodle Path]/mod
|
|
|
# git clone https://gitlab.nsl.tuis.ac.jp/iseki/mod_lticontainer.git
|
|
|
# mv mod_lticontainer lticontainer
|
|
|
# chown -R [wwwサーバの実効ユーザ].[wwwサーバの実効グループ] lticontainer
|
|
|
adminユーザで Moodleにログインする
|
|
|
```
|
|
|
|
|
|
## 操作(Tab)
|
|
|
### Over View
|
|
|
- 現在の設定を表示
|
|
|
- **Edit settings** から設定画面に移動可能.
|
|
|
### Dashbosrd
|
|
|
- .....
|
|
|
### Charts
|
|
|
- ......
|
|
|
### LTI Connections
|
|
|
- 制御下に置く,LTIコネクション(外部ツールのインスタンス)の一覧
|
|
|
- **Edit settings** をクリックすると,制御から外す(表示しない)ネクションを指定する画面に移動.
|
|
|
- 表示されている LTI Nameをクリックするこことにより **LTI Edit** を表示.
|
|
|
### Volumes
|
|
|
- JupyterHubホストで使用しているボリューム一覧(そのコースで使用しているボリュームのみ)とその削除.
|
|
|
- Personal volume は操作対象外.
|
|
|
- ここで表示されるボリューム名(表示名)は,省略された名前.
|
|
|
- ボリュームのフルネーム(正式名): **lms_[ vol | sub | prs ]\_[表示名]\_[コースID]\_[MoodleホストのFQDN]**
|
|
|
- 例:**lms_vol_abc_98_el.mml.tuis.ac.jp**
|
|
|
|
|
|
### LTI Edit
|
|
|
- LTI(外部ツール)インスタンスのカスタムパラメータを書き換える.
|
|
|
- 通常は DB上のデータを書き換えるだけ.
|
|
|
- カスタムパラメータ自体は,JupyterHubに実際に接続(ログイン)した時に送られる.
|
|
|
- 設定により,データを更新したタイミングで Dockerのボリュームを作成するように設定することも可能.
|
|
|
|
|
|
* LTI カスタムパラメータの設定画面
|
|
|
![LTI_Edit](uploads/97bfc80a4377e7d7045c08f381692337/LTI_Edit.png)
|
|
|
|
|
|
#### Accessible users
|
|
|
- LTIカスタムパラメータ **lms_users** に対応.
|
|
|
- Volumeセクションで記述したボリュームをマウントできるユーザを指定する.
|
|
|
- ユーザはMoodleのユーザ名を,カンマ(,)または空白で区切って記述する.
|
|
|
- デフォルト(空欄)では全てのユーザがボリュームをマウントできない.
|
|
|
- アスタリスク(**\***)は全てのユーザがボリュームをマウントできることを表す.
|
|
|
|
|
|
#### Teachers
|
|
|
- LTIカスタムパラメータ **lms_teachers** に対応.
|
|
|
- コースの教師を指定する.指定の仕方は,**lms_user** と同じ.アスタリスク(**\***)も使用できるが,使う意味はない.(全員教師?)
|
|
|
- 途中で教師のメンバを変更した場合は,**Task volume** および **Submit volume** のオーナが教師グループから外れる可能性があるので,注意が必要.
|
|
|
- **教師の特権**
|
|
|
- 教師はマウントの制御の影響を受けない(どのような場合でもマウント可能)
|
|
|
- **Task volume**, **Submit volume** 内の読み書きが可能で,この中のファイルを削除できる.
|
|
|
- 学生は **Task volume** には書き込みできない.
|
|
|
- 学生は **Submit volume** 内のファイルについて,このボリューム内に自分でコピーしたもの以外にはアクセスできない.
|
|
|
- 教師が Submit volume 内でコピーしたものは,学生でもアクセスできる.(提示教材扱いになる)
|
|
|
- ボリュームのアクセス名の先頭に マイナス(**-**) を付けた場合,教師に対してのみアクセス用のリンクが張られる(-が削除された名前でリンクが張られる).
|
|
|
- 学生にリンクによるアクセスをさせたくない場合に使用(セキュリティ的な意味ではなく,操作上の学生の混乱を少なくさせるためのもの)
|
|
|
- **Personal volume** を使うときに,**Task volume** にマイナス付きのリンク名を指定してボリューム名を同じにすると教材配布に便利.
|
|
|
- 環境変数 **GRANT_SUDO** が **no** であっても,コンテナ内で **sudo** コマンドが使用できる.
|
|
|
|
|
|
#### Container image
|
|
|
- LTIのカスタムパラメータ **lms_image** に対応.
|
|
|
- 起動するコンテイメージを指定する.デフォルトの場合は,設定ファイルで指定したイメージ.
|
|
|
- Jupyter Lab/Notebook 以外のイメージを選択した場合は,高い確率でシステムは死亡する.
|
|
|
- 設定の **Image name filter words** で表示するコンテナイメージ名にフィルターを掛けることが可能.
|
|
|
|
|
|
#### Default URL
|
|
|
- LTIカスタムパラメータ **lms_defurl** に対応.
|
|
|
- Lab か Notebook のどちらにアクセスするかを指定する.デフォルトは設定ファイルで指定したURL.
|
|
|
- Lab を指定した場合,起動するコンテイメージが Labをサポートしていないと 404 not found になる.
|
|
|
|
|
|
#### CPU Limit
|
|
|
- **lms_cpulimit** に対応.
|
|
|
- コンテナ内での CPU数の上限.
|
|
|
|
|
|
#### Memory Limit
|
|
|
- **lms_memlimit** に対応.
|
|
|
- コンテナ内での メモリの上限.
|
|
|
- CPU Limit は 0.1 でも結構動くが,メモリ 120Mぐらいだと JupyterHub/singleuser のコンテナは起動しない.
|
|
|
- 140M くらいだと何とかコンテナは起動するが,ほぼ使えない.
|
|
|
- 180M くらいで何とか使用できるようになる.
|
|
|
- mod_lticontainer では,余裕を考えてきりのいい 200M から表示.
|
|
|
|
|
|
#### Volume セクション
|
|
|
- **Task volume**, **Submit volume** はユーザが JupyterHub にアクセスしたときに(許可があれば)マウントされる.
|
|
|
- アクセス(マウント)可能ユーザの書き方は **lms_users**(Accessible users) と同じ.ただしデフォルト(空欄)では,全てのユーザが許可される.
|
|
|
- **lms_users**(Accessible users)よりも,ここで指定される個々の許可ユーザの方が優先される.
|
|
|
- アスタリスク (**\***) も使用できるが使用する意味はない. 空欄にしておけば良い.
|
|
|
- デフォルトでは誰かが jupyterHubにアクセスしてログインした瞬間に(ボリュームが存在しなければ)ボリュームが作成され,マウントされる.
|
|
|
- 設定の **Does mod_lticontainer create Docker volumes?** でボリュームの作成タイミングを変更可能.
|
|
|
- **Personal volume** は実際にはボリュームはマウントされず,ユーザのホーム領域(の一部)がそのまま使用される.
|
|
|
- ユーザ毎に違う自分の領域が使用できるので,個人の(コース毎の)作業場として使用する.
|
|
|
- マウントしたボリューム(Personal volumeも含む)には,アクセス名によるシンボリックリンクでアクセス可能.
|
|
|
- ボリュームの再利用に便利.
|
|
|
- コースの LTIコネクション(インスタンス)毎に,ユーザに見せるディレクトリを変更できる.
|
|
|
- マウントポイントだけ存在して,実際にはマウントされてないボリュームとの識別に便利.
|
|
|
- マウントポイントは,ボリュームを外した場合もそのまま残り見た目が良くない.ドット(.) ディレクトリの下に隠すと良い.(デフォルトでは .volumes)
|
|
|
- Volume のマウントをカスタムパラメータから削除するには,アクセス名の無いエントリを作成する.
|
|
|
- Personal Volume については,カスタムパラメータから削除すると,存在自体を忘れてしまう可能性があるので注意(自分のディレクトリを見て確認可能)
|
|
|
- 表示名の指定について
|
|
|
- アルファベット小文字,及び数字のみ使用可能
|
|
|
- 三種類のボリューム(vol, sub, prs)について,同じ表示名が指定できる.
|
|
|
- アクセス名について
|
|
|
- 漢字指定可能
|
|
|
- ドット(.)を指定すると,ボリュームのフルネームでリンクが作られる.(ln -s ボリューム名 . が実行されるため)
|
|
|
- アクセス名の無いエントリを作成すると,カスタムパラメータから削除される.
|
|
|
- ボリュームのアクセス名の先頭に マイナス(**-**) を付けた場合,教師に対してのみアクセス用のリンクが張られる(-は削除されてリンクが張られる)
|
|
|
|
|
|
##### Task volume
|
|
|
- LTIカスタムパラメータの **lms_vol_表示名=アクセス名: 許可ユーザ** に対応.
|
|
|
- 課題提示用ボリューム.教師は書き込み可能だが,学生は読み出しのみ可能.
|
|
|
- Volumes タブで削除可能
|
|
|
- パーミッション:rwxrwsr-x, オーナ:一番最初にアクセスした教師,グループ:教師
|
|
|
|
|
|
##### Submit volume
|
|
|
- LTIカスタムパラメータの **lms_sub_表示名=アクセス名: 許可ユーザ** に対応.
|
|
|
- 課題回収用ボリューム.教師は読み出し(書き込み,削除:これはオーナのみ)が可能だが,学生は課題の提出(書き込み)と自分の提出した課題にのみアクセス(読み出し,削除)可能.
|
|
|
- ただし,教師が Submit volume 内でコピーしたものは,学生でもアクセスできる.
|
|
|
- Volumes タブで削除可能
|
|
|
- パーミッション:rwxrwsrwt,オーナ:一番最初にアクセスした教師,グループ:教師
|
|
|
|
|
|
##### Personal volume
|
|
|
- LTIカスタムパラメータの **lms_prs_表示名=アクセス名: 許可ユーザ** に対応.
|
|
|
- これはユーザの専用ボリュームに恒久的に作成されるディレクトリである.
|
|
|
- ユーザ本人しかアクセスできない.(コンテナ起動時の管理プロセスを除く)
|
|
|
- Task volume, Submit volume は Volumes タブで削除可能だが,これは一度作成するとシステムの管理者またはユーザ本人しか削除できない
|
|
|
- **Task volume と同じ名前(表示名)で作成すると,コンテナ起動時に Task volume の内容がここにコピーされる.**(上書きは禁止)
|
|
|
- 教材(課題)配布に使用するのが主な目的.
|
|
|
- 取り扱いが面倒だが,上手く使えば強力(だと思う).
|
|
|
- 許可ユーザに名前がない場合は,ディレクトリに対して何の操作も行われない.(ディレクトリ自体は存在)
|
|
|
- アクセス名からのリンクは行われない.
|
|
|
- Task volume と同じ名前(表示名)にしても,コピーは行われない.
|
|
|
|
|
|
#### その他のカスタムパラメータ
|
|
|
- **lms_sessionifo**
|
|
|
- このモジュールのインスタンスIDと対応する LTIコネクション(外部ツール)のインスタンスのIDが自動的に設定される.例)lms_sessionifo=6,13
|
|
|
- ユーザが気にすることは何もない.このデータは実際には feserver の feplg_nbwsモジュールに送られる.
|
|
|
- **lms_iframe**
|
|
|
- iframe サポート.自動的に設定される.
|
|
|
- host_url を設定しなくとも動くが,デフォルト設定の host_url ではセキュリティ的には少し甘い.可能ならば実際のURLを設定する.
|
|
|
- ホストの Python のバージョンが 3.7以下の場合は使用できない(jupyterhub のエラーになる).
|
|
|
- tornado が cookie の samesite を処理できないため.
|
|
|
- jupyterhub のエラーメッセージ:http.cookies.CookieError: Invalid attribute 'samesite'
|
|
|
- Webブラウザによっても使用できない場合がある.
|
|
|
- iframe 機能を試す場合は,設定ファウルの以下の 3行のコメントを外す必要がある.
|
|
|
```python
|
|
|
# if you charenge to show iframe, uncomment bellow 3 lines.
|
|
|
#if sys.version_info >= (3, 8) :
|
|
|
# cookie_options = { "SameSite": "None", "Secure": True }
|
|
|
# c.JupyterHub.tornado_settings["cookie_options"] = cookie_options
|
|
|
```
|
|
|
- 現時点で(実装しているけど)使用していないカスタムパラメータ.
|
|
|
- lms_option :コマンドオプション.そのうち使うかも.
|
|
|
- このモジュールが使用するもの以外の カスタムパラメータには一切影響を及ぼさない.
|
|
|
|
|
|
#### LTIカスタムパラメータ表示
|
|
|
- 設定の **Show custom parameters** で Yes を選択すると,現在のLTIカスタムパラメータが表示される.
|
|
|
|
|
|
|
|
|
|
|
|
## 設定
|
|
|
### Options of LTIContainerSpawner module
|
|
|
- **Docker/Podman host**
|
|
|
- Docker または Podman が動くホストのホスト名(FQDN)またはIPアドレスを指定する.
|
|
|
- **Docker/Podman user**
|
|
|
- Docker または Podman が動くホスト上で,mod_lticontainer と通信を行うためのユーザを指定する.
|
|
|
- このユーザは Docker または Podman のソケットを読み書き可能で,Moodleホストから ssh ログイン可能でなければならない.
|
|
|
- **Password of Docker/Podman user**
|
|
|
- Moodleホストから ssh ログインする場合の **Docker/Podman user** のパスワード.
|
|
|
- **Show custom parameters**
|
|
|
- Yes にすると,**LTI Edit** 画面の下部に現在のLTIカスタムパラメータが表示される.
|
|
|
- **Image name filter words**
|
|
|
- **LTI Edit** 画面で **Container image** に表示されるコンテナイメージ名のフィルタリング指定.
|
|
|
- 名前の一部の文字列を指定すると,それを含んだコンテナイメージ名のみ表示される(**AND選択**).何も指定しない場合は,全てのコンテナイメージ名が表示される.
|
|
|
- 文字列の先頭にマイナス(**-**)を付けると,その文字列を含むコンテナイメージ名は表示されない(**OR選択**).表示指定よりもこちらの指定が優先される.
|
|
|
- **Does mod_lticontainer create Docker volumes ?**
|
|
|
- 設定を保存したタイミングで Dockerボリュームを作成するかどうかを指定する.
|
|
|
- システム的には Yes/No どちらでもよい.
|
|
|
- **Use Podman instead of Docker**
|
|
|
- Podman を使用する場合に,Yes にする.
|
|
|
|
|
|
### container_rsock.sh
|
|
|
- Docker/Podman のリモートコントロール用シェルスクリプト.
|
|
|
- Moodleホストから ssh のポートフォワーディングを使って,Docker/Podman ホストに UNIXのソケットファイルを繋げる.
|
|
|
- Docker/Podman ホスト側に,sshでログイン可能な(ログイン)ユーザが必要.
|
|
|
- そのユーザは Docker/Podman の UNIXソケットファイルを読み書き可能でなければならない.
|
|
|
- 最も簡単な手法としては UNIXソケットファイルのグループに対して読み書きのパーミッションを与え,ユーザをそのグループに入れる.
|
|
|
##### Moodle(LMS) ホスト側
|
|
|
- WWWサーバの実効ユーザは,そのホームディレクトリについて書き込み可能でなければならない.(ssh の設定データを書き込む必要があるため)
|
|
|
- 書き込可能でない場合は,"The web server process does not have write access to its own home directory. Please check the permissions" のエラーメッセージが表示される.
|
|
|
- 例)Apache の場合,ユーザ apache は /var/www に書き込み権限がなければならない.
|
|
|
- Docker ホストを使用する場合は,Moodle ホスト側に,少なくとも docker-ce-cli/docker-cli がインストールされている必要がある.
|
|
|
- Podman ホストを使用する場合は,Moodle ホスト側に,少なくとも podman-remote がインストールされている必要がある.
|
|
|
##### Docker/Podman ホスト側
|
|
|
- UNIXソケットファイルに対して,グループユーザが読み書き可能であること.
|
|
|
- リモートコントロール用ユーザが UNIXソケットファイルのグループに属していること(UNIXソケットファイルにアクセスするため).
|
|
|
- リモートコントロール用ユーザのログインシェルは不要.
|
|
|
|
|
|
|
|
|
## 運用例
|
|
|
### 課題の作成と回収
|
|
|
#### **Task volume** と **Submit volume** を使用する
|
|
|
##### 課題の作成
|
|
|
1. 設定
|
|
|
- Accessible users : 空欄
|
|
|
- Teachers : 自分のユーザ名
|
|
|
- Container image : 課題で使用するイメージ
|
|
|
- Task volume : 適当なアクセス名,許可ユーザに自分のユーザ名
|
|
|
1. JupyterHub にログイン.
|
|
|
1. Task volume 内で教材を作成.他の適当なディレクトリで作業しても良い.
|
|
|
1. ipynb_deploy コマンドでファイルを変換・コピー.
|
|
|
- ipynb_deploy コマンドは,後で採点や統計作業を行い易いようにするためにカレントディレクトリ内のファイルのコードセルに通し番号を付ける.
|
|
|
- 例)ipynb_deplay 課題1
|
|
|
- Task Volume 内で作業していて,作業場所をそのまま公開する場合は,**ipynb_deploy .** と入力する.
|
|
|
- ipynb_deploy コマンドを実行する前に,必ずファイルのバックアップを取ること.もし ipynb_deploy の実行によりファイルが破損しても,当方は責任は取り兼ねます.
|
|
|
|
|
|
##### 課題の公開
|
|
|
1. 設定
|
|
|
- Accessible users : **\***
|
|
|
- Teachers : 自分のユーザ名
|
|
|
- Container image : 課題で使用するイメージ
|
|
|
- Task volume : 課題提示用ボリューム.適当なアクセス名を指定.許可ユーザは空欄
|
|
|
- Submit volume : 課題収集用ボリューム.適当なアクセス名を指定.許可ユーザは空欄.
|
|
|
|
|
|
##### 課題の実施と提出(学生)
|
|
|
1. 学生は,Task volume 内から,自分の作業用場所(~/jupyter または ~/jupyter/works 下など)に課題ファイルをコピー.
|
|
|
2. 課題を行う.
|
|
|
3. 提出は,課題ファイルを指定された提出用 Submit volume にコピーする.この際,ファイル名に自分の学籍番号,名前を追加する.
|
|
|
- ファイル提出の際には ipynb_submit コマンドが使用できる.ipynb_submit はファイル名にユーザ名を自動的に付け加えて,指定されたフォルダにコピーする.
|
|
|
- 例)ipynb_submit kadai-1.ipynb 課題1提出用
|
|
|
|
|
|
|
|
|
#### 加えて **Personal volume** を利用する
|
|
|
##### 課題の作成
|
|
|
1. 設定
|
|
|
- Accessible users : 空欄
|
|
|
- Teachers : 自分のユーザ名
|
|
|
- Container image : 課題で使用するイメージ
|
|
|
- Task volume : 先頭にマイナス(**-**)を付けたアクセス名.許可ユーザに自分のユーザ名
|
|
|
1. JupyterHub にログイン.
|
|
|
1. Task volume 内で教材を作成.以前作成した教材ファイルとファイル名が被らないように注意する.他の適当なディレクトリで作業しても良い.
|
|
|
1. Task volume から Personal volume へファイルがコピーされる際,自動的にファイル変換が行われるようしたので,手動による ipynb_deploy の起動は不要.
|
|
|
|
|
|
##### 課題の公開
|
|
|
1. 設定
|
|
|
- Accessible users : **\***
|
|
|
- Teachers : 自分のユーザ名
|
|
|
- Container image : 課題で使用するイメージ
|
|
|
- Task volume : 先頭にマイナス(**-**)を付けたアクセス名,許可ユーザは空欄.学生にはアクセス名は表示されない.
|
|
|
- Submit volume : 課題収集用ボリューム.適当なアクセス名を指定.許可ユーザは空欄.
|
|
|
- **Personal volume : 表示名は Task volume と同じにする.アクセス名は適当な名前.許可ユーザは空欄.**
|
|
|
|
|
|
##### 課題の実施と提出(学生)
|
|
|
1. **学生は Personal volume 内にあるファイルを使って,そのまま課題を行う.**
|
|
|
1. 提出は,課題ファイルを指定された提出用 Submit volume にコピーする.この際,ファイル名に自分の学籍番号,名前を追加する.
|
|
|
- ファイル提出の際には ipynb_submit コマンドが使用できる.ipynb_submit はファイル名にユーザ名を自動的に付け加えて,指定されたフォルダにコピーする.
|
|
|
- 例)ipynb_submit kadai-1.ipynb 課題1提出用
|
|
|
|
|
|
|