細かすぎて伝わらないMastodonセットアップ時のエラー

# 概要

本記事では、通常の環境なら出遭わない<sub>かもしれない</sub>Mastodonセットアップ(インスタンスを自分のサーバーで立ち上げる)時のエラーを紹介しよう。

ちなみに、いずれも<ruby>私<rp>(</rp><rt>わたくし</rt><rp>)</rp></ruby>の個人的Mastodonインスタンス([Mastodon.YOCKOW.jp](https://Mastodon.YOCKOW.jp/))をセットアップしている時に出遭ったエラーである。同じようなエラーに遭遇した方の一助となれば幸いなのだ(語尾が安定しない)。

※OSはUbuntu 22.04。セットアップ方法は`Ubuntu 22.04, Mastodon`で検索して出てくるページ[^how-to-install]とかを参照にしたりしなかったり。

[^how-to-install]: たとえば、https://www.howtoforge.com/how-to-install-mastodon-social-network-on-ubuntu-22-04/


# ⛔️ エラー1: charlock_holmes.soの動的リンクに失敗する

## ▶︎ 原因: Swiftコンパイラがインストールされていたから

先に原因を言われても意味が分からないかもしれない。まぁ、最後まで聞いてくれたまえ。

ひとまず、rbenvだの何だのをインストールして最後に唱える呪文は

```console
RAILS_ENV=production bundle exec rake mastodon:setup
```

である。こうすることで、[bundler](https://bundler.io/)が良きにはからってセットアップしてくれるはずなのである。

しかし、Mastodonが依存するライブラリの一つである[charlock_holmes](https://github.com/brianmario/charlock_holmes)の動的ライブラリのリンクに失敗。

なぜ？

それは`/usr/local`下に[Swift](https://Swift.org/)のコンパイラ(ツールチェーン)がインストールされていたからなのである。現在のLinux版SwiftはSwift用にコンパイルされた[ICU](https://icu.unicode.org/)が同梱されている。そしてcharlock_holmesはICUを利用している。

なぜか、charlock_holmes.soはMastodonセットアップ時にSwift用ICUを用いてコンパイルされてしまうのである。でも、動的ライブラリ検索時のディレクトリ(`ldconfig`で設定されたアレ)にSwift用ICUのディレクトリは含まれていない。結果的に、charlock_holmes.soが使えないとエラーが出るのである[^charlock_holmes-error]。

[^charlock_holmes-error]: 具体的には`icu_65_swift::ByteSink::GetAppendBuffer`というC++関数(をマングリングしたsymbol)が見つからないというエラーが出た。

## ✅ 解決策

Swiftを削除すれば解決するけど、我がサーバーでは[CGIにSwiftを使っている](https://qiita.com/YOCKOW/items/78e38d423bb4c8f044ca)のでそんなことはできない。というわけで、`/usr/local`下に最新のICUをインストールして解決したのでした。


# ⛔️ エラー2: Too Many Redirects

## ▶︎ 原因: ポートが被った。

そんなこんなで最新のICUをインストールして、立ち上げ。mastodon-web, mastodon-streaming, mastodon-sidekiqのステータスもオールグリーン。

これで自分のサーバのURLにアクセスすれば、あのゾウさんに出逢えるはず。
…と思ったら、`リダイレクトが多すぎます`というエラー。なんで？

まさかと思いつつ

```console
sudo ss -lntp
```

と打ってみると…[^what-is-ss]。

[^what-is-ss]: `ss`コマンドについて → https://atmarkit.itmedia.co.jp/ait/articles/1710/06/news014.html


```console
State          Recv-Q         Send-Q                 Local Address:Port                  Peer Address:Port         Process                                                                                                                                            
LISTEN         0              4096                       127.0.0.1:3000                       0.0.0.0:*             users:(("nghttpx",pid=927,fd=5),("nghttpx",pid=920,fd=5))  

※他省略
```

…`nghttpx`というHTTP/2リバースプロキシが`ポート3000`を先に使っていた。Mastodonのプログラムもデフォルトの設定だと`3000`を使うことになっている。でも、`nghttpx`に先に`3000`を取られているため、Mastodonはそのポートを使えない。結果として、https://Mastodon.YOCKOW.jp/ にアクセスすると https://Mastodon.YOCKOW.jp/ にリダイレクトされて…という無限リダイレクトに🥺

## ✅ 解決策

Mastodonが使うポートを別のポートにしたよ[^change-port]。

[^change-port]: /etc/systemd/system/mastodon-web.service の `Environment="PORT=3000"` を弄る。



# ⛔️ エラー3: 画像がアップロードできない

## ▶︎ 原因: ImageMagickがインストールされていなかった。

いや、まさかね。ImageMagickをインストールしていないとはね。
…setupの段階で警告してよ。

## ✅ 解決策

言わずもがな。



# ⛔️ エラー4: アニメーションGIFがアップロードできない

## ▶︎ 原因: ffmpegがインストールされていなかった。

前述のエラー3を解決して安心していたら…なぜかアニメーションGIFだけアップロードできない…。
何度確認してもImageMagickはインストールされているし、コマンドラインから`convert`を使えば問題なくローカルのアニメーションGIFを他の画像形式に変換することもできる。

一旦、手元のmacOSで立ち上げた開発環境のMastodonで試してみると…、問題なくアニメーションGIFがアップロードできるではないか。そこで、そのログを漁っていたら驚愕の事実が！(大袈裟)

MastodonはアニメーションGIFをMP4に変換して保存する仕様になっているのです。なぜ？
というわけで、ffmpegが無いとMP4への変換ができず、結果アニメーションGIFをアップロードできないという…。


## ✅ 解決策

ffmpegをインストール。