Personium実行環境構築メモ(Oracle Cloud Infrastructure / aarch64編)
Oracle Cloud Infrastructure の aarch64な無料VMを使って、Personiumを構築してみたのでメモ。無料VMについては前回記事を参照してください。
VMの作り方は、相変わらずキャパシティが足りないようなので気合、気合です。
使用したOSは Ubuntu 20.04
です。aarch64(ARM64)なら同様の手順でできるんじゃないかなと思います。
準備
今回は開発用に作っては壊し作っては壊し、というのをしたいのでdockerコンテナで各サーバーを揃えます。
また、今回記事内容をまとめたリポジトリを作ったので↓を利用すると早いです。
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は証明書発行のスクリプトも用意していて、以下のリポジトリのスクリプトを使うと簡単に発行・設定できます。
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」など使いたいドメインに合わせて設定してください。
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が有効でないこと」「ユニットが担当するドメイン」が出力されています。
つぎに、セルのURLにアクセスしてみます。今回はまだセルを作ってないので適当に hogehoge
というセルにアクセスします(https://hogehoge.pds.example.com/
みたいな)。セルがないので「Cell not found」が出力されます。
はい、以上です。
終わりに
今回はパーソナルデータのパの字も出てきませんでしたが、OCIにPersoniumの開発中コードを手軽に実行できる環境を立てることができました。
Personium始めてみたい方がいらっしゃったらドーゾ。コミュニティメンバーも募集しています!