Mastodonインスタンスを立てたときの諸々メモ (original) (raw)

Mastodonインスタンスの立て方の記事は無数にあるはずだけれど、こういうののソースは多いにこしたことはない

目次

  1. 記事内容について
  2. サーバースペック
  3. サーバー構築
    1. あらかじめ決めておくこと
    2. 作業用ユーザー作成
    3. サーバー初期セットアップ
      1. fail2ban設定
      2. iptables設定
    4. Mastodonインストール
      1. node.jsインストール
      2. PostgreSQLインストール
      3. システムパッケージのインストール
      4. Rubyインストール
      5. Mastodonインストール
    5. S3セットアップ(必要なときのみ)
      1. S3バケットを作る
      2. CloudFrontでディストリビューションを作成する
      3. Certificate Managerでサブドメイン用の証明書を作る
      4. CloudFrontに証明書と代替ドメイン名を登録する
      5. DNSにCloudFrontディストリビューションドメイン名を設定
      6. IAM設定
    6. Mastodonセットアップ
    7. nginxの設定と証明書設定
    8. Mastodonをデーモンとして登録する
    9. おわり
  4. 一般的なバージョンアップ手順
  5. その他

記事内容について

自鯖Mastodon( Poketedon )の構築メモです。

今回の記事では最初のサーバーの立ち上げ部分を取り扱います。
移転も経験しましたが、それは別記事に(するはず)。

サーバースペック

VPSを借りる場合、以下の点に注目。

参考情報として。一番最初に選んだのは、KAGOYA CLOUD VPSの2コア/メモリ2GB/SSD25GBプランでした。
Misskeyと違い(別記事にするはず)、ストレージ容量は25GBでも足りました。
現在は色々あってXServer VPSのプラン4GBで動かしています。

サーバー構築

あらかじめ決めておくこと

以下の内容は決めておきましょう。

作業用ユーザー作成

VPSを借りるときは、SSH鍵を作るはず(任意の場合は作ったほうがいい)。

その接続情報をもってしてSSHログイン。

以下セットアップはVPSを借りたあと必ずやる儀式みたいなものなので、
Mastodon以外にも使えるはずです。

adduser {hogeUser}
# 例:adduser gorou12
# 以降 {hogeUser}はユーザー名。
# パスワードはいい感じのをつけておく
usermod -aG sudo {hogeUser}
# sudoグループに所属させる
# セキュリティ上難があるのであとでよしなに調整する
su - {hogeUser}
ssh-keygen
# パスフレーズは設定した上で、とりあえず次々OKしていく
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# ~{hogeUser}/.ssh/id_rsa をSSH SCPなどでダウンロードする
# ターミナルからログアウトして、以降、rootユーザーではなく
# {hogeUser}で作業(SSH鍵も落としてきたid_rsaにする)

サーバー初期セットアップ

公式でいうとこれの話

Preparing your machine - Mastodon documentation

# apt最新化
sudo apt update
sudo apt upgrade
# インストール中に Do you want to continue? [Y/n] と出てくるが、
# 大文字Yを入力してEnterで進める
# (この先も手順中に何度かあるが同じ)
# そのときに急にGUIが出てきて Pending Kernel Update とか
# Which services should be restarted? とか聞かれるが、
# 何も変えずOKでよい。
# (TABキーでOKボタンへジャンプする)

fail2ban設定

# fail2banインストール
sudo apt install fail2ban
sudo vi /etc/fail2ban/jail.local
# Mastodonドキュメントにあるやつを貼る
sudo systemctl restart fail2ban

iptables設定

Ubuntu22.04の場合、nftablesになってしまってる関係で
Mastodon公式にあるものがそのままは使えなくなってしまっています。

ここでは仕方ないので、nftablesではなくレガシーなiptablesを使うようにしてみました。

# iptables永続化
sudo apt install iptables-persistent
# 急にウィンドウが出てくるので、<いいえ>する
# <ここだけUbuntu 22.04の場合(20.04の場合はスキップ)>
sudo update-alternatives --config iptables
# legacyなiptablesを有効化する
# <ここから公式手順に合流>
sudo vi /etc/iptables/rules.v4
# Mastodonドキュメントにあるやつを貼る
sudo iptables-restore < /etc/iptables/rules.v4
# IPv6アドレスもあれば、そっちも作業する
sudo vi /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v6

ここで設定したFail2banの設定やiptablesの設定は後程見直していますが、環境依存があるため、そこは割愛します。
(この手順通りでMastodonはちゃんと動きます)

