- 更新日: 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コンテナ立ち上げ〜基本操作まで

 画像付き英語辞書 Imagict | 英単語をイメージで暗記
画像付き英語辞書 Imagict | 英単語をイメージで暗記









Leave Your Message!