- 更新日: 2017年5月3日
- Docker
マストドン(Mastodon)のDockerインスタンスをさくらVPSに設置してみた
マストドン(Mastodon)のインスタンスを、さくら VPS に Docker を用いて設置してみました。この記事は、その作業を行った際の備忘録です。公式 README にも書いてありますが、Mastodon のインスタンスを立てるには、Docker を用いる方法が比較的簡単です。設置してみてやはり Docker 便利だな〜!ってなりました。
事前に、ご利用のドメインサービスでドメインを取得して、サーバーの IP アドレスに対する DNS レコードの設定を済ませておきます。既にドメインをお持ちの方はそれを利用してもOKです。
CentOS 7 をインストール
さくら VPS で、CentOS 7 をインストールします。OS の選択はお好みでご自由にどうぞ。コントロールパネルからログイン後、各種設定 – 標準OSインストール – CentOS 7 を選択してインストールします。root ユーザー用に設定するパスワードを控える。
CentOS 7 のインストールが終了したらアップデートしておきます。root ユーザーで SSH ログイン。
1 2 3 |
[mac]$ ssh root@サーバーのIPアドレス |
CentOS のバージョン確認。
1 2 3 4 |
# cat /etc/redhat-release CentOS Linux release 7.2.*** |
続いてアップデート。
1 2 3 |
# yum -y update |
アップデート後にもう一度 CentOS のバージョン確認。CentOS 7.3 に上がりました。
1 2 3 4 |
# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) |
続いて、作業ユーザー作成、公開鍵認証による SSH 接続設定、root ログインの制限、ネットワーク設定などを行っていきます。
作業ユーザーの作成と sudo 設定
作業用のユーザーを作成して、パスワードを設定します。
1 2 3 4 |
# useradd user_name # passwd user_name |
user_name ユーザーが sudo できるようにする。user_name を sudoers.d に追加します。
1 2 3 4 |
# echo "user_name ALL=(ALL) ALL" >> /etc/sudoers.d/user_name # chmod 440 /etc/sudoers.d/user_name |
user_name を wheel グループに追加。
1 2 3 4 5 6 7 |
# id user_name uid=502(user_name) gid=502(user_name) groups=502(user_name) # usermod -G wheel user_name # id user_name uid=502(user_name) gid=502(user_name) groups=502(user_name),10(wheel) |
最後に、作成した作業用ユーザー が sudo できるか確認です。
1 2 3 4 |
# su - user_name $ sudo ls -la /home/ |
公開鍵認証による SSH 接続設定
ローカルマシン(私の場合 Mac)で鍵を作成後、公開鍵をアップロードします。パスワードを入力して scp で転送。
1 2 3 4 |
[mac]$ ssh-keygen [mac]$ scp ~/.ssh/id_rsa.pub user_name@サーバーのIPアドレス: |
user_name ユーザーでサーバーにログイン後、authorized_keys を設定します。
1 2 3 4 5 6 7 8 9 10 |
[mac]$ ssh user_name@サーバーのIPアドレス $ cd ~ $ mkdir ~/.ssh $ touch ~/.ssh/authorized_keys $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/id_rsa.pub $ chmod 600 ~/.ssh/authorized_keys $ chmod 700 ~/.ssh/ |
続いて、ローカルマシンで ~/.ssh/config の設定。
1 2 3 4 5 6 7 |
[mac]$ vim ~/.ssh/config Host host.user_name HostName サーバーのIPアドレス User user_name IdentityFile ~/.ssh/id_rsa |
SSH接続テスト。
1 2 3 |
[mac]$ ssh host.user_name |
root ログインの禁止
サーバーに SSH でログイン後、sshd_config を編集します。root によるログイン、およびパスワード認証によるログインを拒否する設定を行います。
1 2 3 4 5 |
$ sudo vim /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no |
上記を設定したら sshd をリスタート。
1 2 3 |
$ sudo systemctl restart sshd.service |
ターミナルの別タブから、root でログインできないことを確認。
1 2 3 4 |
[mac]$ ssh root@160.***.***.*** Permission denied (publickey). |
作業ユーザーでは SSH ログインできることを確認。
1 2 3 |
[mac]$ ssh host.user_name |
SSH 接続での root によるログイン禁止と公開鍵認証を強制 〜 CentOS6 | EasyRamble
以降は、サーバー側での作業です。
Firewall の設定
続いて http, https の firewall 設定を行い、http, https による通信ができるようにします。
1 2 3 4 5 |
$ sudo firewall-cmd --add-service=http --zone=public --permanent $ sudo firewall-cmd --add-service=https --zone=public --permanent $ sudo firewall-cmd --reload |
確認。
1 2 3 4 |
$ sudo firewall-cmd --list-service --zone=public dhcpv6-client http ssh https |
必要なライブラリをインストール
事前に必要となるライブラリをインストールしておく。
1 2 3 4 |
$ sudo yum -y install zlib-devel $ sudo yum -y install readline-devel |
SELinux の無効化
SELinux を無効化しておきます。
1 2 3 4 |
$ sudo vim /etc/sysconfig/selinux SELINUX=disabled |
Nginx のインストール
続いて、Nginx のインストールとバージョン確認。
1 2 3 4 5 |
$ sudo yum -y install nginx $ nginx -V nginx version: nginx/1.10.2 |
Nginx の起動、およびサービスとして自動起動の設定。
1 2 3 4 |
$ sudo systemctl start nginx $ sudo systemctl enable nginx |
ブラウザからアクセスして、Nginx の初期画面が表示されればOKです。
Docker のインストール
Docker をインストールします。
1 2 3 4 5 6 7 8 9 |
$ sudo vim /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg |
docker-engine のインストールと、docker 自動起動の設定です。
1 2 3 4 5 |
$ sudo yum -y install docker-engine $ sudo systemctl start docker $ sudo systemctl enable docker |
docker-compose のインストール。
1 2 3 4 5 6 |
$ sudo -s # sudo curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" > /usr/bin/docker-compose # exit $ sudo chmod +x /usr/bin/docker-compose |
ユーザーを docker グループに追加。
1 2 3 |
$ sudo usermod -aG docker user_name |
Mastodon インストール
任意の場所で git clone で mastodon をインストールします。
1 2 3 4 5 6 7 8 |
$ mkdir projects $ cd projects/ $ pwd /home/user_name/projects $ git clone https://github.com/tootsuite/mastodon.git $ cd mastodon |
docker-compose.yml を編集してビルド
コンテナを破棄しても DB データが吹っ飛ばないように、docker-compose.yml を編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ vim docker-compose.yml version: '2' services: db: restart: always image: postgres:alpine ### Uncomment to enable DB persistance volumes: - ./postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine ### Uncomment to enable REDIS persistance volumes: - ./redis:/data |
続いて、docker-compose.yml で設定された Docker イメージを pull してビルドします。
1 2 3 |
$ sudo docker-compose pull |
pull した docker イメージを確認。mastodon, postgres, redis のイメージが pull されました。
1 2 3 4 5 6 7 |
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE gargron/mastodon latest 7621cb1f68d5 8 hours ago 676MB postgres alpine 953120eb942e 5 days ago 37.7MB redis alpine 83638a6d3af2 8 weeks ago 19.8MB |
ビルド。かなり時間がかかります。
1 2 3 |
$ sudo docker-compose build |
設定ファイル .env.production の編集
次に、設定ファイル .env.production の編集です。secret キーを設定する箇所が3箇所あるので、事前に rake secret を3回実行してキーを控えておく。
1 2 3 |
$ sudo docker-compose run --rm web rake secret |
.env.production.sample をコピーして設定ファイルを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ cp .env.production.sample .env.production $ vim .env.production # Service dependencies REDIS_HOST=redis REDIS_PORT=6379 DB_HOST=db DB_USER=任意のDBユーザー名 DB_NAME=任意のDB名 DB_PASS=任意のDBパスワード DB_PORT=5432 # Federation LOCAL_DOMAIN=ドメイン名 LOCAL_HTTPS=true # Application secrets # Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose) PAPERCLIP_SECRET=事前に生成したキー1個目 SECRET_KEY_BASE=事前に生成したキー2個目 OTP_SECRET=事前に生成したキー3個目 |
メールサーバー(SparkPost)の設定
SparkPost で、GET STARTED FOR FREE からアカウントを作成します。登録したら、「What domain will you be sending email from?」と入力を促されるので、取得済みのドメイン名を入力して CREATE。「Send with SMTP」または「Send with REST」から、Password もしくは API KEY(両者とも同じ)を取得して控えておきます。
その後、「Go to Dashboard」からダッシュボードへと移動。ACCOUNT – SENDING DOMAINS – DKIM Record – Settings をクリックします。表示された DNS 設定を、ご利用サーバーで Type を TXT にして DNS レコードとして追加します。DNS レコードの反映には時間がかかる場合があります。DNS レコードが反映された後、Test をクリックしてOKが確認できたら SparkPost での設定は終了です。
SparkPost の設定が終了したら、メール送信のための .env.production 編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vim .env.production SMTP_SERVER=smtp.sparkpostmail.com SMTP_PORT=587 SMTP_LOGIN=SMTP_Injection SMTP_PASSWORD=取得したSMTPパスワード(API KEY) SMTP_FROM_ADDRESS=info@ドメイン名 #SMTP_DOMAIN= # defaults to LOCAL_DOMAIN #SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail SMTP_AUTH_METHOD=plain #SMTP_OPENSSL_VERIFY_MODE=peer SMTP_ENABLE_STARTTLS_AUTO=true |
設定する情報は、API Reference – SparkPost Developer Hub を参考。
DB の作成
Docker コンテナを立ち上げて、DB を作成します。
1 2 3 |
$ sudo docker-compose up -d |
コンテナ一覧を確認。
1 2 3 |
$ sudo docker ps |
DB コンテナに入って、データベースを作成します。.env.production に設定した、DB 情報を元に入力を進める。
1 2 3 4 5 6 7 8 9 10 |
$ sudo docker exec -it mastodon_db_1 bash # su - postgres $ createuser -P DBユーザー名 Enter password for new role:DBパスワードを入力 Enter it again:DBパスワードを入力 $ createdb DB名 -O DBユーザー名 $ exit # exit |
Rails のセットアップ
Rails アプリケーションのセットアップのため、マイグレーションや Asset Precompile を行います。
1 2 3 4 |
$ sudo docker-compose run --rm web rails db:migrate $ sudo docker-compose run --rm web rails assets:precompile |
コンテナの再起動。
1 2 3 |
$ docker stop $(docker ps -a -q) && docker-compose up -d |
Let’s Encrypt 証明書の作成
HTTPS(SSL)のために、Let’s Encrypt を用いて SSL 証明書を作成します。
1 2 3 4 5 6 7 |
$ cd /opt $ sudo git clone https://github.com/certbot/certbot $ sudo systemctl stop nginx $ cd /opt/certbot $ sudo ./certbot-auto certonly --standalone -d ドメイン名 |
Let’s Encrypt の証明書を自動更新するために、cron を設定します。
1 2 3 4 |
$ sudo crontab -e 0 2,5 */7 * * systemctl stop nginx && /opt/certbot/letsencrypt-auto renew --force-renew && systemctl start nginx |
Nginx 設定
nginx の conf ファイル設定。Mastodon 用の Nginx 設定を、documentation/Production-guide.md からコピペしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
$ sudo vim /etc/nginx/conf.d/mastodon.conf map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; listen [::]:80; server_name ドメイン名; # Useful for Let's Encrypt location /.well-known/acme-challenge/ { allow all; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name ドメイン名; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; keepalive_timeout 70; sendfile on; client_max_body_size 0; root /home/mastodon/live/public; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; add_header Strict-Transport-Security "max-age=31536000"; location / { try_files $uri @proxy; } location ~ ^/(assets|system/media_attachments/files|system/accounts/avatars) { add_header Cache-Control "public, max-age=31536000, immutable"; } location @proxy { 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-Proto https; proxy_set_header Proxy ""; proxy_pass_header Server; proxy_pass http://127.0.0.1:3000; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; tcp_nodelay on; } 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-Proto https; proxy_set_header Proxy ""; proxy_pass http://localhost:4000; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; tcp_nodelay on; } error_page 500 501 502 503 504 /500.html; } |
コンテナを再起動して、Nginx のリスタート。
1 2 3 4 |
$ sudo docker stop $(docker ps -a -q) && docker-compose up -d $ sudo systemctl restart nginx |
ブラウザから動作確認して、マストドンの画面が表示されればOKです。
管理者権限の設定
ブラウザから通常のユーザー登録を行います。その後、管理者にするユーザー名を指定して以下コマンドを実行。
1 2 3 |
$ sudo docker-compose run --rm web rails mastodon:make_admin USERNAME=管理者にするユーザー名 |
シングルユーザーモードにする
最初に登録したアカウント以外に登録を許可せずに、シングルユーザーで運用する場合は次の設定を行います。
「管理画面 – サイト設定 – 新規登録を受け付ける」を無効にする。
その後、以下のように .env.production を編集。
1 2 3 4 |
$ sudo vim .env.production SINGLE_USER_MODE=true |
Docker コンテナと Nginx を再起動。
1 2 3 4 |
$ sudo docker stop $(docker ps -a -q) && docker-compose up -d $ sudo systemctl restart nginx |
以上で、Docker を用いたマストドンインスタンスの設置は終了です。Docker を使うと Mastodon インスタンスを比較的楽に立てられます。とは言え、この記事くらいの作業量はありますので、初回だと2〜3時間程度はかかりますね。以上、Docker を使ってマストドンのインスタンスを設置する手順でした!
- – 参考リンク –
- CentOS インストール〜設定手順の目次
- チュートリアル:CentOS 7(さくらのVPS)サーバ作成直後に設定しておくべき初期セキュリティ設定 さくらのVPSニュース
- documentation/Docker-Guide.md at master tootsuite/documentation GitHub
- さくらの VPS + CentOS7 で 俺専用 Mastodon インスタンスを立ててみた話 | WWW WATCH
- さくらVPSでmastodonのインスタンスを立てた(CentOS7) – Qiita
- Docker の関連記事
- Docker for MacでDocker.qcow2のサイズがどんどん大きくなる問題
- DockerでRails + MySQLの開発環境を構築
- Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで
Leave Your Message!