Amazon EC2にPleromaの自分用インスタンスを建てたので簡単に手順をメモしておく
そもそもPleromaとは?
PleromaはFediverse / ActivityPubをサポートするElixir製のソフトウェアで、シンプルかつ軽量である点が特徴だ。
FAQによれば、50ユーザ未満程度の規模感であれば2GB RAM, 1コアで動くらしい。これなら自分一人が使う分にはt2.microで十分ホストできそうだ。
If I want to run my own server, how expensive is that? This varies depending on how many users you want to support, but as a point of reference, a Pleroma server for a small group (under 50 people) runs fine on a system with 2 gigabytes of RAM and one CPU core. A server like this can be rented for €3/$4 a month. You could also run a server on Raspberry Pi 4, which costs around €50/$55 (model with 4 gigabytes of RAM).
シンプルさについてはこちらのページでMastdonとの対比で語られている。
Pleroma is built on a lot less technology than Mastodon. To run a Mastodon instance, you need Rails, PostgreSQL, Redis, Sidekiq, NodeJS and - if you want search - ElasticSearch. For Pleroma, you only need Elixir and PostgreSQL, while still getting all the features. This simplifies installation and makes maintenance somewhat easier.
そもそもFediverseとは?
Fediverseが初耳であれば是非リンクを参照してほしいが、簡単に言えば異なるSNS等のサービス間で共通の通信プロトコルをサポートすることで、プラットフォームを超えて互いのユーザ情報や投稿を融通できるようにする世界観だ。Fediverseをサポートする多くのソフトウェア、プラットフォームはOSSであり、同一ソフトウェアの別インスタンス間でも当然共通の通信プロトコルでやりとりが可能である。従ってFediverseを始めたければ、それをサポートするプラットフォームの誰かが運営するインスタンス(例えばmstdn.jpやmisskey.io)にユーザ登録してもいいし、自前で任意のプラットフォームでインスタンスを作ってもいい。共通のプロトコルで繋がりながらも分権的、分散的な世界を実現する構想なのだ。
なぜ自分用インスタンスを建てようと思ったの?
元々mstdn.jpにアカウントを持っている。しかし、先日Twitterで一時的な大規模APIスロットリングが実施されたのを機に今こそMastdonを使うぞと思ったら、同じことを考えたであろうユーザが殺到したためmstdn.jpが非常に重くなり利用が難しい状況に直面した。
www.itmedia.co.jp
mstdn.jpに限らず、Misskey.ioなど有名どころのFediverse系インスタンスが軒並み爆増するトラフィックに難儀していたと思う。そこでどうすれば快適にFediverse世界を生きていけるかを考えた結果、自分用のインスタンスを建ててしまうのが手っ取り早かろうという結論に至ったわけだ。ユーザを自分だけに限定して、ActivityPubを介して外界と繋がるようにすればマシンパワーもあまり要求されない。元々Pleromaのお一人様インスタンスを建てた方の記事を読んでいたこともあって、Pleromaで作ることにした。
構築メモ
公式サイトが丁寧に手順を書いてくれているので、基本的には以下に従えばよい。 https://docs-develop.pleroma.social/backend/installation/debian_based_en/
構成
- マシン: EC2 t2.micro + EBS 100GB + Elastic IPを紐づけ
- OS: Ubuntu 22.04.2 LTS
- PostgreSQL: 14.8
- リバースプロキシ: nginx
- ドメイン: plrm.kagurazaka.dev(Route53で管理)
今回は手っ取り早く動かしたかったので全ての構成要素を生のEC2に押し込む構成にした。そのうち手前にCloudFrontを置いてコンテナなりRDSなりに切り出しつつ、サーバレスに寄せたい。
EBSは深く考えず100GB用意してみたものの、一通りインストールして動かすだけなら10GBも必要なかった。今回はやってないが、メディア類をS3へ逃がすことも出来るようだ。手順
依存関係の準備
Pleromaを動かすのに必要な依存に加えて、リバースプロキシと証明書用にnginxとcertbotをインストールする。
sudo apt update sudo apt full-upgrade sudo apt install git build-essential postgresql postgresql-contrib cmake libmagic-dev nginx certbot
ElixirとErlangをインストール
sudo apt install elixir erlang-dev erlang-nox
Pleroma用ユーザ、ディレクトリを作成
sudo useradd -r -s /bin/false -m -d /var/lib/pleroma -U pleroma sudo mkdir -p /opt/pleroma sudo chown -R pleroma:pleroma /opt/pleroma
以降の操作では、以下方式でpleromaユーザとしてコマンドを実行している。
sudo -Hu pleroma [command]
PleromaBE(バックエンド)をclone
リポジトリからクローンしてくるのはバックエンドのみだが、特に意識しなくてもデフォルトのフロントエンドがインストールされるので安心してよい。
sudo -Hu pleroma git clone -b stable https://git.pleroma.social/pleroma/pleroma/opt/pleroma cd /opt/pleroma
Elixirの依存を解決する
sudo -Hu pleroma mix deps.get
configを生成して設定する
以下を実行すると、インスタンスの基本的な設定を対話的に問われる。
sudo -Hu pleroma MIX_ENV=prod mix pleroma.instance gen
答えていくとインスタンスの設定ファイルconfig/generated_config.exsと、Postgreの初期化用スクリプトconfig/setup_db.psqlが生成される。generated_config.exsを確認して問題なさそうなら実際にロードされるファイル名にmvする。(本番用はprod.secret.exs、開発用はdev.secret.exsを設定する想定らしい)
sudo -Hu pleroma mv config/{generated_config.exs,prod.secret.exs}
DBの初期化と移行
sudo -Hu pleroma MIX_ENV=prod mix ecto.migrate
Pleromaをサービス化する
SystemdでPleromaをサービス化する。サービス定義のサンプルが用意されているので、取り敢えず動かすだけならこれをコピーするだけでよい。
sudo cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service sudo systemctl enable pleroma.service
証明書を準備
Let's Encryptで証明書を発行する。スタンドアローンモードのCertbotはポート80で一時的にwebサーバを起動して認証するが、自分の環境ではnginxをインストールしたタイミングでサービスが立ち上がり80番をリッスンしていたので落としておく。
sudo systemctl stop nginx
用意したドメインのAレコードにEC2インスタンスのパブリックIPアドレスを設定しておく。今回はドメインもRoute53で管理しているのでコンソールから設定した。 certbotで証明書を作成する。
sudo certbot certonly --standalone -d example.com
上手く行けば/etc/letsencrypt/live/配下に一連のファイルが作成される。
nginxを設定する
nginxについてもサンプル設定ファイルが用意されているので、これをベースにする。
sudo cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.nginx
ただし最低限変更すべき点として、
- server_nameを利用するドメインに変更する
- ssl_trusted_certificate, ssl_certificate, ssl_certificate_key各ファイルのパスを先程certbotで作成したファイル群のパスに置き換える
nginx,pleromaを起動する
sudo systemctl start nginx sudo systemctl start pleroma
ここまで来たら自分のドメインに443でアクセスしてみよう。全てが上手く行っていれば、Pleromaの画面が表示されるはずだ。
初期ユーザ兼管理者ユーザを作成する
sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new <username> <your@emailaddress> --admin
上記ユーザでログインすれば、Pleroma / Fediverseライフを始めることが出来る。
注意すべき点
自分専用のインスタンスとして運用したい場合は、管理コンソール(Adminユーザでログインしている状態で/pleroma/adminにアクセスすると見れる)から新規ユーザ登録(Registrations open)をオフにしておく必要がある。
感想
公式ページの手順書やPleroma, nginxのsystemd設定サンプルが丁寧に用意されているのでスムーズにインスタンスを建てることが出来た。ある程度Unix系OSの操作に慣れている人なら誰でも簡単に構築できるんじゃないかと思う。未開拓の細かい設定が沢山ありそうなので色々といじりつつ、アーキテクチャの最適化を図っていきたい。ある程度いい感じになったらCDKにして配っても面白いかも知れない。