今巷で大流行の Mastodon、なんのことだか分からないなりに流行に乗りたかったので、先程 mstdn.jp でアカウントを取得してみました。
大体どういうものなのか分かってきたので、次は自分の Mastodon 最速で立ててみたいと思います。
さくらの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
を以下のように編集して、
*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 が必要とする基本的なパッケージのインストール
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 のインストール
sudo apt-get install redis-server redis-tools
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-build のインストールを行います。
こちらはそれぞれのセットアップドキュメントを参照するようになっていたので、そのとおりにやっていきます。
rbenv が必要とする基本的なパッケージのインストール
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
rbenv のインストール
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 本体のセットアップ
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
# 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.hogehoge.com
# とりあえずは HTTP で作成するので false
# 最後に true にします
LOCAL_HTTPS=false
# 先程生成したrake のシークレットキーを指定します
SECRET_KEY_BASE=**********************
# メール関連の設定
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=mail@mastodon.hogehoge.com
SMTP_PASSWORD=*******
SMTP_FROM_ADDRESS=mail@mastodon.hogehoge.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
[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
[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
[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
server {
listen 80;
server_name mastodon.hogehoge.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.hogehoge.com -m mail@mastodon.hogehoge.com --agree-tos -n
コマンドの実行が終了すると、 /etc/letsencrypt/
配下に証明書一式が保存されていることが確認できます。
nginx の設定変更
Nginx をそのまま使います。
先ほど作成した、 /etc/nginx/conf.d/mastodon_proxy.conf
を上書きしましょう。
ただし、 ssl_certificate
と ssl_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 ライフをお楽しみください😀