軽量な分散SNS実装として知られるPleromaをセットアップしたので、その際のメモ。

インストールしたPleromaのバージョンは以下の通り。

バックエンドのバージョン 1.1.8
フロントエンドのバージョン 36910935

参考にした手順は以下のページだが、どの手順を見てもスッと入るようになってない。なので忘れないようにこのメモを書き残しておく次第。
Pleromaインストールバトル ~GCP無料枠編~
Pleromaの入れ方(md)
Pleromaの入れ方(html)

こちらのページはそんなトラブルシューティングのさなかに参考として読んだ。気づきが多くあった。
ubuntuにpleromaを入れてなんとなく動かす

最初は概ねPleromaの入れ方(md)の通りにやっていけばいい。「コンフィギュレーションを生成します。」のところまではこれの記載の通りで大丈夫。

sudo vi /opt/pleroma/config/generated_config.exs

して、コンフィグを編集する。編集箇所は

registrations_open: true

registrations_open: false

とする。こうすることでWebからの新規登録ができなくなる。これはPleromaインストールバトル ~GCP無料枠編~に記載がある。ちなみにGCP無料枠でたてられるf1-microというインスタンスではメモリ不足でPleromaのコンパイルができないそうだが、今回使ったさくらのVPS(512MB/石狩)ではコンパイルも普通にできた。

次にコンフィグファイルをリネームする。相対パスなのでカレントディレクトリに注意。(/opt/pleromaにいること)

sudo mv config/{generated_config.exs,prod.secret.exs}

setup_db.psqlというファイルが作成されているので、これを使ってDBをセットアップする。

sudo su postgres -c 'psql -f config/setup_db.psql'

セットアップしたら、DBのマイグレーションをする。

sudo -Hu pleroma MIX_ENV=prod mix ecto.migrate

このコマンドは実行する必要がない。

sudo -Hu pleroma MIX_ENV=prod mix phx.server

フォアグラウンドでPleromaを実行しているだけなので、動作確認用。このコマンドを実行して、telnet localhost 4000と叩いて反応が返ってくればOK。Ctrl+cでAbortを選択して止める。

昔のPleromaはリバースプロキシをかまさなくてもブラウザからでも4000を指定すれば見れたんだが、このとき入れたバージョンだと、リモートからだとtelnetにも反応しない。パケットフィルタを無効にしたり、ufwも落としてみたりしたが、それでもダメなので、リモートから直接4000を叩けないよう仕様になっているのではなかろうか。

sudo apt install certbot
sudo mkdir -p /var/lib/letsencrypt/ # このディレクトリはあとでwebrootメソッド使用時にに使う
sudo certbot certonly --email [mailaddress] -d [FQDN] --standalone
sudo apt install nginx
sudo cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.nginx
sudo vi /etc/nginx/sites-available/pleroma.nginx

certbotがHTTP-01メソッドで認証を受けられるように /etc/nginx/sites-available/pleroma.nginx の location ~ /\.well-known/acme-challenge 以下をアンコメントするとともに、SSL証明書のパスを書いた行をコメントにする。証明書ファイルがないのでnginxのリスタートに失敗してしまい、certbotのHTTP-01認証でこけてた。このことがどこにも書かれていないので一番詰まった点。理屈がわかってしまえばどうということはないが、わからないでやっているとドツボにはまる。

server {
    server_name    pleroma.ryusei.dev;

    listen         80;
    listen         [::]:80;

    # Uncomment this if you need to use the 'webroot' method with certbot. Make sure
    # that the directory exists and that it is accessible by the webserver. If you followed
    # the guide, you already ran 'mkdir -p /var/lib/letsencrypt' to create the folder.
    # You may need to load this file with the ssl server block commented out, run certbot
    # to get the certificate, and then uncomment it.
    #
    location ~ /\.well-known/acme-challenge {
        root /var/lib/letsencrypt/;
    }
    location / {
      return         301 https://$server_name$request_uri;
    }
}

#    ssl_trusted_certificate   /etc/letsencrypt/live/[FQDN]/chain.pem;
#    ssl_certificate           /etc/letsencrypt/live/[FQDN]/fullchain.pem;
#    ssl_certificate_key       /etc/letsencrypt/live/[FQDN]/privkey.pem;

これでnginxをリスタートして設定が反映されることで、certbotで証明書の取得ができる。

sudo ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/pleroma.nginx
sudo systemctl reload nginx
sudo certbot certonly --email [mailaddress] -d [FQDN] --webroot -w /var/lib/letsencrypt/

証明書が取得できたらnginxのコンフィグを開いて、コメントにしていた証明書の3行をアンコメントする。

sudo vi /etc/nginx/sites-available/pleroma.nginx
    ssl_trusted_certificate   /etc/letsencrypt/live/[FQDN]/chain.pem;
    ssl_certificate           /etc/letsencrypt/live/[FQDN]/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/[FQDN]/privkey.pem;

nginxをリスタートさせて設定を反映させる。

sudo systemctl reload nginx

サービスファイルのサンプルをコピーして、Pleromaをサービスとして起動します。

sudo cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service
sudo systemctl enable --now pleroma.service

Pleromaのユーザーを作成します。作成するとURLが表示されるので、そこでパスワードを設定します。

sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new [username] [mailaddress] --admin

enjoy.