Mastodonインスタンス“今.jp”をMinioで構築しなおした。

Mastodonインスタンス“今.jp”をAmazon S3互換オブジェクトストレージサーバのMinioを使うように再構築しました。
※動かすまでに手間取って週末二回分くらいかかってしまったので備忘録を兼ねて書き記しておきます。

当初は「さくらのクラウド」の「オブジェクトストレージ」を利用する方向で検討を進めておりましたが、リトアニアにTime4VPSという格安サーバが有ると訊いたので自前でS3互換サーバを立ち上げることにしました。

ストレージVPSプランは、バックアップ無し(RAID6のみ)という条件ながらも2年契約で1TBサーバが2.99ユーロ/月と確かに格安です。

OSは、apt-getからautosshをインストール出来る&長期サポートがあるUbuntu 16.04(LTS)を選択。
契約後すぐにsshが使えるようになりますので、サクサクと作業を進めていきます。


# chmod 700 iptables.sh
# ./iptables.sh
 (あらかじめiptables.shを準備しておく)

# adduser adminuser
# su adminuser

$ mkdir /home/adminuser/.ssh
$ chmod 700 /home/adminuser/.ssh
$ touch /home/adminuser/.ssh/authorized_keys
$ chmod 600 /home/adminuser/.ssh/authorized_keys
$ vi /home/adminuser/.ssh/authorized_keys
$ exit

# visudo

# vi /etc/ssh/sshd_config
 (鍵認証のみを許可するように設定)
# /etc/init.d/ssh restart

# apt-get update
# apt-get purge apache2 apache2-bin apache2-data apache2-doc apache2-utils postfix sasl2-bin
# apt-get install iptables-persistent autossh nginx-light
# apt-get upgrade
# dpkg-reconfigure tzdata
 (Mastodonが稼働しているサーバと同じタイムゾーンを選択します、不一致の場合はMastodonからS3サーバへの接続でエラーが出ます。)
 (ホストサーバはJSTですが、Docker環境はUTCで動作していましたのでUTCを選択しました。)

