mastodonインスタンスを建立する
お久しぶりでございます。今回は、色々と話題のmastodonに触れていきたいと思います。
動機としては、最近何かと話題のTwitterで久しぶりにmastodonの話を見かけたのがきっかけです。以前、mastodonインスタンスを運用しようと奮闘したのですが、セットアップで挫折してしまった過去があります。そこで、リベンジを兼ねてセットアップから運用まで行いたいと考えた次第です。
Mastodonとは
そもそもMastodonとは?というところからお話しようかと思います。もし、そんなの知ってるよと思った方はこのセクションを飛ばして読み勧めていただければ幸いです。
簡単にMastodonの説明をすると、「非中央集権型のTwitterっぽいSNS」です。これで納得される方がこの世の大半であれば、これだけで済むのですが...自分を含めこれだけれは、あまりイメージが沸かないのがリアルです。
もう少し噛み砕いた表現で言えば、「自分のコミュニティ専用のTwitter」です。これでなんとなくわかったような気がする方が多いのではないでしょうか?という傲慢を添えておきます。
なぜMastodonを?
「そんなのTwitterでやればいいじゃん!」と思う方が大半だと思います。たしかに、そう思います。でも、なんかやってみたいと思ったので、やります。ただそれだけ。
セットアップ
基本的には、公式のセットアップ手順に沿って手順を進めていくだけです。
ですので、こちらの手順を確認してご自分でセットアップできそうな内容でしたら、以下を読み進めなくても公式サイトを参照した方が間違いないと思います。
環境
- Server
- AWS LightSail
- vCPU
- 1 vCPU
- Mem
- 2GB
- Strage
- 60GB(SSD)
- vCPU
- AWS LightSail
- 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
これで完成です!
最後に
結構長い戦いでしたが、過去のセットアップできずにやめてしまった自分には勝つことができました。
次回は、運用編でお会いしましょう〜!