Pleroma Install Battle (Oracle Cloud)



# Pleromaとは

Mustdonとかと連合を形成できる分散型のSNSの一つらしい。個人的にはClosedなTwitterという感じがある。
私に勧めてきた魚類は自分で立てたサーバーに何人か住まわせることでコミュニティを作っている。

# Oracle Cloudとは

その名の通りOracleがやっているクラウドコンピューティングのサービス名。Always Freeとして、1/8OCPU、メモリ1GBのインスタンスが２つまでつかえるので、この記事ではそいつにインストールするための手順を簡単に書いておく。GCPのf1-microに最初は入れてたのだが、どうもメモリが少なすぎるのかCPUに負荷がかかりまくって死んだので移行した。

# 手順

## 登録する

ここでいい感じに登録してコンソールにはいる
https://www.oracle.com/jp/cloud/
インスタンスは適当にポチポチしたら作れるはず。わからなかったらググってね......
ここではUbuntu 20.04を想定しているのでそこだけ注意。

## DNSにIPを登録する

IPはデフォルトでエフェメラルになってるっぽいのでインスタンスを消し飛ばさないかぎり変わらない。逆に言うと消し飛ばすとIPも一緒に消える。
ドメインを持っていない人は契約しよう。ドメインは汎用性が高いし一つぐらい持っていたって困らないはず。固定費はこれだけだし。私はせっかくなのでGoogle Domainsでdevドメインを登録した。
Google Domainsの場合はカスタムリソースレコードというところでタイプAとしてインスタンスのアドレスを登録すればいい。

## ログインして諸々インストールする

インスタンス作った時の鍵とか使って適当にSSHでログインしよう。
ここに書いてあるとおりに操作すればいい。なんかバージョン違いとか、OTPリリースがなかった頃とかで全然違うことを書いてある記事とかあるので気をつけよう。
https://docs-develop.pleroma.social/backend/installation/otp_en/

一応執筆時点の情報に基づいてコメントともにUbuntu用の操作を列挙しよう。公式に書いてあるコマンドはsudo suしてからじゃないといちいちsudoをつける必要がある。ここではせっかくなのでsudoをつけて書いておく。

まずは依存するパッケージを入れる。OTPなのでElixir系のものは要らない。Optionalになっているが、RUMインデックスのほうがパフォーマンスが良いらしいのでここで入れている。Ubuntu 20.04ではPostgreSQLのバージョンは12なのでそこを修正している。RUMのオンオフはわざわざコンフィグで書かなくてもインストールするときに有効にするか聞かれるのでそこでYと答えればいい
```sudo apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot　postgresql-12-rum```

オプションではあるが、PostageSQLのチューニング設定もしておくことをおすすめする。デフォルトだとCPUの負荷が50%、つまり２コアある内の片方をフルで使い続ける感じになってしまう。公式にも書いてある
https://docs-develop.pleroma.social/backend/configuration/postgresql/
が、PGTuneというサイト
https://pgtune.leopard.in.ua/#/
を使えば良い。
Connectionを20(実際には10しか使わないらしいが20にしないと変な設定が出るらしい)、RMAを1GB、コアを２にして出てきた設定を/etc/postgresql/12/main/postgresql.confに反映すれば良い。
反映したら
```sudo systemctl restart postgresql```
で再起動して反映する。

pleromaという名前のユーザーが種々の処理の権限を持つようになっているらしい。たぶんOTPリリースをするための事情なのだろう。なんか諸々のフォルダもpleromaの権限で作成する。
```adduser --system --shell  /bin/false --home /opt/pleroma pleroma
export FLAVOUR="amd64
sudo su pleroma -s $SHELL -lc "
curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip
unzip /tmp/pleroma.zip -d /tmp/
"
sudo su pleroma -s $SHELL -lc "
mv /tmp/release/* /opt/pleroma
rmdir /tmp/release
rm /tmp/pleroma.zip
"
sudo mkdir -p /var/lib/pleroma/uploads
sudo chown -R pleroma /var/lib/pleroma
sudo mkdir -p /var/lib/pleroma/static
sudo chown -R pleroma /var/lib/pleroma
sudo mkdir -p /etc/pleroma
sudo chown -R pleroma /etc/pleroma```
次のコマンドで設定をいろいろする。RUMインデックスをオンにするかもここで聞かれる。メールアドレスとかドメインとかも聞かれる。
```sudo su pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql"```
設定を反映して、動作確認をする。
```
sudo su postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql"
sudo su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate"
su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/"
sudo su pleroma -s $SHELL -lc "./bin/pleroma daemon"
sleep 20 && curl http://localhost:4000/api/v1/instance
```
ちゃんと返事が来ていれば、サービスを止める。nginxもとめないと、次のLet's Encryptで証明書を作るところでポートが専有されててエラーが出る。
```
sudo su pleroma -s $SHELL -lc "./bin/pleroma stop"
sudo systemctl stop nginx
```

