JATOSを使ってウェブ実験を行う場合は,なんらかのサーバーに設置をします。GCPで準備する場合は,Docker-composeを使ってGCE上の複数のサービス(Rstudio, Jupyter notebook, JATOS, elabFTW)をHTTPS化する方法や眞嶋先生のGoogle Cloud Platform を使って JATOS サーバを動かすを参照ください。ここでは,さくらインターネットのVPSを使う方法について説明をします。なお,国里はサーバーについての専門的な教育をうけたわけではないので,誤りなどもあるかもございません。もしありましたらご連絡をください。また,以下の内容に関して問題などが生じた際の責任はとれませんので,ご自身の責任の下でお試しください。

さくらVPSとは

JATOSのサーバーとして,グーグルのGCPを使うのも良いのですが,研究者個人や小さな研究室でJATOSだけを動かす場合には若干コスパが悪いかもしれません。さくらインターネットなどのVPS (仮想専用サーバー)を使うほうが,コストも低く抑えることができます。VPSの説明は,こちらが分かりやすいです。簡単にいうとサーバー管理会社にあるサーバーをユーザーごとに仮想的に分割して使えて,自由にアプリなどをインストールしたりできます。完全な専有サーバーよりもコストが安いのが特徴です(毎月2千円弱)。以下では,さくらVPSにJATOSを導入する方法について説明をしていきます。

まず,さくらインターネットで,アカウントを作成して,VPSの契約をします。ウェブ実験の規模や内容によって変わってくると思いますが,とりあえず2GB・仮想3Coreで良いかと思います。それでVPSの契約をして,Ubuntu 20.04をOSに選択し,スタートアップリストはなしにします。これで,JATOSをおくサーバーが用意できました。それでは,サーバーの初期設定をしていきましょう。

サーバーへの接続と作業用アカウントの設定

まず,最初にローカルのパソコンのターミナルからSSH接続をします(以降のローカルでの作業はMacをベースに説明しますが,Windowsユーザーの方はターミナルをコマンドプロンプトに読み変えると良いかと思います。またssh接続や公開鍵接続に関しては Windowsの便利なソフトがあったと思います)。<IP>にはご自身が契約したVPSのIPアドレスをいれて,以下をターミナルで実行します。パスワードを聞かれると思うので入力するとログインできると思います。なお,さくらVPSでUbuntuを選択するとログイン名がrootではなくubuntuになります。

ssh ubuntu@<IP>

ログインできたら,以降の作業で使う作業用アドミンアカウト名を追加します。作業用アドミンアカウト名を英語で用意し,adduserすると色々と聞かれますが,適切な難易度のパスワードを設定する他は,エンターを押していくので問題ないです。

sudo adduser 作業用アドミンアカウト名
sudo usermod -aG sudo 作業用アドミンアカウト名

ターミナルにexitを打って,一度サーバーから出てから,作業用アドミンアカウト名でログインできるかやってみましょう。ログイン時には設定したパスワードを打ってください。ログインできたら一度exitでログアウトしてください。

ssh 作業用アドミンアカウト名@<IP>

公開鍵接続の設定

パスワード認証によるログインではセキュリティ上不安がありますので,公開鍵での接続にしましょう。ローカルのターミナルで以下のコマンドをうつと公開鍵が作られます。

ssh-keygen -t rsa

作った鍵をサーバーにアップしましょう(以下はMacの場合のパスの例です)。

scp /Users/ユーザー名/.ssh/id_rsa.pub 作業用アドミンアカウト名@ホスト名:~/id_rsa.pub

サーバーでの設定をしていきます。

cd /home/作業用アドミンアカウト名/
mkdir .ssh
cat id_rsa.pub > .ssh/authorized_keys
sudo chown -R 作業用アドミンアカウト名 ~/.ssh/
rm -f id_rsa.pub

さらに,サーバーの設定をします。まずviでsshd_configを開きます。

sudo vi /etc/ssh/sshd_config

開いたファイルの内,以下を変更します。コメントアウトされている場合は#を削除する。なお,viで入力するにはiをタイプしてから入力します。

  • PubkeyAuthentication yes
  • AuthorizedKeysFile .ssh/authorized_keys

変更ができたら,「Esc」キーを打ってから,「:wq」と打って保存します。設定を反映させるために,以下を実行します。

sudo systemctl restart sshd

それでは,今度は,ローカルの設定をしていきましょう。ローカルのターミナルを開いて,sshのconfigを編集します(まだないなら以下で新規作成されます)。

vi /Users/ユーザー名/.ssh/config

ひらいたファイルに以下を打ちます。Hostの横のjatosはなんでもいいのですが,覚えやすい簡単なものがいいと思います。以下の日本語になっているところはそれぞれ変更ください。

Host jatos
  HostName サーバーのホスト名
  IdentityFile  /Users/ユーザー名/.ssh/id_rsa
  User 作業用アドミンアカウト名

これで,以下をうつだけでサーバーに接続できるようになるかと思います。公開鍵で接続ができるようになったら,サーバーのsshd_configをPasswordAuthentication noにしておきます。

ssh jatos

ポートを変更する

さくらVPSでは22番ポートを使うのですが,攻撃を避けるために22番以外のポートを使うことをおすすめします。サーバーで以下を実行してsshd_configを開いて,Portを任意の数字に変更します。

