Dockerを使ってMastodonのインスタンスを作る
概要
最近、Mastodonのインスタンスを作ったので、Mastodonのインスタンスの作り方をここに書いておきます。
ちなみにMastodonの読み方は「マストドン」で、簡単にインスタンスを作れるDockerを使ってインスタンスを作ります。
OSはUbuntuです。
環境
- Ubuntu 16.06 LTS
- Mastodon 2
- Docker
依存パッケージのインストール
まず、必要なパッケージをインストールします。
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Dockerのインストール
では、Dockerのインストールをします。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER
これで、Dockerのインストールが終わります。
後は、Ubuntuの起動時に自動で立ち上がるように次のコマンドを実行します。
sudo systemctl enable docker
docker-composeのインストール
Dockerを扱いやすくするために、docker-composeをインストールします。
curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
これで、docker-composeが使えるようになりました。
Mastodonのインストール
Mastodonをダウンロードしましょう。
git clone https://github.com/tootsuite/mastodon.git
mastodonという名前のディレクトリにMastodonのファイルがあるので、cd mastodon
でディレクトリの中に入ります。
そうしたら、インスタンスを立ち上げる前にいくつかの設定をします。
docker-compose.ymlの変更
docker-compose.ymlという名前のファイルがあると思います。
docker-compose.ymlとは、docker-composeコマンドを使ってDockerを使用する際に使う設定ファイルです。
何も変更しなくてもインスタンスを立ち上げることはできますが、データの永続化ができず、いつデータが消えてもおかしくない状態になっています。
なので、docker-compose.ymlを変更しましょう。
変更として、Uncomment to enable *******
の下にある#
を消します。
消すと、このようになります。
version: '3'
services:
db:
restart: always
image: postgres:9.6-alpine
### Uncomment to enable DB persistance
volumes:
- ./postgres:/var/lib/postgresql/data
redis:
restart: always
image: redis:4.0-alpine
### Uncomment to enable REDIS persistance
volumes:
- ./redis:/data
web:
build: .
image: gargron/mastodon
restart: always
env_file: .env.production
command: bundle exec rails s -p 3000 -b '0.0.0.0'
ports:
- "3000:3000"
depends_on:
- db
- redis
volumes:
- ./public/assets:/mastodon/public/assets
- ./public/packs:/mastodon/public/packs
- ./public/system:/mastodon/public/system
streaming:
build: .
image: gargron/mastodon
restart: always
env_file: .env.production
command: npm run start
ports:
- "4000:4000"
depends_on:
- db
- redis
sidekiq:
build: .
image: gargron/mastodon
restart: always
env_file: .env.production
command: bundle exec sidekiq -q default -q mailers -q pull -q push
depends_on:
- db
- redis
volumes:
- ./public/system:/mastodon/public/system
.env.productionの用意
Mastodonでは、.env.productionというファイルで諸々の設定をします。
次のコマンドで.env.productionを用意しましょう。
cp .env.production.sample .env.production
.env.production.sampleの内容をコピーしたということで、あらかじめ用意されている設定の一部は記述されている状態です。
ここから必要な設定を追加していきます。
まず最初に、ドメインの設定をします。
次のところに、Mastodonにアクセスするためのドメインを記述します。example.comの場合はこのようにします。
LOCAL_DOMAIN=example.com
そうしたら、次の3つに値を設定します。
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=
この値は次のコマンドを実行して表示される文字列を設定します。
docker-compose run --rm web rake secret
それぞれの項目毎に違う値を設定するので3回実行する必要があります。かなり時間がかかることもあるので気長に待ちましょう。
もし、あまりにも時間がかかり実行できないという場合は、DockerでUpdating permissionsが長い時の対処を見てDockerの設定を変えてみてください。
さらに、VAPID_PRIVATE_KEY
とVAPID_PUBLIC_KEY
にも値を設定します。
docker-compose run --rm web rake mastodon:webpush:generate_vapid_key
こちらも2回実行してそれぞれ違う値を設定します。
他にも、メールの設定をします。
アカウントを登録した場合などにメールが送られてくるのですが、そのメールの設定をしなくてはなりません。
ここでは、Gmailを介してメールを送信する方法を紹介します。
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=Gmailのアドレス
SMTP_PASSWORD=Gmailのパスワード
[email protected]
適当な値を設定してください。
データベースの設定
Mastodonではデータベースの設定を一発で終わらせることができます。
次のコマンドを実行して終わりです。
docker-compose run --rm web rake db:migrate
プリコンパイル
Mastodonで使うスタイルシートやスクリプトの生成をします。
docker-compose run --rm web rake assets:precompile
起動
Mastodonを起動するまでの準備ができました。
立ち上げるには、次のコマンドを実行します。
docker-compose up -d
これで、起動できました。
OSを再起動した時でも、自動で起動するので、後は何もしなくて大丈夫です。
これで終わりのようにも感じますが、実はまだ終わりではありません。
リバースプロキシの設定
最後に、nginxというWebサーバを用意してそこからMastodonへアクセスするようにします。
そのため、普通Mastodonにアクセスしようと思ったら、nginxにアクセスして、nginxがMastodonにアクセスするというようになります。
nginxは次のコマンドでインストールします。
sudo apt-get install nginx
nginxの設定ファイルは/etc/nginx/sites-enabled/default
にあります。
その設定ファイルに次の項目を追加します。
location ^~ /.well-known {
root /var/www/html;
}
location / {
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-Host $host;
proxy_pass http://localhost:3000;
}
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-Host $host;
proxy_pass http://localhost:4000;
}
この記述は、server{ }
の中括弧内の最後の方に記述しましょう。
後は、設定を読み込み直すためにnginxを再起動し、OSの再起動をしてもnginxが起動するようにしましょう。
systemctl restart nginx
systemctl enable nginx
HTTPS化
Mastodonでは、HTTPSと呼ばれる情報を読み取られにくいセキュアな通信方法を使うことが強く推奨されています。
そのため、nginxをインストールしてHTTPS化しやすくしました。
HTTPS化するためには、nginxの他にSSL証明書というものが必要なので、それを発行するLet’s Encryptというものをインストールします。
sudo apt-get install letsencrypt
証明書を取得します。example.comのところは立ち上げるMastodonで使うドメインを指定してください。
letsencrypt certonly --webroot -w /var/www/html -d example.com
最後に、nginxの設定を変えます。/etc/nginx/sites-enabled/default
の最後に次のものを追加します。
server {
listen 443 ssl http2;
server_name _;
root /var/www/html;
index index.html;
ssl on;
ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
location ^~ /.well-known {
root /var/www/html;
}
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto 'https';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_pass http://localhost:3000;
proxy_redirect http:// https://;
}
location /api/v1/streaming {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto 'https';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_pass http://localhost:4000;
proxy_redirect http:// https://;
}
}
ssl_certificate
とssl_certificate_key
で指定しているファイルは証明書を取得したドメインで変わるので、適当に変えてください。
設定が終わったら、設定を読み直すためにnginxを再起動しましょう。
systemctl restart nginx
アクセス
これで全ての設定が終わりました。
後は、ブラウザなどで指定したドメインのにアクセスしましょう。
これで、アクセスできるはずです。
アクセスしたら、まずアカウントを作るなど自由に使ってみましょう。
まとめ
疲れました。
色々と分からない部分が多く、設定についてもどのように設定すれば良いのか分かりにくいように感じました。
よし良ければ参考にしてください。