流沙河鎮

情報技術系のこと書きます。

EC2にPleromaの自分用インスタンス(Fediverseへのシーカーキャンプ)を建てた

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.jpmisskey.io)にユーザ登録してもいいし、自前で任意のプラットフォームでインスタンスを作ってもいい。共通のプロトコルで繋がりながらも分権的、分散的な世界を実現する構想なのだ。

なぜ自分用インスタンスを建てようと思ったの?

元々mstdn.jpにアカウントを持っている。しかし、先日Twitterで一時的な大規模APIロットリングが実施されたのを機に今こそMastdonを使うぞと思ったら、同じことを考えたであろうユーザが殺到したためmstdn.jpが非常に重くなり利用が難しい状況に直面した。
www.itmedia.co.jp

mstdn.jpに限らず、Misskey.ioなど有名どころのFediverse系インスタンスが軒並み爆増するトラフィックに難儀していたと思う。そこでどうすれば快適にFediverse世界を生きていけるかを考えた結果、自分用のインスタンスを建ててしまうのが手っ取り早かろうという結論に至ったわけだ。ユーザを自分だけに限定して、ActivityPubを介して外界と繋がるようにすればマシンパワーもあまり要求されない。元々Pleromaのお一人様インスタンスを建てた方の記事を読んでいたこともあって、Pleromaで作ることにした。

blog.3qe.us

構築メモ

公式サイトが丁寧に手順を書いてくれているので、基本的には以下に従えばよい。 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で管理しているのでコンソールから設定した。

Aレコードを追加した図
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にして配っても面白いかも知れない。