爆速でリモートサーバー上のjupyter lab環境を構築したい！

# はじめに
手元のPCでサーバー上のjupyter labをサクッと使う方法をご紹介いたします。特に研究室配属された学生など初心者の方の助けになれば幸いです！

:::note warn
リモートサーバー上にDockerがインストールされていることを前提に説明します。よくわからない方はとりあえずそのまま設定してみてください
:::
↓　今回やることのイメージ（この記事では説明のためにそれぞれ異なるPort番号を設定していますが、実際に使うときはすべて8080番にするなど揃えたほうがいろいろと便利だと思います）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2848654/2ad484e1-18c0-157e-6f3a-c5f3c4a8843a.png)

# 1. リモートサーバーへポートフォワーディング
ローカルのポート8000とリモートサーバーの9000にポートフォワーディングしています。（ポート番号は自由に設定してください。）
ここではremoteというサーバーに接続しています
```zsh
ssh -L 8000:localhost:9000 remote # オプションで -L Port(local):localhost:Port(remote)を追加している
```
:::note info
プロキシジャンプする方法がわからない方のために、最後の補足に~/.ssh/configの設定例を書いているので、参考にしてください
:::



# 2. Dockerfileの作成
以下はjupyter labが使えるようになるDockerfileの一例です。PoetryというPythonのパッケージマネージャー併用していますが、知らない方はとりあえず以下のDockerfileと同じディレクトリに以下のpyproject.tomlというファイルを配置してください:pray:（この場合特にサーバー上にPoetryをインストールする必要はありません。）
```pyproject.toml
[tool.poetry]
name = "lab-env"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = ">=3.10,<3.13"
jupyterlab = "^4.0.7"
pandas = "^2.1.1"
numpy = "^1.26.1"
pandarallel = "^1.6.5"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```
```Dockerfile:Dockerfile
FROM python:3.10.13-bookworm

WORKDIR /app
ENV PATH /root/.local/bin:$PATH

RUN apt-get update && apt-get install --no-install-recommends -y \
    git \
    wget \
    curl \
    nano \
    less \
    screen \
    tmux

RUN curl -sSL https://install.python-poetry.org | python3 -
RUN pip3 install --upgrade pip
RUN mkdir -p /app/src/DATA
COPY . /app

RUN pip3 install --upgrade pip \
    && pip3 install poetry \
    && poetry config virtualenvs.create false

RUN poetry install
CMD [ "bash" ]
```


# 3. Dockerfileをビルド & コンテナの起動
以下のコマンドでdockerイメージを作成します。
```zsh
docker image build -t lab/env:1 .
```
次に以下のコマンドでdockerコンテナに入ります（remoteのポート番号をコンテナ内のポート番号に接続している）
```zsh
docker run -it -v ${PWD}:/app -p 9000:9999 --name lab-env lab/env:1
```

:::note warn
Dockerfile、pyproject.tomlが配置されたディレクトリでコマンドを入力してください。
また、上記のコマンドでカレントディレクトリをdockerコンテナの/appに繋いでいます。そのため加工したいデータがある場合、カレントディレクトリに配置してください。
:::

# 4. jupyter labを起動
コンテナ内でjupyter labを起動します。以下のコマンドで起動できます。
```zsh
root@hoge:/app# jupyter lab --allow-root --ip=* --port 9999
```
起動後ターミナル上で以下のようなURLが表示されるので、?token=以降をコピーしときます。
```zsh
http://localhost:9999/lab?token=e61d3f****************
```
最後に手元のPCでhttp://localhost:8000/lab にアクセスしましょう。ポート番号にご注意を。tokenが求められたら、先程コピーしたtokenを打ち込みましょう。これで手元のPCでリモート上のjupyter labを利用できるはずです。

:::note
ポート番号を揃えておくと、ターミナル上に表示されたURLにアクセスするとそのままjupyter labを起動できるメリットがあります
:::


# 補足. ~/.ssh/config設定
プロキシジャンプしてサーバーに接続できるようにします。以下は一例です。stepが踏み台サーバー、remoteが計算用のサーバーです。
```zsh:~/.ssh/config
Host step
  HostName 100.100.1.1 （踏み台のIPアドレス or *.jpなどの名前）
  User hoge　（ユーザーの名前）
  Port 100　（ポート指定がある場合）
  IdentityFile ~/.ssh/hoge.key （鍵へのPATH）
  ForwardAgent yes
  IdentitiesOnly yes
  PasswordAuthentication no
  AddKeysToAgent yes

Host remote
  HostName 100.100.1.2 （jupyter使うサーバーのIPアドレス or *.jpなどの名前）
  User hoge　（ユーザーの名前）
  ProxyCommand ssh -W %h:%p step　（踏み台サーバー設定）
  IdentityFile ~/.ssh/hoge.key　（鍵へのPATH）
  ServerAliveInterval 60
  AddKeysToAgent yes
```