いしぐめも

プログラミングとかしたことを書きます。

Personium実行環境構築メモ(Oracle Cloud Infrastructure / aarch64編)

Oracle Cloud Infrastructure の aarch64な無料VMを使って、Personiumを構築してみたのでメモ。無料VMについては前回記事を参照してください。

yoh1496.hatenablog.com

VMの作り方は、相変わらずキャパシティが足りないようなので気合、気合です。

使用したOSは Ubuntu 20.04 です。aarch64(ARM64)なら同様の手順でできるんじゃないかなと思います。

準備

今回は開発用に作っては壊し作っては壊し、というのをしたいのでdockerコンテナで各サーバーを揃えます。

また、今回記事内容をまとめたリポジトリを作ったので↓を利用すると早いです。

github.com

dockerの準備

Dockerのインストール手順を書きそうになりましたが、前回記事で紹介したので今回は行いません。

  • docker-compose のインストール
  • 使用ユーザーの docker グループへの追加

あたりを行ってください。

DNSの準備

Personiumでは、各自の保存領域をサブドメインで割り当てる方式をとります。この領域を「セル」と呼ぶのですが、それを束ねる役目が「ユニット」であり、今回はその「ユニット」を構築していきます。

まずは大本であるユニットに対してドメインを割り当てます。今回はIPアドレス変更を通知することでドメインの向き先を変更できるDDNS「mydns.jp」を使用します。これ、「○○.mydns.jp」というドメインももらえてしかも無料という最高なDDNSです。

Free Dynamic DNS (DDNS) for Home Server and VPS etc

まずは日ごとにIPアドレスを通知するスクリプトを作成します /home/ubuntu/bin/mydns_update.sh あたりに以下のファイルを作成しました。

#!/bin/sh

# MyDNS.JP
# ohesonium.mydns.jp
curl -o /dev/null -D - "https://mydnsAAAAA:mydnsPASSWORD@www.mydns.jp/login.html"

で、crontab -e

0 0 * * * /home/ubuntu/mydns_update.sh

などと設定し、日ごとに実行されるようにします。

SSL証明書の準備

そのドメインがそのユニットからの通信であることを証明するために、PersoniumではHTTPSで通信することを必須としています。そのため、今回リバースプロキシを行うnginxにはSSL証明書を配置して、それを使用します。

自分の環境ではLet's encryptを使用しましたが、ワイルドカード証明書が使えて無料っていうのはいいですね~~。 MyDNS.JPは証明書発行のスクリプトも用意していて、以下のリポジトリスクリプトを使うと簡単に発行・設定できます。

GitHub - disco-v8/DirectEdit: These are scripts for users of MyDNS.JP and are necessary to obtain server certificates with Let's Encrypt's DNS-01.

sudo apt-get install php7.4-cli php7.4-mbstring certbot

DirectEdit-master/txtedit.conf のIDとパスワード、ドメインを設定します。

sudo certbot certonly --manual --preferred-challenges=dns \
--manual-auth-hook ./txtregist.php --manual-cleanup-hook ./txtdelete.php \
-d <YOUR_DOMAIN> -d *.<YOUR_DOMAIN> \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m <YOUR_MAIL> --manual-public-ip-logging-ok

