mastodonを構築する(ubuntu20.04)

「今更?」と思われる人も多いが、僕もよく破壊しては構築するし(ダメだろ)、構築マニュアル記事が乱立しているので、ここに備忘録、メモ程度に置いておく。ついでに他の人が構築する際に参考になれば良いと思ってる。

前提的な部分

今回使用するのは以下の通り

・ubuntu20.04がインストールされたサーバー(2vCPU以上。メモリは1GBでスワップすれば出来る…と思う。)

公式のマニュアルにはubuntuもしくはDebianどちらでも可と書いてあるが、まぁ無難にubuntuで。

ディストリビューションという観点ではどちらもdebian系なので、大筋があってればどっちでも可能っていう意味だと思う…多分。知らんけど。

・CloudFlare

アカウントを作っておく。特に課金する必要性はない。全てFreeプランで進めていく。

・任意のドメイン

ここでは「example.com」とする。ご自身で取得したドメインに適時置き換えること。

とりまのアプデ

とりま内部のアップデートをする。これは借りるサーバーによってはめちゃんこ時間かかるので気長に待とう。

apt update && apt upgrade -y

Cloudflareの設定

Cloudflareにドメインを登録してから、それが適用されるまでまぁまぁ時間がかかるので、あらかじめやっておく。こちらを参照。

https://chiyo-blog.com/cloudflare-registration/

プランはフリーで構わない。

レコードはAにIPv4、AAAAにIPv6を入れる。あと名前のところは「@」を入れる事。

あと良く忘れがちなのが「SSL/TLS」の設定。デフォルトが「フレキシブル」になっているので、ここを「フル」に変えておくこと。ここ結構落とし穴。

実際に構築する。

Cloudflareの設定も終わり、サーバーのアプデも終わったところで構築を開始していく。

一応本家のマニュアルがあるが、今から下記に記す構築方法はほぼほぼ同じである。ただ、何点かこちらでコマンドを加えたり、説明を加えたりしているのをご了承いただきたい。

諸々インストールする前にファイアーウォールの設定をしよう。

sudo ufw default deny 
sudo ufw allow 22
sudo ufw allow 443
sudo ufw allow 80
sudo ufw enable
sudo ufw status

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

22はローカル、443と80はIPv4とIPv6。それ以外は受け付けないという設定にした。

続いてcurl、wget、gnupg、apt-transport-https、lsb-release、および ca-certificates が最初にインストールされていることを確認する。

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

Node.jsをぶち込む。なんかコマンド打った後に「『Sudo apt install node.js』をしろ」的な事を言われたが、フルシカトでOK。

curl -sL https://deb.nodesource.com/setup_16.x | bash -

PostgreSQLもぶち込む。

wget -O /usr/share/keyrings/postgresql.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc
echo "deb [signed-by=/usr/share/keyrings/postgresql.asc] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/postgresql.list

2つぶち込めたら、残りの諸々細かいのをぶち込む。

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

細かいものをぶち込めたら、続いてYarnを入れる。

corepack enable
yarn set version stable

rbenv を使用して Ruby のバージョンを管理する。そもそもmastodonを動かすにあたってRubyは必須プログラムなので、これがないと構築できない。

Rubyをぶち込むために、まずユーザーとしてmastodonを加える。

adduser --disabled-login mastodon

色々電話番号だの住所だの聞かれると思うが、何も入力せずにエンターを連打してOK。

ユーザーを加えられたら、そのユーザーに切り替える。

su - mastodon

rbenv と rbenv-build のインストールを行う。

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

rbenvを入れたら、本格的にRubyをインストールに移る。これ10分くらいかかるので、まぁお茶でもゲームでもしながら待つのが吉。

(2023年4月26日追記:mastodonのバージョンごとにRubyのバージョンの条件が異なります。例えば、v4.1.2は必ずRuby3.0.6でなければ動きません。必要なRubyのバージョンはmastodon releaseから確認してください。)

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4
rbenv global 3.0.4

バンドラーもインストールする。

gem install bundler --no-document

ここまで来たら、一旦mastodonユーザーでやることは終わり。rootに戻る。

