ローカルネットワーク内でサーバーを立てる その1(Ubuntu 22.04、JupyterLab)
はじめに
今回はローカルネットワーク内でPythonを実行できるサーバーを立ててみました。
Raspberry PiやミニPCでもSSH接続やサーバーアプリケーションを利用して、同一ネットワーク内でアクセスしていました。同じ方法で、性能の良いPCを複数人で活用するために試してみました。
20万円のPCを2人に渡すよりも、40万円のPCを10人ぐらいで使う方が良いのではないかと考えています。
▼以前の記事はこちら
Ubuntuをインストールする
▼手順は以下の記事と同じなので、詳しくはこちらをご覧ください。
OSはUbuntu 22.04のDesktop Imageをインストールしました。
▼Ubuntu 22.04のページはこちら
https://releases.ubuntu.com/22.04
Rufusを利用してUSBメモリにブートドライブを作成し、PCのBIOSでブートドライブを選択し、インストールします。
▼Rufusのページはこちら
▼インストールして設定後、以下のようにUbuntu 22.04のデスクトップ画面が表示されます。

SSH接続をする
IPアドレスで接続する
▼SSH接続はRaspberry Piでよく利用しています。
以下のコマンドで、同一ネットワーク内のPCのターミナルにアクセスすることができます。
ssh <ユーザー名>@<IPアドレス>
▼WindowsのPCからUbuntu環境にアクセスすると、以下のようになります。

IPアドレスはUbuntu環境で以下のコマンドを実行すると確認できます。
hostname -I
接続できたら、PCにログインするときと同様にパスワードを入力する必要があります。
mDNSの設定を行う
Raspberry Piの場合は、ssh pi@raspberrypi.localのように、IPアドレスが分からなくてもSSH接続ができていました。Ubuntuをインストールする場合はどうすればいいのかChatGPTに聞いてみたのですが、mDNSの設定を行うと良さそうでした。
以下のコマンドを実行して、設定を行いました。Avahiを利用します。
sudo apt udpate
sudo apt upgrade
sudo apt install -y avahi-daemon libnss-mdns
sudo systemctl enable avahi-daemon
sudo systemctl start avahi-daemon
以下のコマンドを実行して、ファイルを修正します。
sudo nano /etc/nsswitch.conf
hosts: files mdns4_minimal [NOTFOUND=return] dnsの欄にmdns4が無かったので、スペース区切りで追記しました。その後再起動しました。
▼以下のように追記しました。Ctrl+Sで保存、Ctrl+Xで終了できます。

OpenSSHもインストールして、実行状態にしました。
sudo apt install -y openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
ここまでの設定ができれば、同一ネットワーク内の別のPCで以下のコマンドを実行すると、SSH接続ができるようになります。
ssh <ユーザー名>@server.local
▼接続できました。

これでIPアドレスが変わっても、サーバー名でアクセスできて便利です。
JupyterLabを起動する
Pythonの実行環境として、今回はJupyterLabを利用します。Jupyter Notebookの実行環境だけでなく、コマンドプロンプトのように実行することもできて便利です。
まずはPythonの仮想環境を作成するのですが、venvをインストールする必要がありました。以下のコマンドを実行しました。
sudo apt install python3-venv
仮想環境を作成し、有効化して、jupyterlabをインストールします。
python3 -m venv pyenv
cd pyenv
source bin/activate
pip install jupyterlab
▼Pythonの仮想環境の作成については、以下の記事にまとめています。
以下のコマンドでJupyterLabを起動しました。
jupyter lab --ip=0.0.0.0 --port=8888
起動後、ターミナルにアクセス先のURLがトークン付きで表示されます。そのURLにアクセスすると、JupyterLabの画面が起動します。
▼別PCからもアクセスできました!IPアドレスはサーバー名でアクセスできています。

▼Terminalにアクセスしてコマンドを実行していたのですが、pipもインストールする必要がありました。

▼さらにPythonの仮想環境を作成して有効化することもできました。

