ローカルネットワーク内でサーバーを立てる その1(Ubuntu 22.04、JupyterLab)

はじめに

 今回はローカルネットワーク内でPythonを実行できるサーバーを立ててみました。

 Raspberry PiやミニPCでもSSH接続やサーバーアプリケーションを利用して、同一ネットワーク内でアクセスしていました。同じ方法で、性能の良いPCを複数人で活用するために試してみました。

 20万円のPCを2人に渡すよりも、40万円のPCを10人ぐらいで使う方が良いのではないかと考えています。

▼以前の記事はこちら

Raspberry Pi Zero 2を使ってみる その3(1.3inch LCD HAT、至近距離での撮影)

はじめに  今回は要望がありまして、Raspberry Piで利用できるWaveshareの1.3inch LCD HATにカメラの映像を映してみました。  至近距離で撮影するとのことだったので試…

Unreal Engine 5を使ってみる その11(Pixel Streaming )

はじめに  今回はUnreal Engine(UE)のPixel Streamingプラグインを利用して、ゲーム画面をストリーミングしてみました。  同じネットワークに接続している端末で、ブラ…

Ubuntuをインストールする

▼手順は以下の記事と同じなので、詳しくはこちらをご覧ください。

USBメモリでミニPCにUbuntuをインストールする(Rufus)

はじめに  今回はUSBメモリでミニPCにUbuntuをインストールしてみました。  身近にUSBでWindowsとUbuntuを切り替えている方がいたので、できることは知っていました。た…

 OSはUbuntu 22.04のDesktop Imageをインストールしました。

▼Ubuntu 22.04のページはこちら

https://releases.ubuntu.com/22.04

 Rufusを利用してUSBメモリにブートドライブを作成し、PCのBIOSでブートドライブを選択し、インストールします。

▼Rufusのページはこちら

https://rufus.ie/ja

▼インストールして設定後、以下のようにUbuntu 22.04のデスクトップ画面が表示されます。

SSH接続をする

IPアドレスで接続する

▼SSH接続はRaspberry Piでよく利用しています。

有線キーボード無しでRaspberry Pi Zeroのセットアップをする(SSH接続、Raspberry Pi Imager)

はじめに  今回は手元に有線キーボードが無かったので、SSH接続でRaspberry Pi Zeroのセットアップをしてみました。  ネット上にあったやり方だと少しずつ異なっていた…

 以下のコマンドで、同一ネットワーク内の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の仮想環境の作成については、以下の記事にまとめています。

Pythonの仮想環境を作成する(venv、Windows)

はじめに  今回はPythonの仮想環境の作成についてまとめてみました。  Pythonを利用したNode-REDのノードを開発するときに仮想環境を詳しく調べていました。作成した仮…

 以下のコマンドで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の実行ファイルのパスを直接指定すれば、仮想環境を有効化する必要がありません。

▼少し込み入った話なのですが、こちらの記事で触れています。

Pythonの仮想環境を作成する(venv、Windows)

はじめに  今回はPythonの仮想環境の作成についてまとめてみました。  Pythonを利用したNode-REDのノードを開発するときに仮想環境を詳しく調べていました。作成した仮…

 まずは絶対パスを指定して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は使いやすいのですが、他のソフトウェアを使うことも検討すべきだとは思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です