# vi /etc/nginx/nginx.conf
 (内容はhttps://docs.minio.io/docs/setup-nginx-proxy-with-minioを参考に、以下のような設定を行いました。)
 location / {
   proxy_buffering off;
   proxy_set_header Host $http_host;
   proxy_pass http://127.0.0.1:9000;
 
   expires 1d;
 }

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# wget https://support.cloudflare.com/hc/en-us/article_attachments/201243967/origin-pull-ca.pem
# openssl dhparam 2048 -out ./dhparam.pem
# vi cloudflare.pem
# vi cloudflare.key
# chmod 400 ./*

# adduser miniouser
# su miniouser

$ cd
$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio

$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ touch mastodon-server-user.key
$ vi mastodon-server-user.key

$ ssh user@mastodon-server.xn--wmq.jp -i /home/miniouser/.ssh/mastodon-server-user.key -R 9000:127.0.0.1:9000 -C -N
 (known_hostsファイルを生成させるため、動作確認を兼ねて一度ssh接続しておく。)

$ cd
$ vi start.sh
 (内容は以下のようにしました。)
 #!/bin/bash
 export MINIO_ACCESS_KEY=<アクセスキー>
 export MINIO_SECRET_KEY=<シークレットキー>
 export MINIO_REGION="eu-lithuania"
 export MINIO_BROWSER=on
 
 cd /home/minio/
 screen -AmdS minioscr ./minio server --address 127.0.0.1:9000 /home/miniouser/files
 autossh user@mastodon-server.xn--wmq.jp -i /home/miniouser/.ssh/mastodon-server-user.key -R 9000:127.0.0.1:9000 -C -N -f
 
$ exit
# vi /etc/rc.local
 (最終行に以下の1行を追加)
 /usr/bin/sudo -u miniouser /home/miniouser/start.sh
# reboot

サーバにブラウザでアクセスするとMinioのログイン画面が表示されますので、<アクセスキー>と<シークレットキー>を使ってログインします。
ログイン後、以下のような画面が表示されますので、右下の+ボタンをクリック。

Create bucketをクリックして、バケットを作成します。(画面ではmastodon)

画面左側に作成したバケットが表示されますので、マウスカーソルを乗せると「・・・」表示が出てきますのでクリック。

Bucket Policyを設定します。
「Prefix」は空欄のまま「Read Only」で「Add」をクリックします。

Bucket Policyが設定されました。
この設定を行わなかった場合、MastodonからS3サーバにアクセスは出来るもののブラウザから画像ファイルを読み込めない状態になります・・・

ここまででMinioサーバの構築は完了です、Mastodonサーバの構築に移りましょう。
前回の記事(Mastodonインスタンス”今.jp”を立ててみた。)を参考にしながら、サックリと構築。
前回からの差分は以下の通りです。


 (SiteGuard Liteのインストール方法が変わったので対応していきます。)
# yum install httpd openssl perl wget unzip make file java-1.8.0-openjdk mod_ssl policycoreutils-python
# rpm -Uvh siteguardlite-3.20-0.apache.x86_64.rpm

# semanage fcontext -a -t var_log_t "/opt/jp-secure/siteguardlite/logs(/.*)?"
# restorecon -RFv /opt/jp-secure/siteguardlite/logs
(SELinux環境では、この設定を行わないと上手くログローテートされませんでした。)
# cp /opt/jp-secure/siteguardlite/misc/logrotate.siteguardlite /etc/logrotate.d/siteguardlite
# restorecon -RFv /etc/logrotate.d/siteguardlite

# cd /opt/jp-secure/siteguardlite/
 (さくらインターネット様のマニュアルに記載の設定を行う)
# ./setup.sh
 (Webインターフェースから各種設定を行う。)
# ./setup.sh
 (メモリを空けたいので、Webインターフェースを無効にする。)

# vi /etc/yum.repos.d/nginx.repo
(ファイルの内容は以下の通り記載しました。)
 [nginx]
 name=nginx repo
 baseurl=http://nginx.org/packages/centos/7/$basearch/
 gpgcheck=1
 enabled=1

# rpm --import https://nginx.org/keys/nginx_signing.key
# yum install nginx
# vi /etc/nginx/nginx.conf
 (以下のような感じに設定しました。)
 server {
   listen 172.17.0.1:80;
   server_name 172.17.0.1;
   
   location / {
     allow 172.0.0.0/11;
     deny all;
     
     proxy_buffering off;
     proxy_set_header Host $http_host;
     proxy_pass http://127.0.0.1:9000;
   }
 }

# systemctl start nginx.service
# systemctl enable nginx.service

# yum install yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum makecache fast
# yum install docker-ce docker-ce-selinux
# systemctl start docker.service
# systemctl enable docker.service

# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

# semanage port -a -t http_cache_port_t -p tcp 3000
# semanage port -a -t http_cache_port_t -p tcp 4000
# setsebool -P httpd_can_network_relay on

# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload

# yum install git

# adduser mastodon
# su mastodon

$ cd /home/mastodon
$ git clone https://github.com/tootsuite/mastodon.git /home/mastodon/mastodon
$ cd mastodon
$ git fetch
$ git checkout v1.4.7
$ vi docker-compose.yml
 (永続化設定のみ実施)

$ cp .env.production.sample .env.production
$ vi .env.production
 (各種設定を行います、特筆すべき点は以下の通り。)
 SMTP_SERVER=smtp.sendgrid.net
 SMTP_PORT=587
 SMTP_LOGIN=apikey
 SMTP_PASSWORD=<パスワード>
 SMTP_FROM_ADDRESS=sendonly@xn--wmq.jp
 SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
 #SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
 SMTP_AUTH_METHOD=plain
 SMTP_CA_FILE=/mastodon/config/environments/gd_bundle-g2-g1.crt
 SMTP_OPENSSL_VERIFY_MODE=peer
 SMTP_ENABLE_STARTTLS_AUTO=true
 
 S3_ENABLED=true
 S3_BUCKET=mastodon
 AWS_ACCESS_KEY_ID=<アクセスキー>
 AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
 S3_REGION=eu-lithuania
 S3_PROTOCOL=https
 S3_HOSTNAME=xn--xz1a.xn--wmq.jp
 S3_ENDPOINT=http://172.17.0.1
 S3_SIGNATURE_VERSION=v4

$ cd config/environments
$ wget https://certs.godaddy.com/repository/gd_bundle-g2-g1.crt
$ exit

# cd /home/mastodon/mastodon
# /usr/local/bin/docker-compose build
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose build
# /usr/local/bin/docker-compose run --rm web rails db:migrate
# /usr/local/bin/docker-compose run --rm web rails assets:precompile
# /usr/local/bin/docker-compose up -d

# crontab -e
 (デイリーのメンテナンスタスクを登録。)
 00 03 * * * cd /home/mastodon/mastodon && /usr/local/bin/docker-compose run --rm web rake mastodon:daily

# semanage fcontext -a -t httpd_sys_content_t "/home/mastodon/mastodon/public(/.*)?"
# restorecon -R -v /home/mastodon/mastodon/public

このほか、記載しておりませんがセキュリティ関係の設定等を行いました。