なおアクセストークン付きだとURLが以下のように長くなってしまいます。しかも起動するごとにトークンが変わるので、再起動するごとにURLを再共有する必要があります。
http://server:8888/lab?token=7551fe64be309a08e07af861a1a9262fa9921962fcc578da
その作業が面倒だったので、トークンの入力が不要になるよう、以下のコマンドでjupyter labを再起動しました。
jupyter lab --ip=0.0.0.0 --port=8888 --NotebookApp.token=''
これでhttp://server:8888/labにアクセスすれば利用できました。
自動起動するように設定する
現状ではJupyterLabをターミナルで起動する必要があるのですが、PCを起動するたびにコマンドを実行するのは面倒なので、自動で起動するようにします。
Raspberry PiにインストールしたNode-REDの場合は、systemctlで自動起動していました。今回もsystemctlを利用します。
これまではJupyterLabを起動する前に仮想環境を有効化していましたが、jupyterの実行ファイルのパスを直接指定すれば、仮想環境を有効化する必要がありません。
▼少し込み入った話なのですが、こちらの記事で触れています。
まずは絶対パスを指定してJupyterLabを起動できるか確認します。私の場合は以下のコマンドで実行できました。
/home/background/playground/JupyterLab/pyenv/bin/jupyter lab --ip=0.0.0.0 --port=8888 --NotebookApp.token=''
これをsystemctlで実行するように設定します。以下のコマンドでファイルを作成します。
sudo nano /etc/systemd/system/jupyterlab.service
以下の内容を記述しました。<ユーザー名>の部分は、Ubuntu環境のユーザー名に変更してください。Ctrl+Sで保存、Ctrl+Xで終了できます。
[Unit]
Description=JupyterLab
After=network.target
[Service]
User=<ユーザー名>
WorkingDirectory=/home/background/playground/JupyterLab/pyenv
ExecStart=/home/<ユーザー名>/.local/bin/jupyter-lab --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.token=''
Restart=always
[Install]
WantedBy=multi-user.target
以下のコマンドを実行して、jupyterlabを起動します。
sudo systemctl daemon-reload
sudo systemctl start jupyterlab
▼daemon-reloadを実行していないと、警告が表示されていました。

この後JupyterLabの画面にアクセスできることは確認したので、以下のコマンドで自動起動するように設定しました。
sudo systemctl enable jupyterlab
JupyterLabの設定ファイルを利用する
JupyterLabをコマンドで実行するときの引数が長くなっていたのですが、調べていると設定ファイルにまとめることができるようでした。
▼以下の記事が参考になりました。
https://qiita.com/nujust/items/a396f96f9a7b7963e2f4
以下のコマンドで設定ファイルを生成することもできるのですが、長いうえにほとんどコメントアウトされていました。
jupyter lab --generate-config
今回は必要な部分だけファイルに書いて、JupyterLabを起動するときにパスを指定するようにします。以下のコマンドでファイルを作成します。
cd
sudo nano .jupyter/lab-config.py
ファイルの中身は以下のように記述しました。
c = get_config()
c.ServerApp.ip = "*"
c.ServerApp.port = 8888
c.ServerApp.open_browser = False
c.ServerApp.root_dir = "/home/background/playground/JupyterLab"
c.ServerApp.token = ""
systemctlで起動するときのファイルも修正しました。
sudo nano /etc/systemd/system/jupyterlab.service
先程作成したファイルのパスを指定します。
[Unit]
Description=JupyterLab
After=network.target
[Service]
User=background
WorkingDirectory=/home/background/playground/JupyterLab/pyenv
ExecStart=/home/background/playground/JupyterLab/pyenv/bin/jupyter lab --config="/home/background/.jupyter/lab-config.py
Restart=always
[Install]
WantedBy=multi-user.target
jupyterlabを再起動しました。
sudo systemctl daemon-reload
sudo systemctl start jupyterlab
この状態で起動しても、同じように利用できました。
最後に
途中でPCの2つあるLANポートのうち、片方に接続してもネットワークに繋がらないという問題があったのですが、とりあえず起動できました。使われていなかったPCなので、PC自体に謎の問題がある可能性はあります。
まだ課題は残っていて、現状ではTerminalからディレクトリに自由にアクセスできてしまいます。
▼ホームディレクトリに移動できます。

複数人で利用するための良い方法を模索していきたいなと思っています。JupyterLabは使いやすいのですが、他のソフトウェアを使うことも検討すべきだとは思います。