#author("2024-06-10T12:52:28+00:00","default:iseki","iseki")
#author("2024-09-02T07:17:45+00:00","default:iseki","iseki")
** JupyterHub [#mb71944e]
*** Over View
- マルチユーザのための [[Jupyter]] サーバー(ユーザ認証機能つき)

- https://github.com/jupyterhub/jupyterhub
- https://github.com/gatoniel/jupyterhub  改良版

- https://jupyterhub.readthedocs.io/en/0.7.2/getting-started.html
- https://horomary.hatenablog.com/entry/2019/11/09/181614

- see also: ''[[Jupyter]]''
- see also: [[Docker]], [[Podman]]
- see also: [[Kubernetes]], [[PodmanSpawner]]
- see also: [[configurable-http-proxy]]

- [[DockerSpawner>./DockerSpawner]]
- [[LTIDockerSpawner>./LTIDockerSpawner]]
- [[LTIPodmanSpawner>./LTIPodmanSpawner]]

- [[Moodle+JupyterHub]]
- [[開発>./devel]]
- [[API>./API]]

** Latest Trouble Shooting [#y59ed799]
*** Internal Server Error 500 [#pfdb0ef3]

**** Error starting server XXXX: 500 Server Error for 2024/06/03
<pre>
Jun  3 18:07:39 castor1 jupyterhub[8182]: [E 2024-06-03 18:07:39.934 JupyterHub pages:313] 
Error starting server XXXX: 500 Server Error for http+docker://localhost/v1.41/containers/create?name=jupyterhub-XXXX-269-348-el.mml.tuis.ac.jp: Internal Server Error ("container create: creating container storage: the container name "jupyterhub-XXXX-269-348-el.mml.tuis.ac.jp" is already in use by 
156e13cd92fbcaea275b1bfb6508fff5cd46ff923012a6cc1c587468f362ed19. 
You have to remove that container to be able to reuse that name: that name is already in use")
</pre>
+ volatile-containers.json のエントリ削除
+ docker rm 156e13cd92fbcaea275b1bfb6508fff5cd46ff923012a6cc1c587468f362ed19
+ jupyterhub 再起動で直った
**** 2023/12/27 docker.errors.DockerException: Error while fetching server API version: request() got an unexpected keyword argument 'chunked'
 
- エラーが出て全く繋がらん! けしからん! 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]] に実装(2023/12/27)
** INSTALL [#nfb5f43c]
*** Rocky Linux 8 [#g6e6c1d1]
- [[Detail Log>./RockyLinux8_install]]


*** pip [#ecfe7cfb]

*** conda [#n0e2837f]
- conda update -c conda-forge jupyterhub -y


*** for CentOS 8.5 with pip [#l08667b3]
 # yum install python3
 # pip3 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


*** 2.0.0 with conda [#e269f8c5]

**** Change Log [#qacdfa95]
- https://jupyterhub.readthedocs.io/en/stable/changelog.html

**** Install [#j385e508]
 (base) # conda install -c conda-forge conda==4.11.0 -y
 (base) # conda activate jupyterhub
 (jupyterhub) # conda update -c conda-forge jupyterhub -y

 (jupyterhub) # jupyterhub --upgrade-db
 (jupyterhub) # jupyterhub -f .....


**** podmanspawner.PodmanSpawner [#nefeece2]
- おおっ class のサンプルに Podman がある!
-- と思ったら niklas netter 氏の [[podmanspawner>https://github.com/gatoniel/podmanspawner]] じゃん


**** websocket モジュールが無いとのことで起動しなくなった. [#x698e062]
 ModuleNotFoundError: No module named 'websocket'
- conda 環境で websocket をインストール

 # conda install -c conda-forge websocket-client

- pip なら pip install websockets 


**** データベースのスキーマが合わないとのことで,起動しなくなった. [#o77e88b0]
- jupyterhub upgrade-db してもだめなので,/var/lib/jupyterhub 以下を削除


*** 1.4.2 [#i2818e12]

**** conda を使用 [#z4c989ab]
 (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) # git clone https://github.com/jupyterhub/nativeauthenticator.git 
 (jupyterhub) # pip install -e nativeauthenticator   (認証モジュール:オプション)
 (jupyterhub) # pip install dockerspawner

- ディレクトリのパーミッションの設定を忘れずに!

- nodejs: CentOS7 の場合は nodejs はバージョンが古くて,configurable-http-proxy でエラーが出るので,nodejs をバージョンアップする.
 curl -sL https://rpm.nodesource.com/setup_14.x | bash -
 yum remove nodejs npm -y
 yum install nodejs -y
 node -v
--  nodejs のバージョンがアップしない場合は,/var/tmp/yum-root-* を消す
-- https://rpm.nodesource.com/setup_##.x は非推奨となった.(2023/12/4)
--- see https://github.com/nodesource/distributions

 npm install -g configurable-http-proxy
 python3 -m pip install jupyterhub
 python3 -m pip install dockerspawner
 python3 -m pip install --upgrade notebook
 python3 -m pip install --upgrade jupyterlab 


*** Notebook の Docker イメージ [#s9b5f83a]
 # docker pull jupyter/datascience-notebook
 # docker pull jupyter/tensorflow-notebook


*** Version Up 1.0.0 -> 1.4.1 [#f7719705]
  # conda install -c conda-forge jupyterhub
  # conda install notebook
**** バージョンの確認 [#m3c5a1bd]
- (jupyterhub) # jupyterhub --version


*** [[LTI Authenticator>LTI]] [#g284e3bf]
- Moodle と連携する為の 認証モジュール(Moodleの外部サービスを使用)
- 先に authlib を入れておく.
-- conda install oauthlib  or pip  install oauthlib

- v1.2.0 release (2021 9/2)
-- https://pypi.org/project/jupyterhub-ltiauthenticator/1.2.0/
-- Moodle に対して Patch 不要

 (jupyterhub)# pip install --upgrade jupyterhub-ltiauthenticator

** 設定 [#idb49705]
- https://zero-to-jupyterhub.readthedocs.io/en/latest/customizing/index.html
- https://zero-to-jupyterhub.readthedocs.io/en/latest/administrator/index.html

- jupyterhub --generate-config を実行すると カレントディレクトリに設定ファイル ''jupyterhub_config.py'' が生成される.
- 個人的には jupyterhub が /usr/local 以下にある場合は /usr/local/etc/jupyterhub 以下に置く.
- 設定ファイルは拡張子が .py でないと,読み込まれない場合がある?



*** Authenticator Class (authenticator_class) [#g1e9cdae]
**** auth.DummyAuthenticator [#g40f4bb4]
- その名の通りダミー.認証無し.
- 全てのユーザを許可する.(一応パスワード入力欄は表示される)

**** jupyterhub.auth.PAMAuthenticator (default) [#n3acea52]
- 認証に[[PAM]]を使用する.恐らくサービスは login
- v1.1.0 にバグあり. [[Trouble Shooting>#rf83821d]] 参照.


**** nativeauthenticator.NativeAuthenticator [#u43dca72]
- 追加モジュール(オプション)
- 詳細は検証中


**** [[LDAP]]: ldapauthenticator.LDAPAuthenticator [#n1c54d11]
- LDap 認証用.
- モジュールのInstall 
 (jupyterhub) # conda install -c conda-forge jupyterhub-ldapauthenticator -y

- jupyterhub_config.py
 102 # for LDAP
 103 c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
 104 #c.LDAPAuthenticator.server_address = '202.26.150.*'
 105 c.LDAPAuthenticator.server_address = '202.26.144.*'
 106 c.LDAPAuthenticator.use_ssl = True
 107
 108 ## AD: template 付き(ユーザバインド)
 109 c.LDAPAuthenticator.lookup_dn = False
 110 c.LDAPAuthenticator.bind_dn_template = [
 111     'cn={username},ou=教員,ou=ユーザー,dc=edutuis,dc=local',
 112     'cn={username},ou=学生,ou=ユーザー,dc=edutuis,dc=local'
 113 ]
 114 c.LDAPAuthenticator.user_search_base = 'dc=edutuis,dc=local'
 115 c.LDAPAuthenticator.user_attribute = 'sAMAccountName'
 116
 117 ## AD: template なし
 118 #c.LDAPAuthenticator.lookup_dn = True
 119 #c.LDAPAuthenticator.user_search_base = 'dc=edutuis,dc=local'
 120 #c.LDAPAuthenticator.user_attribute = 'sAMAccountName'
 121 #c.LDAPAuthenticator.lookup_dn_search_user = 'cn=ldapauth,cn=users,dc=edutuis,dc=local'
 122 #c.LDAPAuthenticator.lookup_dn_search_password = '*****'
 123 #c.LDAPAuthenticator.lookup_dn_user_dn_attribute = 'cn'
 124
 125 ## NSL: username から dn が探せる場合(ユーザバインド)
 126 #c.LDAPAuthenticator.lookup_dn = False
 127 #c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=user,dc=nsl,dc=tuis,dc=ac,dc=jp'
 128
 129 ## NSL: ツリーを検索する場合
 130 #c.LDAPAuthenticator.lookup_dn = True
 131 #c.LDAPAuthenticator.user_search_base = 'ou=user,dc=nsl,dc=tuis,dc=ac,dc=jp'
 132 #c.LDAPAuthenticator.user_attribute = 'uid'
 133 #c.LDAPAuthenticator.lookup_dn_search_user = 'cn=Manager'
 134 #c.LDAPAuthenticator.lookup_dn_search_password = '*******'
 135 #c.LDAPAuthenticator.lookup_dn_user_dn_attribute = 'cn'
 136

**** [[LTI]] モジュール [#m4467ad6]



*** Server Class [#dded2dd0]

**** jupyterhub.spawner.LocalProcessSpawner (default)[#ueaf7599]
- [[LocalProcessSpawner >./LocalProcessSpawner]]
- サーバに,各ユーザの環境でアクセスできる.
- Jupiter Notebook はサーバにインストールされている物を使用する.
- 通常作業ディレクトリは /home/{username}/notebook   (v1.0.0 はディレクトリ指定にバグが有る模様)
- 使用ポートは 8000/tcp, 8081/tcp


**** jupyterhub.spawner.SimpleLocalProcessSpawner [#eb28d681]
- 名前がややこしい
- 詳細は不明(検証する気はあまりない)


**** dockerspawner.DockerSpawner [#dc30b0cf]
- [[''DockerSpawner''>./DockerSpawner]]
- https://github.com/jupyterhub/dockerspawner
- サーバでユーザ毎に ''[[Docker]]'' でNotebook コンテナを起動して接続.
- 作業ホームは /home/jovjan/work 固定(多分 Docker Image固定)
- 使用ポートは 8000/tcp, 8081/tcp, 8001/tcp
- Install
 (jupyterhub) # pip --no-cache-dir install git+https://github.com/jupyterhub/dockerspawner.git
 or
 (jupyterhub) # pip install dockerspawner

**** dockerspawner.SystemUserSpawner [#x578909e]
- [[''SystemUserSpawner''>./SystemUserSpawner]]
- https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/systemuserspawner.py

- dockerspawner.DockerSpawner からの派生クラス
- DockerSpawner と同じパッケージ? 特にインストールしていないが,既に入っていた.
- jovyan ではなく,ログインユーザで使用可.ログインユーザのホームディレクトリをマウントする.
- ただしログインユーザの情報がローカルに取れない場合(LDAPのユーザバインドでログインした場合),ホームディレクトリ等の情報が無いので途中でエラーを起こす.
-- 作りこめば大丈夫かもしれん.


**** dockerspawner.SwarmSpawner [#vad945d1]
- [[SwarmSpawner>./SwarmSpawner]]
- dockerspawner.DockerSpawner からの派生クラス
- DockerSpawner と同じパッケージ
- クラスタリング用.
- コンテナを [[Docker Compose]] で管理し,複数のサーバー上で実行できる.
- 使用ポートは 8000/tcp, 8081/tcp, 8001/tcp, 2377/tcp, 7946/tcp, 7946/udp, 4789/udp 


**** niicloudoperation/jupyterhub-singleuser [#ld71d218]
- NII開発.自由度低し(個人的感想).[[CoursewareHub]] 用 Server Class
- https://github.com/NII-cloud-operation/CoursewareHub-LC_platform
- Document: https://github.com/nii-gakunin-cloud/ocs-templates
- [[dockerspawner.SwarmSpawner>./SwarmSpawner]] からの派生クラス
- 検証中
- INSTALL
 (jupyterhub) # git clone https://github.com/NII-cloud-operation/CoursewareHub-LC_platform.git
 (jupyterhub) # cd CoursewareHub-LC_platform/jupyterhub/spawner
 (jupyterhub) # pip --no-cache-dir install .

*** jovyan って誰? [#w4a21247]
- DockerSpawner を使用すると,作業ディレクトリが /home/jovyan/work 固定なのだが?
- c.DockerSpawner.notebook_dir 辺りをいじっても変化しない?
- https://github.com/jupyter/docker-stacks/issues/358


** 実行 [#a826d7f6]
**** 前準備 [#xa875240]
 # cd /etc/pki/tls
 # openssl req -new -newkey rsa:2048 -days 3650 -nodes -keyout private/key.pem -out server.csr
 # openssl x509 -in server.csr -days 3650 -req -signkey private/key.pem -out certs/server.pem
 # vi  /usr/local/etc/jupyterhub/jupyterhub_config.py
 
 # mkdir /var/lib/jupyterhub

**** 実行 [#k5a94b0c]
 (base) # conda activate jupyterhub
 (jupyterhub) # jupyterhub -f /usr/local/etc/jupyterhub/jupyterhub_config.py

- --no-ssl は0.7で廃止された


** Log [#s553f415]
*** LC_nblineage [#q1878f8f]
- https://github.com/NII-cloud-operation/Jupyter-LC_nblineage
-- lab では動かない!


*** LC_wrapper [#q23dcf44]
- https://github.com/NII-cloud-operation/Jupyter-LC_wrapper


** 情報ソース [#s02d97ba]

*** Notebook [#i00ecdd5]

**** Docker Images [#yceb54d2]

***** niicloudoperation/notebook [#b9ddd7f8]
- docker pull niicloudoperation/notebook


*** Spawner [#v67998b2]

**** [[Docker]] [#e1984289]
- https://github.com/jupyterhub/dockerspawner


**** [[Podman]] [#t1db1fc3]
- https://github.com/gatoniel/podmanspawner


**** [[Kubernetes]] [#af74888d]
- https://github.com/jupyterhub/zero-to-jupyterhub-k8s
- https://zero-to-jupyterhub.readthedocs.io/en/latest/


** DB [#v881917b]
*** MySQL [#ge9c722d]
- [[SQLAlchemy]] で PyMySQL ドライバを使用する
- pool_recycle の設定を忘れずに!
- charset は urf8mb4

** NVIDIA [#o78e60f8]

*** Driver [#n52aa03b]
**** nouveau ドライバ(デフォルトのグラフィックドライバ)を止める [#j9e3e782]
- lsmod | grep nouveau  でドライバ確認
- /etc/default/grab のオプションに rd.driver.blacklist=nouveau を追加
- カーネル設定ファイルの作り直し
-- grub2-mkconfig -o /boot/grub2/grub.cfg   (RedHat系)
-- grub-mkconfig -o /boot/grub/grub.cfg   (Debian系)

**** Driver [#r1aed2e1]
- nvidia-driver, cuda をインストール


**** Docker [#t87b07eb]
- nvidia-container-toolkit が必要
-- コンテナ内からホストのGPUを使う
-- %%nvidia-smi などのコマンドがインストールされる.%%


*** Tool Kit [#z51a5c81]
- CUDA Toolkit : https://developer.nvidia.com/cuda-toolkit-archive
- Tool Kit をインストールするとドライバもインストールされる? (未確認)


*** Docker [#xa8f93e3]
- docker run --gpus all nvidia/cuda:12.2.0-devel-ubuntu20.04 nvidia-smi
-- Failed to initialize NVML: Unknown Error
-- ホストの /etc/nvidia-container-runtime/config.toml を編集して,no-cgroups = false にする.


** Trouble Shooting [#rf83821d]
*** Internal Server Error 500
**** volatile-containers.json から(を)削除してもダメ
- /var/log/message を確認して,該当コンテナIDを探し,docker rm する.
- docker ps -a では表示されないけど docker rm できる.

**** どうしても特定ユーザがログインできない(Podman)
- /var/lib/containers/storage/overlay-containers/[[volatile-containers.json>./volatile-containers.json]] 

<pre>
Request Failed(Internal Server Error): container create: creating container storage: the container name \".........\" is already in use by ........ You have to remove that container to be able to reuse that name: that name is already in use.
</pre>
*** ltiauthenticator [#s373921d]
- https://pypi.org/project/jupyterhub-ltiauthenticator/

**** Jupyterhub 4.0.0 [#b81f6caf]
- 403 : Forbidden  '_xsrf' argument missing from POST  のエラー
-- JupyterHub で XSRFのチェックを強化したらしい

- /usr/local/lib/python3.9/site-packages/jupyterhub/handlers/base.py
-- def check_xsrf_cookie(self)
--- super().check_xsrf_cookie() で例外発生
--- 親は tornado のRequestHandlerか?
- 2023 5/29 時点でこのバグは修正されている.


*** JupyterLab [#m9f4d2fd]
**** JupyterHub をバージョンアップしたら Jupyter Labが起動しなくなった. [#f644f8af]
- 起動する JupyterHub(ex. 2.0.1)とイメージ内のJupyterHub(ex. 1.4.1)が違うとデフォルトで Jupyter Labが起動しなくなるようだ.


*** 日本語のBUG [#ece06e7b]
- 日本語のファイルやディレクトリでコピーなどを行うと errno 13 のエラーが起きる.でもコピーはちゃんと行われる.エラーを消したい.


*** [[PAM]] [#cb278bbe]

**** JupyterHub: PAM使用時に 再login するとPAMの認証エラーになる. [#cec1cefc]
- 認証モジュールに jupyterhub.auth.PAMAuthenticator を使用した場合,再Loginで失敗
-- c.JupyterHub.authenticator_class = 'jupyterhub.auth.PAMAuthenticator'
- バグだろ.
- Resolve: jupyterhub_config.py に ''c.PAMAuthenticator.open_sessions = False'' を追加する
- see: https://github.com/jupyterhub/jupyterhub/issues/486


**** swarm モードだと v1.1.0 でPAM認証のエラーを起こす. [#e7458157]
- 上記バグもこれか?
- 1.0.0 に戻す.
 (jupyterhub) # conda uninstall jupyterhub
 (jupyterhub) # conda -c conda-forge install jupyterhub==1.0.0

*** homeディレクトの名前を変えたら,ログインできなくなった [#yf5e6b43]
- ~/.cache, ~/.jupyter, ~/.local ができているので消す.

*** Programing [#uef8ed38]
**** docker [#g330446b]
- https://docker-py.readthedocs.io/en/stable/api.html

- APIClient 呼び出しメソッド順
-- inspect_image
-- inspect_container
-- inspect_image
-- start
-- port


**** podman [#u96870cc]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS