自分でできるというから作ってみたよ、Mastodon

一時的に盛り上がっていたMastodon、小野島さんも登録してみたとのことでしたがMastodonについては自分でもインスタンスが構築できるとのことで、構築した!という記事が一気に増えましたね。

そこで私も便乗してインスタンスを作ってみました。
※テスト的に作ったので短めに公開して終わらせようかと思っています。
※サイトは私個人が立ち上げたのでAkrosとは直接関係はありませんが、ちゃんと動きます。
https://mast.webschoolchallenge.com
テストが終了したので閉鎖しました。

というか、Mastodonを構築したかったのではなく、サーバー周りをあまりいじっていなかったのでちょうどいい機会なので構築ついでに少しいじろう、と思ったのがきっかけです。

Mastodonは直接各ソフトウェアなどをインストールして構築する人とDockerのコンテナに構築する人がいるようなのですが、今回Mastodon環境を構築することがメインの目的ではない(とは言いつつブログ掲載のため急ぎましたが)というのとDockerでコンテナ化した複数ホスト環境を作ってみたい、というのもあってDockerを使用しました。

※今回の範囲の技術的な説明には適切でないものも含まれているかもしれません。
 ざっくりと見て頂ければと思います。

CentOS7+nginx+HTTP/2+Docker

今回は主に上記の環境で構築しました。さくらレンタルサーバーのアカウントを所有していたのでさくらVPSで構築しています。

CentOS7

https://www.centos.org/
参考書でCentOS7の本を見かけたのですが、CentOSはこれまでも続いてきているのでなぜCentOS7用に本がでるのか、と思っていたんですね。

今回Mastodonを構築するにあたりCentOS7を少し触ったのですが、なんとなくわかりました。
私が触った範囲だけでも、iptablesではなくfirewallがデフォルトになっていたり、サービスコマンドがserviceではなくsystemctlになっていたり(chkconfigも使えますがsystemctlに飛んでいます)。
そもそもカーネルのバージョンから異なるのでいろいろと変更が入っているんですね。
CentOS6系までしか触れていない方、長くCentOS6まで触れてきた方は少してこずるかもしれませんよ。

nginx

https://nginx.org/
今回apache2.4系でHTTP/2対応をしてみようかと思っていたのですが、Mastodonがnginxがよさそうだったし、コンテナ化することでnginxを起点に振り分ける環境も作りやすそうだったのでnginxを使用しました。
Mastodon環境はDockerのコンテナで作られていて、80,443ポートにアクセスが来たらnginx経由でアクセスするようになっています。
ここに、通常の例えばWordPressを入れた別サブドメインのホストを立ち上げるとか、コンテナを作って立ち上げるとかしてみようかと考えています。

HTTP/2

https://ja.wikipedia.org/wiki/HTTP/2
HTTP/2化は単純に読み込みが速いというところを体感したくていれました。
ALPN対応のためopensslを1.0.2系にしなければならなかったので入れたのですが、nginxをソースからコンパイルしなければいけなかったようで、だいぶ環境を作った後に気が付いたためopenssl1.0.2系対応はまだしていません。
一応HTTP/2対応にはなっていますがALPN対応にはなっておりません。
いずれ入れなおして対応させてみたいと考えてます。
また、HTTP/2化用のSSLとしては無料のLet’s Encryptを使用させて頂きました。
期限切れにならないようにcronにシェルプログラム登録もしています。

Docker

https://www.docker.com/
私はこれまでどちらかというと開発環境でVirtualBox+Vagrantを使うことがあったで、Dockerをあまり使っていませんでした。
Dockerは上記環境と違い、Docker自体が1つのプロセスとして、のように動くので、1プロセスの中にコンテナの中身が動いているようなイメージといったような感じでしょうか(ちょっと違うかもしれませんが)。
コンテナで動かす、という形を実装するためDockerを導入しています。
DockerコンテナのおかげでMastodon自体の構築は比較的簡単に行うことができました。
DockerとDocker-composeを使用しています。

mastodon

https://github.com/tootsuite/mastodon
こちら本体ですが、GitHubに用意して頂いているソースから構築できるようです。
環境さえ構築できていれば細かいソフトなどはすべてそろっていて構築のための設定ファイルの更新ととちょっとした設定を行えば出来上がってくれます。
このファイルではRuby on RailsとPostgreSQLなどで作られているようですね。

メールについてはPostfixだと迷惑メールになってしまうと困るので「SparkPost」などを使用するとよい、という意見が多かったため、同じようにしています。

各作業一部抜粋です。