exit

この後公式マニュアルではPgTuneでチューニングする的な事を書いているが、ぶっちゃけよくわからないので僕は無視している。無視しても全然普通に使えるので、問題ないと思う。

Mastodon が使用できる PostgreSQL ユーザーを作成する必要をインストールするうえで作る必要があるので、ユーザーをまた作る。さっき作ったやつとは別。「\q」で通常のコマンドラインに戻れる。

sudo -u postgres psql
CREATE USER mastodon CREATEDB;
\q

さぁ入れようmastodon

前提的なところは全てそろったので、鯖にmastodonをぶち込む。

まずはマストドンユーザーに切り替え

su - mastodon

gitを使用して、最新の安定版を入れる。ここのgithubで最新のリリースが見れるが、以下のコマンドを打つと勝手に最新の安定版を指定してくれる。ちなみに「prerelease」は安定版ではない。「Latest」が最新の安定版。

git clone https://github.com/tootsuite/mastodon.git live && cd live
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

Ruby と JavaScript の依存関係をインストール。3行目の「bundle install -j$(getconf _NPROCESSORS_ONLN)」でまたまたそこそこ時間かかるので、お茶でも注いで来てください。

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

さぁ、全てそろったぞ!対話型のウィザードを開始して各種設定をする。

RAILS_ENV=production bundle exec rake mastodon:setup

そして、この対話型で色々聞かれる。英語読めるなら雰囲気で出来るけど、一応書いておきます。

Domain Name:使用するドメイン名

Do you want to enable single user mode? (お一人様モードにするかどうか)

Are you using Docker to run Mastodon? (Dockerを使ってMastodonを動かしているかどうか。ここはNo。)

PostgreSQL host: (PostgreSQLが動作しているホスト。ここはlocalhost)
PostgreSQL port: (PostgreSQLが動作しているポート。変更してなければ 5432)
Name of PostgreSQL database: (データベース名。任意。mastodon とか。)
Name of PostgreSQL user: (PostgreSQLのユーザ名。 mastodon。)
Password of PostgreSQL user: (PostgreSQLのユーザのパスワード。設定してなければ空白)

Redis host: (Redisのホスト。ここはlocalhost)
Redis port: (Redisのポート。変更してなければ 6379)
Redis password: (Redisのパスワード。設定してなければ空白)

Do you wait to store uploaded files on the cloud? (画像や動画をクラウドのオブジェクトストレージ等に保存しますか? 任意。)

Do you want to send e-mails from localhost? (ローカルホストからメールを送りますか?任意。Nを選ぶとメールサーバの設定が出る)

Save configuration? (設定を保存しますか?Yを選択。)


Prepare Database now? (データベースの初期化をしますか?Yを選択。)

Compile the assets now? (アセットのコンパイルをしますか?Yを選択。結構時間かかる。メモリが足りない場合はここではじかれる。)

Do you want to create an admin user straight away? : true (管理者用アカウントをここで作るかどうか。作っとこう。)
Username:使いたいID 
E-mail: ログインする際に使うメアド
You can login with the password: (長いパスワード)=>メモっておく

メモリが足りない場合や、スワップ領域を足したけど足りない場合はここではじかれます。もっとデカくするしかないっぽい。なお話がそれるが、AWSの勉強がてらt2.microを使用してスワップ領域で1GB増やしてやったらはじかれたので、結構ギリギリ攻めるのは厳しいかも。

以上完了したらrootに戻る。

exit

やっほー!みんな大好きnginxの時間だよ!!!

nginx、名前を聞くだけで気持ち悪くなる…何度こいつに心を折られたか…

みんなも僕みたいになってほしくないからここにやり方を記すぜ…

まずはMastodon ディレクトリから 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

証明書を発行するために、ファイルを編集します。

vi /etc/nginx/sites-available/mastodon

そこにある「example.com」を自分のドメインに切り替える。「/example」とかで場所を調べられる。4か所あると思う。あと「ssl~」って長々と公開鍵と秘密鍵が書いてあるところは「#」を削除する。ここ削除しないと後々エラー起こします。

