mastodonインスタンスを建立する

mastodonインスタンスを建立する
Photo by Battenhall / Unsplash

お久しぶりでございます。今回は、色々と話題のmastodonに触れていきたいと思います。

動機としては、最近何かと話題のTwitterで久しぶりにmastodonの話を見かけたのがきっかけです。以前、mastodonインスタンスを運用しようと奮闘したのですが、セットアップで挫折してしまった過去があります。そこで、リベンジを兼ねてセットアップから運用まで行いたいと考えた次第です。

Mastodonとは

そもそもMastodonとは?というところからお話しようかと思います。もし、そんなの知ってるよと思った方はこのセクションを飛ばして読み勧めていただければ幸いです。

簡単にMastodonの説明をすると、「非中央集権型のTwitterっぽいSNS」です。これで納得される方がこの世の大半であれば、これだけで済むのですが...自分を含めこれだけれは、あまりイメージが沸かないのがリアルです。

もう少し噛み砕いた表現で言えば、「自分のコミュニティ専用のTwitter」です。これでなんとなくわかったような気がする方が多いのではないでしょうか?という傲慢を添えておきます。

なぜMastodonを?

「そんなのTwitterでやればいいじゃん!」と思う方が大半だと思います。たしかに、そう思います。でも、なんかやってみたいと思ったので、やります。ただそれだけ。

セットアップ

基本的には、公式のセットアップ手順に沿って手順を進めていくだけです。
ですので、こちらの手順を確認してご自分でセットアップできそうな内容でしたら、以下を読み進めなくても公式サイトを参照した方が間違いないと思います。

環境

  • Server
  • OS
    • Ubuntu 22.04

下準備

料理でも、下ごしらえが一番大事です。そこまで料理をするわけではないので、大きい口を叩くなと言われるかもしれませんが...でも、本当に大切です。これをしなかったからうまくいかないことはたくさんあるので。

1. Swap領域を確保

これは、AWS環境だけかもしれません。他環境もしくは、すでにセットアップ済みの場合はこのセクジョンは不要です。
基本的にEC2やLightasilのコンピューティング環境では、デフォルトでSwapがありません。

RedHat曰く、2GB未満であれば、メモリ容量の2倍のスワップ容量を確保すると良いとのことです。

早速スワップ領域を確保していきましょう。digitaloceanのチュートリアルがとても見やすくわかりやすいので、こちらに沿って設定を行なっていきます。

1. Swapの確認
free -h

2段目のSwapが0だったら、領域が確保されていない状態。

2. ファイル作成
sudo fallocate -l 2G /swapfile

一応確認

ls -lh /swapfile
3. ファイルの有効化
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

確認を行う。2段目が設定した量になっていればOK

free -h
4. ファイルの永続化
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
5. Swapの調整
sudo vim /etc/sysctl.conf

以下を一番下に追加

vm.swappiness=10
vm.vfs_cache_pressure=50

2. インストールに必要な小物を入れておく

sudo apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates

3. 作業用のユーザーを作成

sudo adduser --disabled-login mastodon
sudo passwd mastodon

適当なパスワードを設定する

sudo gpasswd -a mastodon sudo

ユーザーを切り替えておく

su - mastodon

4. 必要なソフトをインストール

sudo apt update
sudo 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

1. Redisのセットアップ

今回は、費用を抑えるためにデータストア系のソフトはVMのローカル環境に配置します。

1. Redisの設定を変更

sudo vim /etc/redis/redis.conf

Before

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised no

After

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

3. Redisを有効化と再起動

sudo systemctl enable redis.service
sudo systemctl restart redis.service

以下コマンドで状態を確認

sudo systemctl status redis

2. Postgresのセットアップ

1. Postgresを有効化

sudo systemctl enable postgresql@

2. Postgresに入る

sudo -u postgres psql

3. Mastodon用のRoleを作成

CREATE USER mastodon CREATEDB;

4. 出る

\q

3. Rubyのセットアップ

MastodonはRailsで動いているので当然Rubyの環境が必要になります。今回はrbenvでちゃちゃっと整えます。

1. Gitからソースをクローンする

git clone https://github.com/rbenv/rbenv.git ~/.rbenv

2. makeする

cd ~/.rbenv && src/configure && make -C src

3. PATH通し

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec bash

4. Pluginのソースを追加

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

5. バージョンの設定

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4

6. Rubyをインストール

rbenv global 3.0.4

7. bundleもインストールしておく

gem install bundler --no-document

4. Mastodonのインストール

ようやくここまで辿り着くことができました.... 結構長い道のりでしたが、もう少しでインスタンスを立てることができます。

1. Mastodonのソースを追加

git clone https://github.com/mastodon/mastodon.git live && cd live

2. 最新のブランチにチェックアウト

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

3. bundleをインストール

bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)

4. Yarnををインストール

yarn install --pure-lockfile

5. daemonを設定

これで、再起動しても自動的にmastodonを起動してくれるようになります。

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

6. インタラクティブモードでMastodonを設定する

RAILS_ENV=production bundle exec rake mastodon:setup

5. Nginxの設定

ようやく4のセクションでMastodonがインストールされました。しかし、これだけでは見れるようにはなっておりません。悲しいですが、もう一息頑張りましょう。

1. certbotでssl対応しておく

certbot --nginx -d example.com

2. Nginxファイルを設定

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
sudo vim /etc/nginx/sites-available/mastodon

サンプルの上半分

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/live/public;
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/sample.domain/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/sample.domain/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  root /home/mastodon/live/public;

3. Nginxファイルを読み込み

sudo systemctl reload nginx

これで完成です!

最後に

結構長い戦いでしたが、過去のセットアップできずにやめてしまった自分には勝つことができました。
次回は、運用編でお会いしましょう〜!