mastodonの鯖を建てたので、その覚書(主に公式ドキュメントに対する)

作成日：2022年6月15日
更新：2022年7月3日

いくつかハマる所があったので、Mastodonのサーバーを建てた時の備忘録です。

## 環境
- 自宅のproxmox内のUbuntu 21.04のLXC内に立てました。
- 諸々のソフトウェアのバージョンは以下です
    - Mastodon 3.5.3
    - Ruby 3.0.3
    - PostgresSQL 13.5
    - Redis 6.0.11
    - node v16.15.1
    - nginx 1.18.0(Ubuntu)

## 手順
基本的には公式のドキュメントに従いますが、一部ハマる場所があります(Let's encryptでの認証周りとか)。

### step1. Preparing your machine
[Preparing your machine](https://docs.joinmastodon.org/admin/prerequisites/)に従って設定をしていきます。
fail2banの設定はドキュメント通りで問題ありませんでした(SSHポートを変更している場合は変更が必要です)。

続くiptabelsはnftablesへの移行が進んでおり、Ubuntu21.04でもiptableは内部的にはnftablesを使用しています。このページ最後の`iptables-restore`もそのままでは動きませんでした。
iptablesをnstablesに変換するツールもあるようですが、今回はufwでsshとhttpのみが通るようにして一旦回避しました。

追記：
ufwでやってたのですが、WANからアクセスすると正常に動くのにLANからアクセスすると画像が表示されなかったり読み込めなかったりするという事象が起きています。
ひとまずの動作確認にはufwで十分ですが、ちゃんと運用するにはnftablesでやるのが良い気がします(ちゃんとできたらまた記事にでもします)。
追記終わり

:::note warn
また、後ほどpostgresSQLをインストールしますが、この時にencodingがUTF-8になっていないと、デフォルトのデータベースの文字エンコードがSQL_ASCIIになってしまい後々二度手間になるので、
```bash
locale-gen "en_US.UTF-8"
dpkg-reconfigure locales
```
でUTF-8に変えておいた方が良いです。

:::

### step2. Installing from source
ここではドキュメントの各章ごとに覚書を書いていこうと思います。

#### Pre-requisites
- Ubuntu20.04かDebian11のマシンを用意と書いてありますが、Ubuntu21.04でも動いてます。
- SMTP serverはgmailも使えるようですが、いまいち認証がうまくいってない気がします。でもサーバーは立ちました。

#### System repositories
書かれている通りのものをインストールします。

#### Node.js
nodeは[この記事](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)の手順で入れました。なお、この記事の後ろの方に書きましたがnodeのpathが想定されているものから変わるとうまく行かない時があります。その時はシンボリックリンクを張ると動きます(詳細は後述)。

追記(2022-11-07)
現在Nodeの最新は18系ですが、後述のwebpackのビルドで、これに対応していないものがあるらしく、16系にダウングレードする必要がありました。
追記終わり

#### PostgresSQL
postgreSQLはaptでインストールしても特に問題ありませんでした。
インストール後はpostgresSQLをactivateさせておきます。
```bash
systemctl start postgresql.service
```

#### System packages
コピペでOKでした。

#### Yarn
ここもコピペでOKでした。恐らく(あまり覚えてない)。

#### Installing Ruby
ドキュメントではmastodonというアカウントを--disabled-loginオプションを付けて作成していますが、自分はわかりにくいのでパスワード付きで作成しました。特に問題はなかったです。
他はコピペでOKでした。

### step3.  Setup
#### Setting up PostgreSQL
Performance configurationはoptionalなのでやってません。

postgresqlはインストール時にubuntu内にpostgresというユーザを自動で作成するので、そのアカウントでログインし、mastodonというユーザを作るということのようです。
ただし、この時mastodonというデータベースも一緒に作成されていないと、後からcreate database出来ないので、`\l`でデータベース一覧を表示し、作成されてなければ以下で作成しておくと良いと思います。
```
create database mastodon;
```

#### Setting up Mastodon ～ Installing the last dependancies
ここもコピペで行けます。

#### Generating a configuration
ここが個人的に曲者な気がします。
ここでは
- postgresSQL
- redis
- smtp

の設定をします。
どのような質問が出てくるのかの全文は[こちらの記事](https://qiita.com/taro-hida/items/07bd0368ca72db40492f)に載っています。予習しておくと良いです。

ドキュメントのコマンドを打つ前に以下の準備をします。

##### 1. postgresSQLのデータベースの作成
先に作成しておかないとデータベースがないぞと言われます。
Ubuntuのmastodonユーザで`psql`と打ってsqlの対話型インターフェースを開き、`create database mastodon_production;`と打ってデータベースを作ります。mastodon_productionはmastodonのデフォルトのデータベース名です。

##### 2. redisをインストールする
そもそも入ってるのかもしれませんが、自分はインストールしました。
```
apt install redis-server
```
また、インストール後は`/etc/redis/redis.conf`内の`supervised no`を`supervised systemd` に変更し、こちらも起動させておきます。
```
systemctl restart redis.service
```
##### 3. gmail側の設定


ただ、メールに関しては認証がうまくいかなくても`Send a test e-mail with this configuration right now?`でnoを選べばそれで終わりました。まだ自分はうまくいってない気がします。

これが終われば`su`でrootに戻ります。

#### Setting up nginx
ここはコピペで大丈夫ですが、次の項目(Acquiring a SSL certificate)に気を付けなればいけません。`/etc/nginx/sites-available/mastodon`内の`example.com`を自分のドメインに変更するのを忘れずに。


#### Acquiring a SSL certificate
ここはドキュメントに誤りがあり、2021年1月にはissueが立てられおり解決策も示されていますが今現在反映されていません。

https://github.com/mastodon/documentation/issues/857

よってドキュメントのコマンドではなく、以下のように一度Nginxを止め、`--standalone`を付けて認証する必要があります。

```
sudo service nginx stop
certbot certonly --standalone -d your_domain_name
```
その後、`/etc/nginx/sites-available/mastodon`の次の2行をアンコメントします。鍵が正しい位置に入っているかはcertbotの出力結果を見ればわかるかと思います。
```
 # Uncomment these lines once you acquire a certificate:
 # ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
 # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
```

#### Setting up systemd services
ここはコピペでOKでした(自分の場合は特に何も変更するものはなかった)
ドキュメントではここで終わっていますが、自分の環境ではこの段階ではまだブラウザからアクセスできませんでした。

#### 自分の場合さらに追加でしなければいけなかったこと
##### 1. webpackのビルド
この状態でブラウザを開いても何も表示されなかったので `/var/log/syslog`を見ていると、
```
ActionView::Template::Error (Webpacker can't find media ～
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
```
というエラーが出ていました。
(自分の場合は一度webpackを消して入れなおしてコンパイルしたのですが多分そんな必要はなく)、mastodonユーザでliveディレクトリに移動し、
```
RAILS_ENV=production bundle exec rake webpacker:compile
```
とすればコンパイル出来ると思います。

##### 2. nginxを実行しているユーザをmastodonのユーザグループに追加する。
mastodonのドキュメントではmastodon本体は'/home/mastodon/live/public'の中に置かれますが、UbuntuでデフォルトのNginxのユーザはwww-dataなのでこのディレクトリにアクセスすることができません。
なので、以下でwww-dataをmastodonのグループに追加します。
```
gpasswd -a www-data mastodon
```

##### 3. アクセスするホスト名を追加する
**:warning:ここは間違えている可能性が高いです。そのまま真似しないでください:warning:**
 
アクセスするホスト名を設定していないと、ActionDispatch::HostAuthorization middlewarによってアクセスがブロックされます。
`/home/mastodon/live/config/environments/production.rb`に以下のように追記しました。
```
config.hosts << "追加したいホスト名 or ブロックされてるホスト名"
```
ブロックされてるホスト名は起動後に`/var/log/syslog`か`/var/log/nginx/error_log`で見れます。

##### 4. nodeが無いというエラーが出る
nodeをインストールしpathは通っているにも関わらずmastodon側が`/usr/bin/node`を見ているためにエラーが出ていました。
なので`sudo ln -s "$(which node)" /usr/bin/node`としてシンボリックリンクを貼りました。

### 終わり
多分これでmastodonの自鯖にアクセスできるようになったと思います。


### お世話になった記事
https://qiita.com/taro-hida/items/07bd0368ca72db40492f

この記事にかなり助けられました。`RAILS_ENV=production bundle exec rake mastodon:setup`の対話型インターフェース時の入力内容や、詰まった時に何を見るべきかが書かれており、初学者には非常にありがたい記事でした。詰まった時にこそ、じっくり読むべき記事です。

[なんかよくわからんことになった！](https://qiita.com/taro-hida/items/07bd0368ca72db40492f#%E3%81%AA%E3%82%93%E3%81%8B%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%89%E3%82%93%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)の節には非常に良いことが書いてあります。