JATOSを使ってウェブ実験を行う場合は,なんらかのサーバーに設置をします。GCPで準備する場合は,Docker-composeを使ってGCE上の複数のサービス(Rstudio, Jupyter notebook, JATOS, elabFTW)をHTTPS化する方法や眞嶋先生のGoogle Cloud Platform を使って JATOS サーバを動かすを参照ください。ここでは,さくらインターネットの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をタイプしてから入力します。
変更ができたら,「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をいれていきます。サーバーに接続をして,以下を実行していきます。
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を用意します。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
サーバー上で以下を実行して,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でウェブ実験ができるようになっていると思います。