全部じゃないです。ここにあるだけじゃできません。コマンド実行場所の移動なども省略してます。以下のコマンドだけやってもおかしなことになりますのでご注意ください。

  • 作業用ユーザー作成
    [bash] useradd ユーザー名
    passwd パスワード
    [/bash]
  • ssh接続設定 鍵作成など
    [bash] vi /etc/ssh/ssh_config
    [/bash]
  • ロケール設定変更
    [bash] vi /etc/sysconfig/i18n
    [/bash]
  • ntpインストール 設定
    [bash] yum install ntp
    vi /etc/ntp.conf
    [/bash]
  • vsftpインストール 設定
    [bash] yum install vsftpd
    vi /etc/vsftpd/vsftpd.conf
    [/bash]
  • iptablesのインストール 自動起動
    [bash] yum install iptables-services
    systemctl enable iptables
    [/bash]
  • firewallの停止
    [bash] systemctl stop firewall
    systemctl disable firewall
    [/bash]
  • iptablesにポートセキュリティ設定追加
     syn-flood等のアタック対策
     http,ftp,mail,ssh追加ポート 設定 等
    [bash] vi /etc/sysconfig/iptables
    systemctl restart iptables
    [/bash]
  • SELinuxの無効化設定
    [bash] vi /etc/selinux/config
    getenforce
    [/bash]
  • リポジトリインストール
    epel  repoファイル設定変更
    nginx repoファイル設定変更
    ius  repoファイル設定変更
    [bash] yum -y install epel-release.noarch
    sed -i ‘s/enabled=1/enabled=0/g’ /etc/yum.repos.d/epel.repo
    yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    yum install https://centos7.iuscommunity.org/ius-release.rpm
    [/bash]
  • Dockerインストール 自動起動
    [bash] yum install –enablerepo=epel docker-io
    [/bash]
  • nginxインストール 自動起動 yumでやってしまった・・・
    [bash] yum –enablerepo=nginx install nginx
    [/bash]
  • openSSL1.0.2ダウンロード ソースコンパイル
    コマンドのシンボリックリンク変更
    [bash] wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
    yum -y install zlib-devel
    make
    make install
    echo /usr/local/openssl-1.0.2h/lib > /etc/ld.so.conf.d/openssl102h.conf
    ldconfig
    ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
    [/bash]
  • 使用しないけどapache2.4インストール(nghttp2,mod_sslなども併せて)
    ※nginxを動かしているのでapacheは止めています。
    [bash] yum –enablerepo=epel -y install nghttp2
    yum install mailcap
    yum –disablerepo=base,extras,updates –enablerepo=ius install httpd-devel mod_ssl
    systemctl stop httpd
    systemctl disable httpd
    [/bash]
  • Gitインストール
    [bash] yum -y install git
    [/bash]
  • mastodon.gitのクローン
    [bash] git clone https://github.com/tootsuite/mastodon.git
    [/bash]
  • Docker-composeインストール
    [bash] curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    [/bash]
  • .env.productionの設定
    [bash] cp -p .env.production.sample .env.production
    vi .env.production
    [/bash]
  • docker-composeの3回実行
    [bash] docker-compose run –rm web rake secret
    docker-compose run –rm web rake secret
    docker-compose run –rm web rake secret
    [/bash]
  • docker-compose.ymlの設定
    [bash] vi docker-compose.yml
    [/bash]
  • let’s encryptのクライアントにあたるcertbotのクローン
    [bash] git clone https://github.com/certbot/certbot
    [/bash]
  • SSL証明書作成設定
    [bash] ./certbot-auto certonly –standalone -d mast.webschoolchallenge.com
    [/bash]
  • 自動更新シェルスクリプト作成
    [bash] vi encrypt_ssh_up.sh
    [/bash]
  • cronに登録
    [bash] crontab -e
    [/bash]
  • nginxのconf.dフォルダ内にmastodon用のconfファイルを作成
    [bash] vi /etc/nginx/conf.d/mastdon.conf
    [/bash]
  • docker-composeでmastodonサービスのビルド
    このあたりでmastodon内のpostgreSQLにDB作成をしていたはず
    docker-composeでDB初期化、assetsのコンパイル
    docker-composeでmastodonサービスの起動
    [bash] docker-compose build
    docker exec -it mastodon_db_1 /bin/bash
    docker-compose run –rm web rails db:migrate
    docker-compose run –rm web rails assets:precompile
    docker stop $(sudo docker ps -a -q) && docker-compose up -d
    chmod 701 /home/ユーザー名
    [/bash]

ざっくりとこんな感じでした。
さて、次はどんな環境を作ろうかな。