Mastodonインストール

公式でいうとこれの話

Installing from source - Mastodon documentationInstructional guide on creating your own Mastodon-powered website.

sudo su -
# ここからrootで作業
apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates

node.jsインストール

Mastodon公式にある手順は非推奨になっているので、node公式の手順にリライト。

mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
# ここまでnodeインストール準備
# (あとで一括でapt update, apt install nodejsする)

PostgreSQLインストール

せっかくなのでこちらもPostgreSQL公式風にリライト。

sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
# ここまでPostgreSQLインストール準備
# (あとで一括でapt update, apt install postgresqlする)

システムパッケージのインストール

ここからMastodon公式手順通り。

apt update
apt install -y \
  imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \
  g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \
  bison build-essential libssl-dev libyaml-dev libreadline6-dev \
  zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
  nginx redis-server redis-tools postgresql postgresql-contrib \
  certbot python3-certbot-nginx libidn11-dev libicu-dev libjemalloc-dev
corepack enable
yarn set version classic
apt install git

Rubyインストール

mastodonユーザーで、~mastodon/live配下にセットアップする。

# Mastodonシステム用ユーザーを作成
adduser --disabled-login mastodon
# 設定情報全部空欄でEnter
# Mastodonユーザーでセットアップするのでユーザー切り替え
su - mastodon
# ここからRubyインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec bash
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
# ↓公式手順だと3.0.6を入れるよう誘導されているが、
# Mastodon v4.2.0ではRuby 3.2.2が推奨なので書き換えなければならない
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.2.2
# インストールに5分ぐらいかかる。ターミナルが動かないがそのまま待つこと
rbenv global 3.2.2
gem install bundler --no-document
exit
# ↑rootユーザーに戻る

Mastodonインストール

