jupyterhubとの連携

設定(1コースの場合)

スタッフ,受講生共通の設定

  • /etc/jupyter/nbgrader_config.py
c = get_config()
c.NbGrader.logfile = "/var/log/nbgrader.log"
c.Exchange.root = '/home/share/nbgrader/exchange'
c.Exchange.timestamp_format = '%Y-%m-%d %H:%M:%S %Z'
c.Exchange.timezone = 'JST'

注)

  1. Exchange.rootは事前に作成して,ユーザが書き込み可にしておかないといけない
  2. c.Exchange.timestamp_format'はデフォルトでは秒が小数になるが,経過時間等の処理の時に困ることがあるので小数部は切り捨て。
  3. c.Exchange.timezone = 'JST'の設定がなぜか有効にならない。。。

スタッフの設定

  • ~/.jupyter/nbgrader_config.py
c = get_config()

c.CourseDirectory.root = '/home/<username>/<course_name>' # 適宜変更する
c.NbGrader.logfile = '/home/<username>/log/nbgrader.log'

コース設定

  • ~/home/<username>/<course_name>/nbgrader_config.py
    • nbgrader quickstart <course_name>で出力されるものをそのまま使っている。

設定(複数コース)

まずは,上記の1コースの設定を一通り理解していることが必要。 多コースに拡張するための設定の概要は以下の通り。

  • /etc/nbgrader_config.pyに各コース用ホームディレクトリ(担当教員のホーム’/home//`等)を指定。

    • 各コースに対して異なるポートを割り振る
    • 各コースに対するユーザ指定(whitelist)設定をする。
  • 各コース用ホームディレクトリに~/.jupyter/nbgrader_conf.pyを置いて,課題用ルートフォルダ(’/home//<course_name>’)を指定

  • /etc/nbgrader_config.pyもしくは,学生~/.jupyter/nbgrader_config.pyに以下を追記

from nbgrader.auth JupyterHubAuthPlugin
c = get_config()
c.Exchange.path_includes_course = True
c.Authenticator.plugin_class = JupyterHubAuthPlugin
  • コース用ディレクトリに/home/<username>/<course_name>/nbgrader_config.pyを準備(1コースの場合と同じ)
  • 詳細はこちら: Example Use Case: Multiple Classesを参照

アクセス制限

各コースに対するユーザ登録(whitelist作成)も可能。ただし,jupyterhubの再起動が必要。

[問題点]

jupyterhubとjupyter notebookが同じサーバ上にあると,jupyterhubの再起動時にログインユーザが追い出されてしまい,再ログインが必要になる。

[解決法その1]

proxyサーバを介したアクセスとし,以下の設定をしておく。

Proxy.should_start=False
JupyterHub.cleanup_servers=False

[解決法その2]

jupyterhubとjupyter notebookは別のサーバ(コンテナ)で起動する。

おまけ

nbgitpuller

受講生がjupyterにログインした時に,git pullを簡単に実行させるためのjupyter plugin.

cull_idle

jupyterhubにログインしたままコマンド実行がないプロセスは止めるための設定。/etc/jupyterhub/jupyterhub.confに以下を追記しておく。

# cull_idle
c.JupyterHub.services = [
    {
        'name': 'cull_idle',
        'admin': True,
#        'command': ['/home/adm/jupyterhub/cull_idle_servers.py'],
        'command': '/usr/local/anaconda3/bin/python3 <write path here>/cull_idle_servers.py --timeout=7200'.split(),
    }
]

実行コマンドcull_idle_servers.pyを,上記で指定するパスにおいておく。