sudo vi /etc/ssh/sshd_config

なお,さくらはサーバーの設定の外側でパケットフィルタを用意しているので,カスタムTCPで自分が設定したPort番号を設定します。

ポートが設定できたらローカルの公開鍵接続に関する設定においてもポートを追加します。

ローカルの設定を開きます。

vi /Users/ユーザー名/.ssh/config

ポートを追加します。

Host jatos
  HostName サーバーのホスト名
  IdentityFile  /Users/ユーザー名/.ssh/id_rsa
  User 作業用アドミンアカウト名
  Port 設定したポート番号

以下で接続ができたら,22番portは閉じます(パケットフィルタを切る)。

ssh jatos

ここまでのサーバーに安全に接続する方法の設定が一番たいへんな気もします。ですが,ここまででミスってもOSを再インストールすればいいだけなので,変な感じになったら再インインストールをすればよいかと思います。

Dockerのインストール

さて,Dockerをいれていきます。サーバーに接続をして,以下を実行していきます。

sudo apt update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

同様に,docker-composeをインストールします。

sudo apt install docker-compose-plugin

DockerでTreafikを準備する

Dockerが入ったらTreafikを用意します。TreafikはHttps化を実現するリバースプロキシ&ロードバランサです。これをつかうと,ユーザーがJATOSサーバーに接続する際にHTTPSで接続できるようになります。Treafikを利用するにあたり,ドメインが必要です(URLにあるXXX.comのXXXのことです)。ドメインはさくらインターネットでもとれますし,googleなどもサービスを用意しています。まず,以下をサーバー上で実行します。1行目でdocker-composeで使うサーバー外につながるネットワークを用意します。2〜3行目でtraefik用フォルダと設定ファイルを作成します。4行目で,あとで,SSL暗号化の内容を書込み可能なように設定します。

sudo docker network create proxy
sudo mkdir -p /opt/traefik
sudo touch /opt/traefik/{traefik.toml,docker-compose.yml,acme.json}
sudo chmod 0600 /opt/traefik/acme.json

traefik用のdocker-composeファイルを設定します。以下のコマンドをターミナルに打ち込みます。なんか画面が出てきますが,ほぼ空欄になっていると思います。

sudo vim /opt/traefik/docker-compose.yml

そこで,以下をコピペして貼り付けします。それから,escキーをタイプしてから,:wqとタイプします(保存されます)。

version: '2'
networks:
  proxy:
    external: true
  internal:
    external: false

services:
  traefik:
    image: traefik:v1.7.30
    command: --docker
    ports:
      - 80:80
      - 443:443
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/traefik/traefik.toml:/traefik.toml
      - /opt/traefik/acme.json:/acme.json
    container_name: traefik
    restart: always

次にtraefik用のtomlファイルを設定します。以下のコマンドをターミナルに打ち込みます。なんか画面が出てきますが,ほぼ空欄になっていると思います。

sudo vim /opt/traefik/traefik.toml

そこで,以下の内容を一部改変して,コピペして貼り付けします(ご自身のエディタで改変してからコピペすると楽かなと思います)。改変は,(1)[docker]ってところのdomainをご自身のドメイン名に変更する,(2)[acme]ってところのemailをご自身のメールアドレスにしてください。改変した内容をコピペできたら,escキーをタイプして,:wqとタイプします(保存されます)。

defaultEntryPoints = ["https","http"]

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
  [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "ドメイン名"
watch = true
exposedByDefault = false

[acme]
  email = "メールアドレス"
  entryPoint = "https"
  storage = "acme.json"
  caServer = "https://acme-v02.api.letsencrypt.org/directory"
  onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

では,設定した内容を元にして,traefikを起動するのですが,さくらのパケットフィルタリングの制限をかけた状態でtraefikを立ち上げると,Let’s Encryptからの認証を得られないので,80/443番をあけておきましょう。パケットフィルタリングの設定ができたら,以下を実行します。しばらくして,doneって出てきたら成功です。

sudo docker compose -f /opt/traefik/docker-compose.yml up -d

DockerでJATOSを準備する

サーバー上で以下を実行して,JATOS用のdocker-compose.ymlを用意します。

sudo mkdir dir_docker_compose/jatos
sudo vim dir_docker_compose/jatos/docker-compose.yml

空欄のファイルだとおもいますので,以下をコピペして貼り付けします(下から3つ目のドメイン名はご自身のドメイン名を利用ください)。それから,escキーをタイプしてから,:wqとタイプします(保存されます)。doneって出てきたら成功です。

version: '3'

networks:
  proxy:
    external: true
  internal:
    external: false

services:
  jatos:
    image: jatos/jatos:latest
    networks:
      - internal
      - proxy
    container_name: jatos
    restart: always
    labels:
      - traefik.docker.network=proxy
      - traefik.enable=true
      - traefik.frontend.rule=Host:ドメイン名
      - traefik.port=9000
      - traefik.protocol=http

設定できたら,Docker composeで

sudo docker compose -f dir_docker_compose/jatos/docker-compose.yml up -d

これでご自身のドメイン名のURLにJATOSが用意されているかと思います。最初は,ID:admin, パスワード:adminに設定されていますので,立ち上がったらすぐにadminのパスワードを適切な難易度のものに変更ください。あとは,adminでユーザーを追加したりできますし,JATOSでウェブ実験ができるようになっていると思います。