IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

MastodonをIDCFクラウド上に構築してみた

Mastodonとは

Mastodon(マストドン)はTwitterライクなSNSです。誰でも独自のMastodonインスタンスを作ることができて、すでに多数のインスタンスが立ち上がっています。登録されたインスタンスは、Mastodon instancesで参照することができます。

好きなインスタンスに参加するもよし、自分ひとり用のインスタンスを立ち上げるもよしです!本日はMastodonをIDCFクラウド上で構築する手順を紹介します。

f:id:ykanasugi:20170424140134j:plain

利用環境

  • IDCFクラウド light.S2 (1 CPU, 2GB メモリ)
  • Let’s EncryptでSSL証明書を発行
  • CentOS 7.3 64-bit テンプレート

仮想マシンの作成に関してはめちゃ楽ガイドを参照してください。

SSH用のポートにポートフォワードとファイアウォールの設定をしてSSHで接続します。

作業ディレクトリ作成

今回の作業用ディレクトリとして、/home/mastodonを作成します。

# mkdir -p /home/mastodon

dockerインストール

Mastodonはdockerコンテナを利用して構成されているため、dockerをインストール・設定していきます。

# yum -y install docker

docker保存先を変更

CentOS 7のテンプレートを利用する場合、ルートディスクが15GBで構成されます。ルートディスクのサイズは変更できないため、ボリュームを追加・アタッチし、dockerの保存先を変更しておきます。(mastodonのDBが肥大化する恐れもありますので)

仮想マシンへのデータボリュームの追加・パーティション作成・マウントについては、IDCFクラウドFAQを参照するかティアラちゃんに質問してみてください。

ディスクの追加完了後、下記ファイルを編集し保存先を変更します。 今回は/data/dockerというディレクトリを作成し、そちらを保存先にしました。

# vi /etc/sysconfig/docker

下記行がありますので、

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'

末尾に下記を追記します。

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -g /data/docker'

docker-composer準備

MastodonはPostgreSQLやRedisも利用しますので、docker-compose.xmlファイルを利用してコマンド一発で起動できるように準備します。

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

インストールが正常にされたかを確認します。

# docker-compose --version
docker-compose version 1.12.0, build b31ff33

バージョンが表示されればOKです。

dockerの起動

dockerを起動します。

# systemctl start docker

Mastodonのインストール

GitHubからcloneする

MastodonをGitHubからcloneします。

# git clone https://github.com/tootsuite/mastodon

データの永続化設定

標準状態のままですと、データの永続化設定となっていないためコンテナを停止してしまうとデータが削除されます。 ユーザの登録情報等を永続的に維持するためにdocker-compose.xmlファイルを編集します。

# cd /home/mastodon/
# vi docker-compose.yml

下記のコメントアウトされているコンフィグを有効化します。(冒頭の#を外す)

#    volumes:
#      - ./postgres:/var/lib/postgresql/data

#    volumes:
#      - ./redis:/data

環境ファイルをコピーし設定する

# cp .env.production.sample .env.production

シークレットキーの発行

下記コマンドを実行してシークレットキーを発行します。(少し時間がかかります。)

# docker-compose build
# docker-compose run --rm web rake secret

キーは3つ必要なため、上記の'docker-compose run –rm web rake secret'コマンドを合計3回実行する必要があります。最後に表示された長い文字列をコピーして次のステップで貼り付けます。

環境ファイルを編集してシークレットキー・ドメイン名・HTTPSを有効化するかの設定をします。example.comとあるところはご自身のMastodonで利用するFQDNを設定してください。

# vi .env.production
PAPERCLIP_SECRET=(発行されたキー①を貼り付け)
SECRET_KEY_BASE=(発行されたキー②を貼り付け)
OTP_SECRET=(発行されたキー③を貼り付け)
LOCAL_DOMAIN=example.com
LOCAL_HTTPS=true

データベースのマイグレーションとフロントエンドコンパイル

下記コマンドを実行します。

# docker-compose run --rm web rails db:migrate
# docker-compose run --rm web rails assets:precompile

Mastodonコンテナを起動

# docker-compose up -d

docker psコマンドを実行すると起動しているコンテナ一覧を表示することができます。

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
ae2dc853c315        gargron/mastodon    "bundle exec sidekiq "   4 seconds ago       Up 3 seconds        3000/tcp, 4000/tcp                 mastodon_sidekiq_1
922437f3ff8b        gargron/mastodon    "bundle exec rails s "   4 seconds ago       Up 3 seconds        0.0.0.0:3000->3000/tcp, 4000/tcp   mastodon_web_1
f72ac86fa74e        gargron/mastodon    "npm run start"          4 seconds ago       Up 3 seconds        3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
147bec4a1086        redis:alpine        "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes        6379/tcp                           mastodon_redis_1
75e3c4008fb8        postgres:alpine     "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes        5432/tcp                           mastodon_db_1

Nginxのインストール

epelリポジトリを追加して、NginxとCertbotをインストールします。

# yum -y install epel-release
# yum -y install nginx certbot python-certbot-apache

Certbotを利用してSSL証明書を発行する

Certbotを利用し、Let’s Encryptから証明書を発行してもらうためには、443番ポートへのアクセスが許可されている必要があるので、管理コンソールからファイアウォールとポートフォワードの設定を追加します。443番のファイアウォールは、ソースIPをANYで開けてください。 具体的な設定方法については、めちゃ楽ガイドを参照してください。

下記コマンドを実行して証明書を取得します。

# certbot certonly --standalone -d <mastodonで利用するFQDN>

Nginx設定ファイルを準備する

MastodonのGitHubページ内にあるconfファイルの内容をコピーします。 下記ディレクトリに、mstdn.confとして保存します。

# cd /etc/nginx/conf.d
# vi mstdn.conf
コピーした内容を貼り付け

server_name、SSL証明書へのフルパスとrootを変更します。 また、今回はRSA鍵を使用するため、ssl_dhparamの行はコメントアウトもしくは削除します。

server_name example.com;

ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# ssl_dhparam         /etc/ssl/certs/dhparam.pem;

root /home/mastodon/public/;

Nginxを起動する

# systemctl start nginx.service

Mastodonへアクセスする

設定したFQDNに対してブラウザでhttpsアクセスします。ユーザ登録画面が表示されれば完了です。

f:id:hikita:20170421175221p:plain

ユーザ認証をコマンドラインで実行する

登録をしてもメールサーバの設定をしていないため、登録後の認証用メールを受信することができません。 そのため、コマンドラインからユーザの認証を実施します。

# docker-compose exec web bundle exec rails mastodon:confirm_email USER_EMAIL=<認証するメールアドレス>

認証が完了するとログインできるようになりますので、ログインしてトゥートしてみましょう!

f:id:hikita:20170421175730p:plain

最後に

実は、IDCFクラウドでMastodonを運営するには結構メリットが多いのです。

もしアクセスが伸びてきて仮想マシンのスペックが足りなくなった場合、IDCFクラウドには無停止でスケールアップする機能(ダイナミックスケール)もあるのでご活用ください。

また、IDCFクラウドのメリットとして、アウトバウンドの転送量は3,240GBまで無償範囲内でご利用いただけます。超えてしまった分は10円/GBの従量課金となります。転送量の急増が心配な方は、予算アラート機能を使ってみてください。

Copyright © IDC Frontier Inc.