map $http_upgrade $connection_upgrade {
  2   default upgrade;
  3   ''      close;
  4 }
  5
  6 upstream backend {
  7     server 127.0.0.1:3000 fail_timeout=0;
  8 }
  9
 10 upstream streaming {
 11     server 127.0.0.1:4000 fail_timeout=0;
 12 }
 13
 15
 16 server {
 17     if ($host = example.com) { #ドメイン変更
 18         return 301 https://$host$request_uri;
 19     } # managed by Certbot
 20
 25   root /home/mastodon/live/public;
 30 }
 29
 30 }
 31
 32 server {
 33   listen 443 ssl http2;
 34   listen [::]:443 ssl http2;
 35   server_name example.com; #ドメイン変更
 36
 37   ssl_protocols TLSv1.2 TLSv1.3;
 38   ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
 39   ssl_prefer_server_ciphers on;
 40   ssl_session_cache shared:SSL:10m;
 41   ssl_session_tickets off;
 42
 43   # Uncomment these lines once you acquire a certificate:
 44   # ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem    ; # managed by Certbot #ドメイン変更&先頭#はずす
 45   # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.p    em; # managed by Certbot #ドメイン変更&先頭#はずす
 46
 47   keepalive_timeout    70;
 48   sendfile             on;
 49   client_max_body_size 80m;

ファイル自体は100行以上あるが、修正箇所は4か所のみ。

その後、SSL証明書を通すのだが、このままやっても証明書を登録していないのではじかれる。なので、証明書を作るところから始める。

ただ、この証明書、ややこしいのが「何度もトライ&エラーしたら1週間出禁になる」というルールが存在する。多分5回?とかかな。僕はこれで何度も心おられました。1週間は長いよぉぉ…

ただ、それを回避する方法があり、それがテストを行えるということ。本番でミス連発すると出禁食らうだけで、テストなら何度やってもええよねっていうことです。テストを行うにはオプションとして「- -standalone」を用いる。例によってexample.comは自分のドメインに置き換える事。

sudo systemctl stop nginx
certbot certonly  --standalone -d example.com

これでメアドを入力する。。これは「証明書の期限切れ時や緊急時の連絡に使用されるメールアドレスの入力」です。テキトーなご自身のメアドを入れて進む。

その後、「利用許諾への同意(必須)」「入力したメールアドレスの電子フロンティア財団への共有の可否(オプション)」が聞かれますので適宜返答する。

「Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):」 と聞かれた際は2を入力する。

「congratulations!」って出たらテスト成功。本番で同じことをします。

Q.エラーが発生する。80あーだこーだって出ます。

A.「nginxによって80番ポートが使われててテストする隙間が無い」と言われてると思います。「sudo systemctl stop nginx」でnginxを停止させた上でテストを行ってください。

Q.エラーが発生する。「ssl certificateあーだこーだ」って出ます。

A.公開鍵と秘密鍵を収納するファイルが見つからねぇ、指定してねぇだろ!って言われてると思います。「/etc/nginx/sites-available/mastodon」の中身にある「ssl_certificate~」って書いてあるところの「#」は取り除いたか確認してください。あとそこのドメインは変えましたか?色々確認してみてください。

クリアしたら本番環境で動かす。その前にnginxを起動しないといけない。念のため、nginxの起動に問題が起きてないかチェックしてから起動させる。

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

これで下の二行が出ればOK。実際にnginxを起動させ、本番で流します。今回は「–standalone」を外しています。

suto systemctl start nginx
certbot certonly -d example.com

これで先程と同じく「congratulation!」って出れば成功。おめでとう。君は勝者だ。

さて、立ちあげるぞ!以下のコマンドを入力してフィニッシュや!

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

何事もエラーが発生せず出来たら、自分のドメインにアクセスしてみよう。mastodonの見慣れたUIが出てるはずだ。やったね。

今回も雑に書いたけど、もともと丁寧に書くつもりなんてさらさらないので許せ!僕よりも優秀な人がもっと臭弁な記事を書いてるのでそっちを見たほうが良いかもしれんぞ。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です