一時的に盛り上がっていた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」などを使用するとよい、という意見が多かったため、同じようにしています。
各作業一部抜粋です。
全部じゃないです。ここにあるだけじゃできません。コマンド実行場所の移動なども省略してます。以下のコマンドだけやってもおかしなことになりますのでご注意ください。
- 作業用ユーザー作成
useradd ユーザー名 passwd パスワード
- ssh接続設定 鍵作成など
vi /etc/ssh/ssh_config
- ロケール設定変更
vi /etc/sysconfig/i18n
- ntpインストール 設定
yum install ntp vi /etc/ntp.conf
- vsftpインストール 設定
yum install vsftpd vi /etc/vsftpd/vsftpd.conf
- iptablesのインストール 自動起動
yum install iptables-services systemctl enable iptables
- firewallの停止
systemctl stop firewall systemctl disable firewall
- iptablesにポートセキュリティ設定追加
syn-flood等のアタック対策
http,ftp,mail,ssh追加ポート 設定 等vi /etc/sysconfig/iptables systemctl restart iptables
- SELinuxの無効化設定
vi /etc/selinux/config getenforce
- リポジトリインストール
epel repoファイル設定変更
nginx repoファイル設定変更
ius repoファイル設定変更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
- Dockerインストール 自動起動
yum install --enablerepo=epel docker-io
- nginxインストール 自動起動 yumでやってしまった・・・
yum --enablerepo=nginx install nginx
- openSSL1.0.2ダウンロード ソースコンパイル
コマンドのシンボリックリンク変更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
- 使用しないけどapache2.4インストール(nghttp2,mod_sslなども併せて)
※nginxを動かしているのでapacheは止めています。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
- Gitインストール
yum -y install git
- mastodon.gitのクローン
git clone https://github.com/tootsuite/mastodon.git
- Docker-composeインストール
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
- .env.productionの設定
cp -p .env.production.sample .env.production vi .env.production
- docker-composeの3回実行
docker-compose run --rm web rake secret docker-compose run --rm web rake secret docker-compose run --rm web rake secret
- docker-compose.ymlの設定
vi docker-compose.yml
- let’s encryptのクライアントにあたるcertbotのクローン
git clone https://github.com/certbot/certbot
- SSL証明書作成設定
./certbot-auto certonly --standalone -d mast.webschoolchallenge.com
- 自動更新シェルスクリプト作成
vi encrypt_ssh_up.sh
- cronに登録
crontab -e
- nginxのconf.dフォルダ内にmastodon用のconfファイルを作成
vi /etc/nginx/conf.d/mastdon.conf
- docker-composeでmastodonサービスのビルド
このあたりでmastodon内のpostgreSQLにDB作成をしていたはず
docker-composeでDB初期化、assetsのコンパイル
docker-composeでmastodonサービスの起動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/ユーザー名
ざっくりとこんな感じでした。
さて、次はどんな環境を作ろうかな。