このコマンドを実行して待っていればユニット用の証明書が /etc/letsencrypt/live/<YOUR_DOMAIN>/*.pem に作成されるはずですので、それのパーミッションを実行ユーザーが読めるように変更し、シンボリックリンクを張ります。

cd ./nginx
ln -s /etc/letsencrypt/<YOUR_DOMAIN>/live/fullchain.pem server.crt
ln -s /etc/letsencrypt/<YOUR_DOMAIN>/live/privkey.pem server.key

ユニット証明書の作成

Personiumではユニットと呼ばれる単位でキーペアを持っており、そのキーを使用して中にあるセルの署名を行います。まぁとりあえず、有効なユニットであることを証明する証明書をSSL証明書の他に作成する必要がある、と考えてください。

証明書の作成は下記のリンクの通り。

https://github.com/personium/ansible/blob/develop/How_to_generate_Self-signed_Unit_Certificate.md

とりあえず今回は ./personium-core/x509/ フォルダに作成し、dockerのvolumeオプションでマウントしようと思います。

cd ./personium-core/x509
openssl genrsa -out unit.key 2048
openssl req -new -key unit.key -out unit.csr

ここで注意なのが、CommonNameにユニットのFQDNを入力することです。たとえば、「personium.example.com」など使いたいドメインに合わせて設定してください。

f:id:yoh1496:20210707212433p:plain
CommonName はサーバーのドメイン名(ユニットのFQDN

openssl x509 -req -days 3650 -signkey unit.key -out unit-self-sign.crt <unit.csr
openssl x509 -in unit-self-sign.crt -text

これで以下の通り、3つのファイルが出来上がっていればOKです。(このうち unit-self-sign.crt unit.key を使用します)

ls -la
total 20
drwxrwxr-x 2 ubuntu ubuntu 4096 Jul  7 12:08 .
drwxrwxr-x 3 ubuntu ubuntu 4096 Jul  7 12:03 ..
-rw-rw-r-- 1 ubuntu ubuntu 1204 Jul  7 12:08 unit-self-sign.crt
-rw-rw-r-- 1 ubuntu ubuntu  997 Jul  7 12:08 unit.csr
-rw------- 1 ubuntu ubuntu 1679 Jul  7 12:07 unit.key

設定ファイル

Personiumではユニットの設定ファイルを Java のプロパティファイルに書きますが、これはリポジトリに同梱したのでクローンして使ってください。

基本的に Personiumドキュメントにあるものと同じです。

設定ファイル解説:perCellの設定

Personiumの昔のURLの取り扱いは pathBase となっていて、パスの一部にセル名を含んでいました(下記例参照)。しかし、それではドメインで制御されるCookieなどとの相性が悪かったため、現在ではセルごとにドメインを分ける perCell 方式が推奨されています。

URL方式
pathBase https://pds.example.com/taro-cell/
perCell https://taro-cell.pds.example.com/

現在のPersoniumでは旧来の pathBase なURL(開発用途ではpathBaseな方が取り扱いやすい)でも動作可能なようにオプションが残されていますので、これを無効化します。

io.personium.core.pathBasedCellUrl.enabled=false

個人的には、pathBaseだと配置したセルによってアプリのパスが変わるとかいう地獄が発生するので、pathBaseにはアレルギー反応が出ます。

いざ実行

今回作成した personium-docker-for-dev は開発しているソースを手軽に実機で操作させられるように作成したものなので、同じフォルダに personium-core personium-engine がある必要があります。フォルダ構成はこんな感じ↓

━┳━┳ 📁personium-docker-for-dev
 ┃ ┣ 📁personium-core 
 ┃ ┣ 📁personium-engine 
 ┃ ┗ 📃docker-compose.yml
 ┃ 
 ┣━ 📁personium-core   ←別途cloneする
 ┗━ 📁personium-engine  ←別途cloneする

そして、docker-composeがそれらのフォルダで生成した war ファイルを参照するので実行前にビルドします。各フォルダで mvn package -DskipTests すればビルドできます。

確認

まずはユニットのURLにアクセスしてみましょう(https://pds.example.com/ みたいな)。ユニットのURLに直接アクセスするとユニットのメタデータが表示されます。今回は「pathBaseなURLが有効でないこと」「ユニットが担当するドメイン」が出力されています。

f:id:yoh1496:20210708162229p:plain
ユニットのURLにアクセスしたところ

つぎに、セルのURLにアクセスしてみます。今回はまだセルを作ってないので適当に hogehoge というセルにアクセスします(https://hogehoge.pds.example.com/ みたいな)。セルがないので「Cell not found」が出力されます。

f:id:yoh1496:20210708162558p:plain
セルのURLにアクセスしたところ

はい、以上です。

終わりに

今回はパーソナルデータのパの字も出てきませんでしたが、OCIにPersoniumの開発中コードを手軽に実行できる環境を立てることができました。

Personium始めてみたい方がいらっしゃったらドーゾ。コミュニティメンバーも募集しています!