さくらのVPSで自分の Mastodon サーバを最速でつくる方法

  • 237
    いいね
  • 6
    コメント

今巷で大流行の Mastodon、なんのことだか分からないなりに流行に乗りたかったので、先程 mstdn.jp でアカウントを取得してみました。
大体どういうものなのか分かってきたので、次は自分の Mastodon 最速で立ててみたいと思います。

また、この記事を書きながら作成した Mastodon サーバは https://mastodon.hekki.info として公開しています。また、私のアカウントは https://mastodon.hekki.info/@hekki です。
良ければ登録してみてください!😄

さくらのVPS を契約する

まずはサーバを用意しなければ何もできません。今回はタイトルの通り さくらのVPS を使ってみます。
VPSってなに?という人は ネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜 を見ると勉強になるかなと思います😀

では、さくらのVPS 料金・仕様一覧 からプランと料金を眺めたら さくらのVPS お申込み から申し込みをします。
クレジットカード決済の場合は2週間のお試し期間がありますので、もし何か問題があればキャンセルすればお金はかかりませんし、公開後にユーザが増えた場合はスケールアップ機能を使えば上位プランに変更することが出来るので、初めは低価格なプランを利用してみるのがいいかもしれないですね!
僕は契約済みの4GBのプランのサーバがありましたので、今回はそれを利用して構築をしたいと思います。

OS をセットアップする

OS の新規インストール

申し込みが終わったら、さくらのVPS コントロールパネル にログインします。
ログイン直後に表示されるサーバ一覧から、対象のサーバをクリックして、サーバの詳細画面に移ります。
初めから CentOS6 x86_64 がインストールされていますが、あとで紹介する Mastodon のドキュメントは Ubuntu を前提としているようでしたので、OSの再インストールを行います。
サーバの詳細画面から、各種設定 -> OSインストール を選択して、標準OSインストールを選択します。
インストールOSの項目はUbuntu16.04 amd64を選択します。あとは ubuntu ユーザのバスワードを入力して、インストールを実行しましょう!

OS の基本的な設定

OS のインストールが完了したら、早速ログインしましょう。
最速で作る方法と書いたので、細かいところはかっ飛ばします!

まずはパッケージの更新。ubuntu ユーザで実行をします。

sudo apt-get update
sudo apt-get upgrade

つぎに mastodon ユーザを作成します。

sudo adduser mastodon
sudo gpasswd -a mastodon sudo

また、標準の状態では TCP 22番ポートしか開放されていないため、他の必要なポートも開放します。
さくらのVPSの標準OSとして提供されている Ubuntu 16.04 は iptables を利用していますので。iptables の設定を行います。
今回は TCP 80/443/3000 番ポートを開放します。

/etc/iptables/iptables.rules を以下のように編集して、

/etc/iptables/iptables.rules
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

変更を反映します。
現在適用されているルールを確認すれば、正しく反映できたかどうかも確認できます。

# 変更の反映
sudo iptables-restore < /etc/iptables/iptables.rules

# 現在適用されているルールの確認
sudo iptables -L -n -v

ここまで終わったら、一度 OS の再起動をしましょう。
これ以降は、作成した mastodon ユーザでログインをして作業を行います。

Mastodon をセットアップする

つぎに、Mastodon のセットアップを行っていきます。
公式ドキュメントである Production guide - Running in production without Docker を参考にして行っていきます。英語に抵抗の無い方は公式ドキュメントを参考にしたほうが良いと思います。
筆者は英語は苦手なので、若干変なニュアンスの場合はコメントで優しくツッコんで頂けますと幸いです😭

Mastodon が必要とする基本的なパッケージのインストール

General dependencies

sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -

sudo apt-get install nodejs

sudo npm install -g yarn

Redis のインストール

Redis

sudo apt-get install redis-server redis-tools

Postgres のインストール

Postgres

Postgres のインストールをして

sudo apt-get install postgresql postgresql-contrib

