KUSANAGIでmastodon動かしてみた

ますとどん!


今流行の分散型のSNSmastodonを、KUSANAGIで入れてみました。
手順は、さくらのクラウドに追加されたスタートアップスクリプトを参考にしています。

kusanagi設定


インスタンスとして2GBメモリのものを用意して、普通にkusanagi initとkusanagi provision までを実行します。
これで、Let’s Encrypt SSL証明書取得とNGINXの設定ができました。
provision は、LAMPを指定しますが、使用するのはNGINXの設定だけで、PHP7とmysqlは停止します。

yum update -y
kusanagi init --tz tokyo --lang en --keyboard en --passwd passw0rd --no-phrase --nginx --php7
kusanagi provision --lamp --fqdn mstdn.myzkstr.tech --email EMAIL@example.com --dbname dummy  --dbuser dummy --dbpasswd passw0d  mstdn
kusanagi ssl --http redirect --hsts weak
systemctl stop mysql php7-fpm
systemctl disable mysql php-fpm

追加パッケージインストール


以下のように、パッケージを追加インストールします。
nux-desktopは、ffmpeg関連のインストールに、nodesouce はnode.jsのインストールに必要なようです。

yum install -y http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
curl -sL https://rpm.nodesource.com/setup_6.x | bash -
yum install -y ImageMagick ffmpeg redis postgresql-{server,devel} authd nodejs {openssl,readline,zlib}-devel nginx jq bzip2
npm install -g yarn

Postgresql/Redisの設定


Postgresql の初期設定と起動をします。KVSのRedisもここで起動しておきます。

export PGSETUP_INITDB_OPTIONS="--encoding=UTF-8 --no-locale"
postgresql-setup initdb
sed -i "s/ident/trust/" /var/lib/pgsql/data/pg_hba.conf
systemctl enable postgresql redis
systemctl start postgresql redis
su - postgres -c "createuser --createdb mastodon"

Ruby on Rails と Mastodonの設定


ユーザ mastdon を作成し、ここにRubyをインストールし、RailsとMastdonの構築を行います。
以下の手順では、renv でRuby2.4.1をインストールし、依存ライブラリをインストールします。
また、さくらのクラウドのスタートアップスクリプトでは、localhostのpostfixの設定をしますが、ここではGmailのメールサーバを使用しています。
事前に、Gmailアカウントの設定でアプリパスワードの発行が必要で、ここで発行したパスワードをSMTP_PASSWORDに設定します。また、SMTP_LOGINとSMTP_PASSWORDはパスワードを発行した際のGmailのメールアドレスを指定します。
この手順は、http://qiita.com/ymmtmdk/items/aa0d300450d370a1eca0の記事を参考にしています

useradd -g www mastodon
su - mastodon

※以下mastdonユーザ権限での動作

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
rbenv init - >> ~/.bash_profile
source ~/.bash_profile
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 2.4.1
rbenv global 2.4.1
rbenv rehash

git clone https://github.com/tootsuite/mastodon.git live
cd live
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
gem install bundler
bundle install --deployment --without development test
yarn install

cp .env.production.sample .env.production
sed -i "s/_HOST=[rd].*/_HOST=localhost/" .env.production
sed -i "s/=postgres$/=mastodon/" .env.production
sed -i "s/^LOCAL_DOMAIN=.*/LOCAL_DOMAIN=mstdn.myzkstr.tech/" .env.production
sed -i "s/^LOCAL_HTTPS.*/LOCAL_HTTPS=true/" .env.production
sed -i "s/^SMTP_SERVER.*/SMTP_SERVER=smtp.gmail.com/" .env.production
sed -i "s/^SMTP_LOGIN.*/SMTP_LOGIN=EMAILADDRESS/" .env.production
sed -i "s/^SMTP_PASSWORD.*/SMTP_PASSWORD=PASSWORD/" .env.production
sed -i "s/^SMTP_FROM_ADDRESS=.*/SMTP_FROM_ADDRESS=EMAILADDRESS/" .env.production
echo 'SMTP_OPENSSL_VERIVFY_MODE=none' >> .env.production
export SECRET_KEY_BASE=$(bundle exec rake secret)
sed -i "s/^SECRET_KEY_BASE=/SECRET_KEY_BASE=$(printf ${SECRET_KEY_BASE})/" .env.production

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

chown -R g+rx /home/mastodon

Mastodon サービスの定義と起動

以下のように、mastodonのサービスを定義し、起動・有効化します。Rails、Sidekick、Streamingの3つのサービスが必要になります。

SDIR=/etc/systemd/system
cat << "_EOF_" > ${SDIR}/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
_EOF_

cat << "_EOF_" > ${SDIR}/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
_EOF_

cat << "_EOF_" > ${SDIR}/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
_EOF_

systemctl enable mastodon-{web,sidekiq,streaming}
systemctl start mastodon-{web,sidekiq,streaming}

NGINX設定

KUSANAGIで生成したNGINXの設定は、LAMPつまりPHPを使うことを想定しています。そこで、上記で作成したサービスを使うように設定を変更します。

cat /etc/nginx/conf.d/mstdn_ssl.conf
#=======================================
# mstdn.myzkstr.tech SSL
#---------------------------------------

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

server {
        listen       443 ssl http2;
        server_name  mstdn.myzkstr.tech;

        ssl_certificate      /etc/letsencrypt/live/mstdn.myzkstr.tech/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/mstdn.myzkstr.tech/privkey.pem;
        ssl_dhparam /etc/kusanagi.d/ssl/dhparam.key;

        ssl_session_tickets     on;
        ssl_session_ticket_key     /etc/kusanagi.d/ssl_sess_ticket.key;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ct on;
        ssl_ct_static_scts /etc/letsencrypt/live/mstdn.myzkstr.tech/scts;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-HA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4";

        ssl_prefer_server_ciphers   on;
        ## OCSP stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.4.4 8.8.8.8 valid=300s;
        resolver_timeout 10s;

        access_log  /home/kusanagi/mstdn/log/nginx/ssl_access.log main;
        error_log   /home/kusanagi/mstdn/log/nginx/ssl_error.log warn;

        charset UTF-8;
        client_max_body_size 16M;
        #root  /home/kusanagi/mstdn/DocumentRoot;
        root /home/mastodon/live/public;
        index index.php index.html index.htm;

        location / {
                try_files $uri @proxy;
        }

        location @proxy {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header Proxy "";
                proxy_pass_header Server;

                proxy_pass http://127.0.0.1:3000;
                proxy_buffering off;
                proxy_redirect off;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;

                tcp_nodelay on;

                add_header X-Signature KUSANAGI;
                add_header Strict-Transport-Security "max-age=31536000";
        }

        location /api/v1/streaming {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header Proxy "";

                proxy_pass http://localhost:4000;
                proxy_buffering off;
                proxy_redirect off;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;

                tcp_nodelay on;

                add_header X-Signature KUSANAGI;
                add_header Strict-Transport-Security "max-age=31536000";
        }

        error_page 500 501 502 503 504 /500.html;

}

設定変更後、NGINXの再起動を行います。

systemctl restart nginx

マストドン!


これで、mastdon が起動しました。
KUSANAGIのSSLの設定をそのまま活かし、http/2で接続可能な状態です。

あとは mastodon ユーザの権限で以下のcron 実行を仕掛けています。

@daily cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shim
s/bundle exec rake mastodon:daily > /dev/null

mackerelでの監視も行っています。nginx、postgresql、redis あたりはプラグインがあるのですが、Railなどはどうやって監視するのがいいのか検討中です。

Follow me!

Leave a Reply