# PostgreSQLでMastodon用DB作成
sudo -u postgres psql
CREATE USER mastodon CREATEDB;
exit
-- ↑もし効かなければ「\q」(円マークと半角小文字のQ)
su - mastodon
# ↑mastodonユーザーになる
git clone https://github.com/mastodon/mastodon.git live && cd live
git checkout <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>g</mi><mi>i</mi><mi>t</mi><mi>t</mi><mi>a</mi><mi>g</mi><mo>−</mo><mi>l</mi><mi mathvariant="normal">∣</mi><mi>g</mi><mi>r</mi><mi>e</mi><mi>p</mi><mo>−</mo><msup><mi>v</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>r</mi><mi>c</mi><mo stretchy="false">[</mo><mn>0</mn><mo>−</mo><mn>9</mn><mo stretchy="false">]</mo><mo>∗</mo></mrow><annotation encoding="application/x-tex">(git tag -l | grep -v &#x27;rc[0-9]*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">i</span><span class="mord mathnormal">tt</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">re</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">rc</span><span class="mopen">[</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">9</span><span class="mclose">]</span><span class="mord">∗</span></span></span></span>' | grep -v 'beta[0-9]*$' | sort -V | tail -n 1)
# 公式手順だとrc[0-9]*だけを除外しているが、
# 4.2.0はbeta[0-9]*という書き方みたいなので、それも除かないといけない
bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
yarn install --pure-lockfile
# ぼちぼち時間がかかる rubyのインストールと違って、こっちは文字が流れていく

S3セットアップ(必要なときのみ)

ファイルストレージにAmazon S3を使う場合のみ、この節をチェックしてください。

外部からファイルをRead/WriteできるS3バケットと、そのRead/Write権限を設定したアクセスキー・アクセスシークレットが必要です。

…というところが、この節の最終目標です。

AWSの基本知識や基本操作(そもそもアカウントの作成方法とは、を含め)は触れません。
すでにAWSアカウントがあり、しばらく使ったことがあるものとして、
要点だけかいつまんで記載します。

設定したい方は確認の上設定してください。
自信がない場合はS3は諦め、ローカルストレージでもいいかもしれません。
(ローカルストレージのデメリット:ディスク容量に限りがある
メリット:いくらストレージを使おうとも、VPSの料金以上に課金は起きない)

S3バケットを作る

CloudFrontでディストリビューションを作成する

Certificate Managerでサブドメイン用の証明書を作る

CloudFrontに証明書と代替ドメイン名を登録する

DNSにCloudFrontディストリビューションドメイン名を設定

IAM設定

1.IAMポリシーを作成する。
S3フルアクセス権限でもいいが、ベストプラクティスに沿って最小権限でいくと、↓があれば足りるはず。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::{@S3バケット名で置き換え@}"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:PutObjectAcl",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": "arn:aws:s3:::{@S3バケット名で置き換え@}/*"
        }
    ]
}

2.IAMユーザーグループを作成
さっき作ったポリシーをアタッチしておく

3.IAMユーザーを作成
さっき作ったグループに所属させる
そしてそのユーザーのアクセスキーを入手する。

AccessKeyとSecretAccessKeyを控えたら、↓の「IAMアクセスキー」「IAMシークレットアクセスキー」に埋める。

Mastodonセットアップ

セットアップコマンドを実行します。

途中でしくじると面倒なので、一発で通せるように、この節(と場合によっては↑の節)をあらかじめ準備のうえ、↓を流しましょう。

# これを実行するとこのコードブロックの下にあるものが次々と聞かれるので、
# あらかじめ準備しておくべし
sudo su - mastodon
cd ~/live
RAILS_ENV=production bundle exec rake mastodon:setup

必要な情報と例・補足は以下の通り。
最新の聞かれる内容はソースを見て追うとよいでしょう。
メモ帳にでもコピって、全部埋めておくといいでしょう。

おわり。

準備はできましたか?できたら箇条書きの上にあるコマンドを叩きましょう。

なお、ここまで終わっても、まだMastodonにはアクセスできません。

nginxの設定と証明書設定

ここからrootユーザーでの作業。
mastodonユーザーであればexitして、rootになりましょう。

なお、本稿執筆時点の公式手順通りにするとLet’s Encryptの設定で100%失敗するので、ここに記載の手順で作業してください。

systemctl stop nginx
# nginx.confのテンプレートをMastodonから持っていく
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
# sites-enabledにシンボリックリンク
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
# 必要な箇所を編集する
# example.comを新ドメインに置き換える(viなら、:%s/example.com/あたらしいドメイン/g がはやい)のと、
# SSL証明書に関するコメントアウトを外すのは必須。(ssl_certificateとssl_certificate_keyの2行)
vi /etc/nginx/sites-available/mastodon
# まずnginxを通さずスタンドアロンで認証する
certbot certonly --standalone -d あたらしいドメイン
# メールアドレス入力、利用規約の同意、(任意)ニュースレター登録をする
nginx -t
# nginx設定のテスト。
# 通ったら起動する
systemctl start nginx
# 起動して改めて、正攻法(?)で証明書を取り直す
certbot --nginx -d あたらしいドメイン
# 1: 既存の証明書を残す、2: 新しい証明書で置き換える
# という選択肢を迫られるので、2で上書き
# この方法でやると、certbot的にちょうどいいように
# /etc/nginx/sites-available/mastodonが勝手に書き換わる。
# -----
# 諸々こわいので今のうちにcronで自動更新するようセットしておく
certbot renew --dry-run
# ドライランで特にエラーが出ないことを確認
# (出るなら設定を見直す)
certbot renew
# まだ更新期日じゃないよって出ることを確認
# dry-runと違って叩き倒すとブロックされちゃうらしいので気を付ける
# このあとcronで設定するコマンドが走ることを(強制更新で)確認
/usr/bin/certbot renew --force-renewal --deploy-hook "systemctl restart nginx"
vi /etc/cron.daily/letsencrypt-renew

毎日↓が走るようにする

#!/bin/sh
/usr/bin/certbot renew --deploy-hook "systemctl restart nginx"

保存して、cronを読み込む

systemctl restart cron

Mastodonをデーモンとして登録する

そうしないと満足に起動しない。
ついでにサーバー起動時に勝手に立ち上がるようにもする。

cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming

おわり

これで最初に決めたドメインにアクセスすると、つながるはず。
つながらなかったら何かおかしい。

一般的なバージョンアップ手順

リリースノートで何か特別な作業が指示されてない限り(v4.2.0では指示された)、
↓の手順で大丈夫。

sudo su -
systemctl stop mastodon-{web,sidekiq,streaming}
su - mastodon
cd /home/mastodon/live
git fetch origin
git checkout v4.1.1
bundle install
yarn install
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake assets:precompile
exit
systemctl start mastodon-{web,sidekiq,streaming}

その他

VPSが調子悪かったりしたので、サーバー引っ越しや、Sidekiqの拡張、監視シェルの仕込みなどを行いましたが

それについてはまた別記事にするかも…?