Mastodon 用の postgres 内ユーザを作成します
ユーザ名は mastodon です
まずは、postgres ユーザで、Postgresのターミナルに入り

sudo su - postgres
psql

SQL を実行し、Postgresのターミナルを終了します。

CREATE USER mastodon CREATEDB;
\q

ちなみにこの直後は postgres ユーザになっているはずなので、 exit コマンドで mastodon ユーザに戻ります。

Ubuntu16.04 のとき、local のユーザがパスワード無しで認証を行う場合は明示的な設定が必要なのだそう。
今回は当てはまりますので、 /etc/postgresql/9.?/main/pg_hba.conf に設定を書き込みます。

sudo sed -i '/^local.*postgres.*peer$/a host    all     all     127.0.0.1/32    ident' /etc/postgresql/9.?/main/pg_hba.conf

最後に ident のインストールをして、デーモンの設定を行います。
ここでは ident の説明は省きますので、気になる方は検索してみましょう😀

sudo apt-get install pidentd
sudo systemctl enable pidentd
sudo systemctl start pidentd
sudo systemctl restart postgresql

ruby の実行環境のセットアップ

Rbenv

rbenv と rbenv-build のインストールを行います。
こちらはそれぞれのセットアップドキュメントを参照するようになっていたので、そのとおりにやっていきます。

rbenv が必要とする基本的なパッケージのインストール

Suggested build environment

sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

rbenv のインストール

rbenv - installation

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
~/.rbenv/bin/rbenv init
source ~/.bash_profile

その後、 type コマンドで rbenv のPATH が読み込まれていれば完了です。
(コマンドを実行し、 rbenv is /home/mastodon/.rbenv/bin/rbenv と表示されれば OK です。)

exit
sudo su mastodon
type rbenv

rbenv-build のインストール

Installing as an rbenv plugin (recommended)

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

ruby のインストール

ここまで完了したら、rbenv を使い ruby 2.4.1 をインストールします。
最後に ruby -v コマンドを実行して、ruby のバージョンが表示されればOKです。
私の場合は ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] と表示されました。

rbenv install 2.4.1
rbenv rehash
rbenv global 2.4.1

ruby -v

Mastodon 本体のセットアップ

Git

mastodon プロジェクトを git から colne してきます。

cd ~
git clone https://github.com/tootsuite/mastodon.git live
cd live

プロジェクトの依存関係となるものをインストールします

gem install bundler
bundle install --deployment --without development test
yarn install

また、rake のシークレットキーを生成してメモっておきましょう

rake secret

設定ファイルのサンプルをコピーして、編集します

cp .env.production.sample .env.production
nano .env.production
env.production
# redis/postgres は同じサーバで稼働しているので、127.0.0.1 にします
REDIS_HOST=127.0.0.1
DB_HOST=127.0.0.1
# DB のユーザは mastodon で設定したので、mastodon にします
DB_USER=mastodon
# のちほど作成するDBの名前も mastodon にします
DB_NAME=mastodon

# ドメイン名を指定する場合は入れておく
LOCAL_DOMAIN=mastodon.example.com
# とりあえずは HTTP で作成するので false
# 最後に true にします
LOCAL_HTTPS=false

# 先程生成したrake のシークレットキーを指定します
SECRET_KEY_BASE=**********************

# メール関連の設定
SMTP_SERVER=smtp.mastodon.example.com
SMTP_PORT=587
SMTP_LOGIN=mail@mastodon.example.com
SMTP_PASSWORD=*******
SMTP_FROM_ADDRESS=mail@mastodon.example.com
SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_ENABLE_STARTTLS_AUTO=true

ここまでできたら、mastodon DB の作成と、CSS/JavaScript ファイルの作成などを行います。

RAILS_ENV=production bundle exec rails db:setup
RAILS_ENV=production bundle exec rails assets:precompile

systemd 関連の設定

ここはサンプルをそのまま流用します。
各ファイルを作成して、それぞれに設定内容を書き込んでください。

