どこからでもWolfram Engine + JupyterLabにアクセスできる環境を構築する

無料で使えるWolfram EngineをJupyterLabと組み合わせることでMathematicaっぽいノートブック環境を構築できる。

ただ、既存のやり方では環境構築に結構手間がかかるほか、起動時に毎回トークンをブラウザにコピペする必要があった。

そこで認証機能はCloudflare Accessに任せることで起動時のトークン入力を省略し、 またCloudflare Tunnelと組み合わせることでどこからでもアクセスできるようにしつつ、 docker composeを使ってコンテナに格納してしまうことで可搬性を高めた環境を構築してみた。

事前準備

以下のものは事前に準備しておく。

  • dockerをインストールしたUbuntu 24.04マシン
  • Wolfram Cloudのアカウント
  • Cloudflareのアカウントとドメイン

Cloudflare Tunnelの設定

  1. Cloudflareのダッシュボードにログインし、Zero Trust, Network, Tunnelsと進んで、+ Create a tunnelからトンネルを作成。
  2. Cloudflaredを選択
  3. トンネル名は適当に入力し、トンネルのトークン文字列(下図の--token以降の文字列)をコピーしておく。
  4. Public Hostnameから+ Add a public hostnameをクリック。
  5. Subdomainにはお好みのホスト名を入力し、Domainはドメインを選択
  6. ServiceにはTypeHTTPURLにはjupyter:8888と入力

あとは適当に進めて保存。

Cloudflare Accessの設定

JupyterLab側では認証を行わず、Cloudflare側で認証したいので、Cloudflare Accessを設定する。

  1. Zero Trust, Access, Applicationsと進んで+ Add an applicationをクリック。
  2. Self-Hostedを選択。
  3. Application Nameはお好みの名前を入力
  4. Public hostnameには先程トンネルを作成したときにPublic Hostnameに指定したサブドメインとドメインを指定
  5. Access PoliciesからSelect exisiting policiesまたは+ Create new policyから、自分だけアクセスできるようなポリシーを作成・選択
    ※Accessの説明は分量が多くなってしまうので割愛(適宜Access policies · Cloudflare Zero Trust docsなどを参照願いたい)

docker compose

Wolfram Engineを有効にしたJupyterLabの入ったDockerイメージのDockerfileを公開してくれている人がいるので、それを利用させていただく。

ディレクトリとファイルの構造は以下の通りとする。

wolfram-jupyterlab/
├─ jupyter/
│  └─ Dockerfile
├─ .env
└─ docker-compose.yaml

jupyter/Dockerfile

matthewfeickert/wolfram-jupyterDockerfileファイルをコピーして配置。

docker-compose.yaml

以下の内容を入力して保存。

services:
  jupyter:
    build:
      context: ./jupyter/
      dockerfile: Dockerfile
      args:
        - BASE_IMAGE=wolframresearch/wolframengine:14.2.0
        - PYTHON_VERSION=3.12
        - WOLFRAM_ID=${WOLFRAM_ID}
        - WOLFRAM_PASSWORD=${WOLFRAM_PASSWORD}
    volumes:
      - ./:/home/docker/work
    restart: unless-stopped
    command:
      - "-c"
      - "jupyter lab --no-browser --ip 0.0.0.0 --port 8888 --allow-root --IdentityProvider.token=''"
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}

volumesのところはホストの好きなディレクトリに変更しても良い。1
またWolfram EngineやPythonのバージョンを変えたい場合は当該箇所を変更する。

また、commandの引数はDocker を使って JupyterLab を利用するときにトークンなしでアクセスできるようにしたいを参考にさせていただいた。

.env

機密性の高い情報は.envファイルに保存しておくこととするため、以下の内容のテキストファイルを作成。

WOLFRAM_ID=(Wolfram ID)
WOLFRAM_PASSWORD=(Wolfram IDのパスワード)
TUNNEL_TOKEN=(上記で取得したCloudflare Tunnelのトークン文字列)

コンテナのビルド

ターミナルから以下を実行する。

$ cd wolfram-jupyterlab
$ docker compose build

かなり時間がかかるので待つ。

Wolfram IDのパスワードを間違えてしまっている場合はここをやり直す。

実行

コンテナのビルドが終わったら以下のコマンドでJupyterLabを起動する。

$ docker compose up -d

ログを見る場合はdocker compose logs -fを実行し、起動していそうならブラウザからCloudflare TunnelでPublic Hostnameに指定したアドレスを入力するとJupyterLabにアクセスできるはず。

うまく行けばカーネルとしてWolfram Languageが選択でき、ノートブックを作成できる。


  1. Wolfram Engineのライセンスファイルは$PasswordFile(/home/docker/.WolframEngine/Licensing/mathpass)に書き込まれている。 ライセンスの期限を$LicenseExpirationDateで確認すると1ヶ月ちょっと先の日付が表示されたので、更新するためには永続化しておく必要があるかもしれない。現在調査中。 ↩︎