## ファイアウォールの設定
これはOracle Cloud特有の事情だが、ファイアウォールの設定がデフォルトではHTTP(80番ポート)もHTTPS(443番ポート)も通さないようになっているので両方開けないといけない。
インスタンスに割りあたっているサブネットのセキュリティリストに追加だけすれば良いのかと思うかもしれないが、実はインスタンスの中でもファイアウォールがiptablesで動いているので両方設定しなきゃいけない。GCPはチェックボックス入れるだけなのにどうして......
/etc/iptables/rules.v4をエディタで開いてSSH用の22番ポートを開けてる行をコピーして80と443に変えたものを増やせばいい。確か
```sudo systemctl restart iptables```
で適用されるはず。

## Let's Encryptでの証明書作成
Let's EncryptはSSL証明書を無償で作成してくれる非営利のサービス。偉すぎる......
yourinstance.tldを自分が使うドメインに書き換えて下のコマンドを実行する。なんか聞かれるので適切に答えよう。
```certbot certonly --standalone --preferred-challenges http -d yourinstance.tld```
エラーが出たらだいたいファイアウォールがうまく設定できてないか、nginxが動いたままか、DNSがまだちゃんと登録されてないかだと思われる。

## Nginxの設定
以下のコマンドでpleroma用の設定をNginxの設定のところにコピーする
```sudo cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.conf
sudo ln -s /etc/nginx/sites-available/pleroma.conf /etc/nginx/sites-enabled/pleroma.conf```
この時点だとテンプレートをコピーしただけなので修正を入れなきゃいけない。/etc/nginx/sites-available/pleroma.confをエディタで開いて、example.tldとなっているのを自分のドメインに書き換える。一箇所じゃないので置換を使うことをおすすめする。Let's Encryptの証明書を自動更新したいならwebrootって書いてあるところのコメントアウトをする。
自動更新するならwebrootのフォルダも作っておく。
```sudo mkdir -p /var/lib/letsencrypt```
書き換えたら、設定がちゃんとできているか以下のコマンドで確認する。
```nginx -t```
大丈夫だったらNginxを起動する。
```sudo systemctl start nginx```

## サービスの登録
自動起動するようにしておく
```sudo cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service
sudo systemctl start pleroma
sudo systemctl enable pleroma```

## 証明書自動更新の設定

自動更新をしない場合は飛ばしていい。まず自動更新の動作ができるかどうかテストする。yourinstance.tldは置き換えるのを忘れずに。
```certbot renew --cert-name yourinstance.tld --webroot -w /var/lib/letsencrypt/ --dry-run --post-hook 'systemctl reload nginx'```
問題なかったら、/etc/cron.daily/renew-pleroma-certという名前で以下のコマンドを書いておく。こっちも置き換え忘れずに。
```#!/bin/sh
certbot renew --cert-name yourinstance.tld --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"```
実行可能にして、ちゃんとcronに登録されたか確認する。
```sudo chmod +x /etc/cron.daily/renew-pleroma-cert
sudo run-parts --test /etc/cron.daily```

## ユーザーの登録
username とuser@emailは使いたいユーザー名と連絡先にしたいメールアドレスに置きかえること。Oracleの無償枠でやるような人は自分用のサーバーだろうしadminと自分のユーザーが一致しててもそんな問題ないはず。
```cd /opt/pleroma/bin
sudo su pleroma -s $SHELL -lc "./bin/pleroma_ctl user new username user@email --admin"```
これをやると最後にパスワード設定をするためのアドレスが出てくるので、それをブラウザで開いて設定したらインストールバトル終了。