Raspberry Pi で PDS を動かす!
正しくは、「Raspberry Pi(のようなARMボード)でPDSを動かす!」です。実際はTinkerBoard(Raspberry Pi2相当?)を使用しているので、タイトル詐欺なところはありますが、Raspberry Pi系でも同様のことができます。
PDS(Personal Data Store) とは?
PDSとはどういうものかというと、Personal Data Storeという名前の通り、個人データの入れ物です。ここではPDSを使用することで、どういう風にアプリが変わるか、というレイヤーのお話をしたいと思います。
よくあるWebアプリの利用形態は、下の図のようにアプリケーションの提供者(右)がWebアプリの資材と個人データの管理を行い、ユーザー(左)がそれらを取得し利用する、という形になっていると思います。個人データはマネージドなクラウドのDBに格納されてる!っていう場合であっても管理の主体はアプリの提供者、だと思います。
PDSが導入された世界観では、アプリのデータの保存先を「PDS」と呼ばれる入れ物に向け、個人データをそこに蓄積していきます。
こうすることで、アプリの提供者はあくまで「アプリ資材」のみを提供するだけでよく、近年扱いが難しくなってきている個人データの取り扱いから開放される他、ユーザーにとっても個人データがアプリ提供者の管理から外れるため自由に活用できる、というメリットが発生します。
アプリ間のデータ共有を実現するPDS
・アプリ提供者が個人データの取り扱いから開放される
・個人データが自由に活用できる
先程あげた、こういった世界観はなかなか理解できないと思いますが、実はネイティブアプリで今までやっていたことをネットワーク越しにやっているのに近いのではないか?と最近自分で思い始めています。今回は実験的にそういう説明をしてみます。
左図は、ネイティブアプリで実現されてきたローカルなストレージに対して読み書きをしている模式図です。1つのフォルダに複数の矢印が向いているのは、例えば、お絵かきアプリを使って保存した画像データをSNSアプリでシェアするといったように、複数アプリで共有されていることを表します。PDSを導入することでそれがネットワーク上に移しつつも、実現できるようになるのです(右図)。つまり、端末にログインすればいつもの環境(データ・アプリ)がある、という環境のクラウド化みたいなのが実現できるのではないでしょうか(個人の感想です)。
国産PDSの「Personium」
こういったPDSの概念を実現するには、単にネットワークストレージをアプリ間で共有すれば達成されるかというとそうではなく、アプリからPDSへのアクセス方式だったり、どのようにアクセスコントロールするかなど、予め方式を定めておかないとバラバラな仕様になってしまい、アプリごとにPDSが乱立するような状況に陥りかねません。Personium はそういった決まり事を定めた、PDS実装のうちの1つです。(PDSの世界はまだ標準化されていない認識です)
PDSをRaspberry Piで動かす!
というわけで、本題に戻ります。今回は 「Personium というPDSサーバーを自宅の ARMボード で動かそう!」というのが趣旨です。図で示すとこんな感じ。
・私(taro)用のPDSを家のドメイン(myhome.example.jp)に立てる
・私はアプリの資材を app.somecompany.example.co.jp から受け取る
・個人データは PDS(taro.pds.myhome.examle.jp)で読み書きする
なぜ自宅でPDSを動かすのか?
せっかくPDSでデータが自分の管理下に置かれるんだから、サーバーも自宅にあった方が自分で管理してる感が出るのでいいのでは?というのが理由です。何より物理的に手元にあるので安心感(本当か?)があります。そして、やろうと思えば誰でもPDSを立てられるのだということを証明したかったというのもあります。
なぜARMボード?
特にARMだからどう、というわけではありません。強いてあげれば、TinkerBoardやRaspberry Piが安価で手に入りやすい低消費電力なシングルボードコンピュータだからです。
なぜPersonium?
それは、Personiumがオープンソースソフトウェアであり、誰もがPDS事業者になれるということを掲げているのが大きいです。PDS事業者になれるということは自分専用のPDSが作れるのはもちろん、他の人が使用するPDSを提供したり、他のPDSとの連携を実現できるサーバーを建てられるということです。
手順1:ドメインの取得
Personiumでは、自らのデータを管理する「データ主体」をそれぞれに割り振られたURLで識別する方式を取っています。なので、PersoniumにとってURLとはユーザー名に相当するものになります。
今回は MyDNS というDDNSサービスを利用して、ドメインを取得しました(〇〇○○.mydns.jp というようなドメインになります)。Personiumでは有効なSSL証明書が必要なんですが、MyDNSでは Let's Encrypt を使用した証明書発行に対応しており、とても便利です。
手順2:固定IPの取得
サーバーの公開にあたり、ドメインに紐づくグローバルIPを取得する必要があります。簡単にグローバルIPが手に入る状況ならよいですが、手元にプライベートIPしか降ってこない環境だとそれが難しく、また自宅のIPを直接公開などしたくない人も多いかと思います。
手に入らない場合の抜け道として、VPS+VPNで自宅サーバーを公開するという手があります。今回は ConoHa のVPSで借りたUbuntuサーバーとのVPN接続で、VPSのグローバルIPに向けられた通信を自宅に引き込む、ということをやっています。
1. DDNSのAレコードをVPSのグローバルIPに設定する
2. VPS上に立てたnginxで自宅内のサーバーにリバースプロキシする
という感じです。これを実現した結果↓のような構成になりました。
手順3:Personiumを起動する
Personiumコミュニティでは即座にdockerコンテナ群としてPersoniumを立ち上げられる、docker-compose.ymlを提供しています。
ただし、上記ファイルを元に外部から連携可能なPersoniumを立ち上げるにはちょっとひと手間かかります。手順については下記のWikiに書いたので参照ください。
(VPSでnginxを動かす場合は、上記手順で構築するnginxをVPS上で動かすようにしてください。)
手順4:ARMで動かす場合に必要な手順
PersoniumではDBサーバーとしてElasticSearchと、メッセージキューとしてActiveMQを使用しています。それぞれDocker Hubからコンテナイメージを取得するようにdocker-compose.ymlが書かれていますが、それぞれarmhf用のものは提供されていないので実行することはできません。
つまり、armhf用のイメージをそれぞれビルドする必要があります。
上記のような手順も試してみましたが、@kikuzokikuzoさんも述べている通り、あまりパフォーマンス的な優位性は見いだせなかったので実機でビルドしました。そもそもElasticSearchもActiveMQも再ビルドを伴わないのでそこまでスペックは必要ありませんでした。ただ、ビルド中はアチアチになるのでコインで冷やしました笑
実行:UnitManagerを動かしてみる
PersoniumのUnit(サーバー)を管理するためのアプリが公式から提供されています。それを使って自分のPersoniumにログインしてみましょう。
・LoginURL: https://unitadmin.<自分のPersoniumFQDN>/
・Username: unitadmin
・Password: unitadminのパスワード(init.shを実行後に出力される)
ログインが完了すると下記のようにUnit管理画面が表示されます。
が、、、動きがだいぶ緩慢。実際にcurlコマンドでのログインAPIにかかった時間を計測してみると下記の結果が。
ただのログインに 45秒、だと・・・?!
終わりに:PDS を ARMボード上で使ってみた感想
2GBというメモリ容量の制約、ARMv7というCPUアーキテクチャという特殊なケースでも難なく動かせてびっくりしました。特にarmhfなCPUでも再ビルドなしに動かせるJavaはやはりクロスプラットフォームとして良く出来てるなと思いました。迅速に必要な環境を揃えられるdockerも便利ですね。
しかし、armhf用のJREの出来がよくないのか、ストレージが遅いのが問題なのか、通常使用には問題が発生するほど遅い印象を受けました(ログインのAPIを1回叩くのに45秒かかった件)。もしかしたら外付けドライブで実行するだとか、チューニングすることで性能改善はするのかもしれませんが、労力に見合わなそうなので二の足を踏んでいます。
むしろ、Raspberry PiやTinkerBoardであれば、GPIOなどを活用して、PDSに日々の生活を記録するデバイスとして利用するほうが向いていると思います。Home PDS は別の x86 マシンに譲るとして(もう買ってしまった↓)、そういった方向でTinkerBoardを活用していこうかなと思います。
Personiumはコミュニティメンバを募集しています
今回紹介したPDS「Personium」ですが、オープンソース開発を行うコミュニティを運営しています。もしPDSに興味を持ったり、コミュニティ運営をしてみたいという方がいらっしゃったらお声がけください。PDSを使ってみたい、というのでも結構です。
この記事が気に入ったらサポートをしてみませんか?