前回、Mastodon がメモリ食いらしいので代わりに GNU social インスタンスを立ててみたのだが、それでも一応 Mastodon も触ってみたくなったので CloudAtCost の Developer Cloud Pro 1 (メモリ 512MB、ストレージ 10GB) を2台持っているのを1台にまとめてインスタンスを立ててみることにした。
まとめるとこんな感じ:
- なるべく APT で済ませる (基本方針)。
- rbenv は使わない。Ubuntu 収録の Ruby 2.3.1 でいく。
- なぜか bundle install 通らないのは Gemfile いじって無理矢理。
あ、Docker 使うのが普通みたいだけど使ってない。
基本方針は「なるべく APT で済ませる」だ。アップデートチャネルが多くなると面倒なので。
当初 Debian jessie で構築を進めていたが、Ruby 2.1 ではさすがに古くてどうにもならず、当然ながら ruby-build も古くて rbenv で Ruby 2.4.1 を入れることができず、rbenv 関係全部 git で入れる羽目になって基本方針とかけ離れてきたので中止。
なお CloudAtCost の Ubuntu イメージは 14.04 しかないので、まず最初に do-release-upgrade で 16.04 にした。
ベースは Mastodon のプロダクションガイドに従うが、APT で代替できるものは APT にする。
その際、PPA もどんどん使う。
以下、プロダクションガイドの記述順に沿って書いていく。
プロダクションガイドではユーザー mastodon、ホームディレクトリ /home/mastodon を使うことを前提としているのでユーザーを作っておく。違うものを使う場合は適宜読み替える。
Nginx 関係は後に回す。
まずは Node.js。プロダクションガイドの手順ではこうなっている。
sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git curl g++ libprotobuf-dev protobuf-compiler
curl -sL https://deb.nodesource.com/setup_6.x | sudo bash -
sudo apt-get install nodejs
sudo npm install -g yarn
1行目はそのままでいい。
2、3行目もそのまま。
Ubuntu 16.04 では Node.js 4.2.6 が収録されているが、後で必要になる browserify の導入には 4.6 以降が要求されるので、素直に 6.x を入れてしまう。
4行目は yarn の apt-line 追加に変更する。
wget -qO- https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn
Redis と PostgreSQL はプロダクションガイドの通り。
次は Rbenv だが、Ubuntu 16.04 が Ruby 2.3.1 収録のところ、Mastodon は Ruby 2.4.1 を要求している。
しかし Gemfile を見ると 2.3.0 以上 2.5.0 未満となっているのでこのままいく。
つまり、rbenv は入れない!
sudo apt install ruby bundler
ユーザー mastodon に su しての作業は、git checkout まではプロダクションガイド通り。
cd ~
git clone https://github.com/tootsuite/mastodon.git live
cd live
git checkout $(git tag | tail -n 1)
ここからは違ってくる。
プロダクションガイドでは次のようになっている。
gem install bundler
bundle install –deployment –without development test
yarn install –pure-lockfile
bundler はさっき apt で入れたので1行目は除外。
.env.production は DB がローカルの場合、DB_HOST に localhost とか書くと ident 認証がコケるので、空にする必要がある。
こんな感じに。
REDIS_HOST=localhost
REDIS_PORT=6379
# REDIS_DB=0
DB_HOST=
DB_USER=mastodon
DB_NAME=mastodon
DB_PASS=
DB_PORT=5432
そしてセットアップ。
RAILS_ENV=production bundle exec rails db:setup
これはプロダクションガイド通りではあるが、Ruby のバージョンチェックで引っかかる。
/home/mastodon/live/Gemfile の4行目だ。
ruby ‘>= 2.3.0’, ‘< 2.5.0’
とあり、2.3.1 が入っているのだから問題ないはずなのだが。
PPA で 2.4.1 を入れた状態でも引っかかる有様だったので、行頭に # をねじ込みコメントアウトして無理矢理いく。
次に進む前に browserify を入れる。これだけは APT 管理できない。
node-browserify-lite では代用できなかった。
yarn add browserify
そして次に進む。
RAILS_ENV=production bundle exec rails assets:precompile
その次は systemd 周りの前に、Nginx と Let’s Encrypt を済ませる。
Nginx のインストール。
sudo apt install nginx
プロダクションガイド記載の設定は Nginx 全体のものではなくサイト設定なので、/etc/nginx/sites-available/mastodon とかファイルを作ってそこに書く。流用でいいが、一応ググって基本的な理解をしておいた方がいいとは思う。
流用の場合、基本的にすべて HTTPS でのアクセスになる。
HTTP は Let’s Encrypt のドメイン確認のみに使い、それ以外は HTTPS にリダイレクトされる。
SSL 関係の設定は Mozilla SSL Configuration Generator を参考に詰めることをおすすめする1。
以下、流用ベースで書いていく。
なお HTTP の方にも
root /home/mastodon/live/public;
を書いておかないと certbot がコケる。
sites-available にあるだけではもちろん動かないので、sites-enabled にシンボリックリンクを張る。
sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/
certbot で Let’s Encrypt の証明書を導入しておく。
まずは certbot の導入から。
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot
/etc/ssl/certs/dhparam.pem も作っておく。
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
一時的に /etc/nginx/sites-available/mastodon の
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
は行頭 # でコメントアウトしておく。でないと今はまだ証明書も鍵もないので、Nginx がエラーを吐く。
sudo systemctl reload nginx
sudo certbot certonly --webroot -w /home/mastodon/live/public -d example.com -m admin@example.com
証明書ができたら、/etc/nginx/sites-available/mastodon の先ほどコメントアウトした部分を戻して nginx を reload。
プロダクションガイドの続きに戻って systemd 周り。
基本的にはプロダクションガイドの記述をそのままコピペでファイルを作っていけばいいのだが、rbenv を使っていないので /home/mastodon/.rbenv_shims/bundle はない。
/usr/bin/bundle を使う。
ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
↑これをこうする↓。
ExecStart=/usr/bin/bundle exec puma -C config/puma.rb
crontab も同様に。
メモリ 1GB ではかなりカツカツという事前情報は正しく、ruby2.3 が4プロセスで合計 700MB 近く食っている。
以下はメモリ 128MB や 64MB といった極小 VPS でこそ役に立つものの 1GB 積んでると誤差レベルのメモリ節約にしかならないことだが、一応やっておく。
- syslog は rsyslog から inetutils-syslogd に差し替える。
- ssh サーバーは openssh-server から dropbear に差し替える。
-
流用そのままだと SSL Server Test スコア A- だが、少し詰めるだけで A+ になる。 ↩︎