sudo touch /etc/systemd/system/mastodon-web.service
sudo touch /etc/systemd/system/mastodon-sidekiq.service
sudo touch /etc/systemd/system/mastodon-streaming.service
/etc/systemd/system/mastodon-web.service
[Unit]
Description=mastodon-web
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target
/etc/systemd/system/mastodon-sidekiq.service
[Unit]
Description=mastodon-sidekiq
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target
/etc/systemd/system/mastodon-streaming.service
[Unit]
Description=mastodon-streaming
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

ここまでできたら、各サービスの自動起動を設定して、サービスを起動させましょう。

sudo systemctl enable /etc/systemd/system/mastodon-*.service
sudo systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

これで http://<サーバのIPアドレス>:3000 で Mastodon のページが表示されればあなたの Mastodon サーバの完成です!

ですが、このままで公開するのはよくありませんので、nginx と組み合わせつつ HTTPS 化しましょう。

nginx をセットアップする

まずは nginx をインストールしましょう。

sudo apt-get install nginx

インストールが完了したら、設定ファイルを作成します。

sudo touch /etc/nginx/conf.d/mastodon_proxy.conf
/etc/nginx/conf.d/mastodon_proxy.conf
server {
    listen 80;
    server_name mastodon.example.com;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP $remote_addr;

    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

ここまでできたら、nginx の自動起動を設定して、サービスを再起動させましょう。

sudo systemctl enable nginx
sudo systemctl restart nginx

この状態で、 http://<サーバのIPアドレス> で先程と同じように Mastodon のページが表示されれば nginx の設定は上手くできています!

これで TCP 3000 番ポートを開放する必要はなくなったので、閉じておきましょう。
/etc/iptables/iptables.rules から -A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT の行を削除して、設定を反映させれば OK です。

HTTPS 化する

最後に作成した Mastodon を HTTPS 化しましょう。
今回は証明書の発行は Let's Encrypt を利用します。
また、ここまでで、何かしらの手段を使ってサーバのIPがドメイン名によって名前解決できるようになっている前提です。さくらのVPSの場合は、コントロールパネルの右上から、 ネームサーバ登録 からできるようになっています。

certbot のインストール

Let's Encrypt のクライアントである certbot をインストールします。
最後のコマンドで、ヘルプメッセージが表示されれば OK です。

cd /usr/local
sudo git clone https://github.com/certbot/certbot
cd certbot
sudo ./certbot-auto --help

証明書の取得

それでは証明書の取得を行います。
対話式にも行えますが、若干の時間稼ぎのためにコマンド1発でやります。

certbot-auto certonly --standalone -d mastodon.example.com -m mail@mastodon.example.com --agree-tos -n

コマンドの実行が終了すると、 /etc/letsencrypt/ 配下に証明書一式が保存されていることが確認できます。

nginx の設定変更

Nginx をそのまま使います。
先ほど作成した、 /etc/nginx/conf.d/mastodon_proxy.conf を上書きしましょう。
ただし、 ssl_certificatessl_certificate_key はドメイン名によってファイルパスが変わるので、その部分だけ変更します。

.env.production の設定変更

/home/mastodon/live/.env.production の HTTPS に関連するパラメータを変更します。
LOCAL_HTTPS=false としていたところを LOCAL_HTTPS=true とします。

各サービスの再起動

最後に設定変更をした各サービスの再起動を行います。

sudo systemctl restart mastodon-sidekiq.service
sudo systemctl restart mastodon-web
sudo systemctl restart nginx

この状態で、 https://<サーバのIPアドレス> で先程と同じように Mastodon のページが表示されれば HTTPS の設定は上手くできています!

これで TCP 80 番ポートを開放する必要はなくなったので、閉じておきましょう。
/etc/iptables/iptables.rules から -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT の行を削除して、設定を反映させれば OK です。

お疲れ様でした!!
これで Mastodon サーバの完成です!
良い Mastodon ライフをお楽しみください😀