Ubuntu 16.04をインストールしたAlibaba Cloud ECS上でDockerを使ってMastodonを設定する


このチュートリアルでは、Ubuntu 16.04をインストールしたAlibaba Cloud Elastic Compute Service (ECS)上でMastodonを設定します。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

前提条件

  • Alibaba Cloud Elastic Compute Service (ECS)を有効にし、有効な支払い方法を確認する必要があります。新規ユーザーの場合は、新規アカウントに300ドル~1200ドル相当のAlibaba Cloudクレジットを獲得できます。ECSインスタンスのセットアップ方法がわからない場合は、こちらのチュートリアルまたはクイックスタートガイドを参照してください。ECSインスタンスは、少なくとも2GBのRAMと2コアプロセッサを搭載している必要があります。
  • Alibaba Cloudから登録されたドメイン名。すでにAlibaba Cloudまたは他のホストからドメインを登録している場合は、そのドメインネームサーバーレコードを更新することができます。
  • ドメイン名は、あなたのAlibaba Cloud ECSのIPアドレスを指している必要があります。
  • Alibaba CloudのVNCコンソールまたはPCにインストールされているSSHクライアントにアクセスします。
  • サーバーのホスト名を設定し、root権限を持つユーザーを作成します。

サーバーの設定

パッケージのインストールを進める前に、以下のコマンドを使用してUbuntuシステムをアップデートしてください。このコマンドを実行するには、root 以外のユーザから sudo 権限でログインすることを忘れないでください。

# sudo apt update && sudo apt upgrade

Docker CEをインストールするためには、サポートされているファイルを取得するためにsoftware-properties-commonパッケージが必要です。software-properties-commonをインストールするには、以下のコマンドを実行します。

# sudo apt-get install software-properties-common -y

Docker CEのインストールには、Apt-transport-https、ca-certificates、curlが必要です。これらをインストールするには、以下のコマンドを実行します。

# sudo apt-get install apt-transport-https -y 
# sudo apt-get install ca-certificates -y 
# sudo apt-get install curl -y 

Docker CEとDocker Composeのインストール

以下のコマンドを実行して、Docker用のGPGキーを追加します。

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

以下のコマンドを実行して、GPG キーのフィンガープリントを確認します。

# sudo apt-key fingerprint 0EBFCD88

以下のコマンドを実行してDockerリポジトリを追加します。

# sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

以下のコマンドを実行してシステムをアップデートし、追加されたリポジトリをロードします。

# sudo apt update

以下のコマンドを実行してDockerをインストールします。

# sudo apt install docker-ce

以下のコマンドを実行して、ユーザ名をdockerグループに追加します。

# sudo adduser aareez docker 

現在のシェルセッションを閉じて、新しいセッションを開始してください。そうしないとDockerを実行できず、パーミッションエラーが表示される可能性があります。

以下のコマンドを実行して、dockerが正しく実行されているかどうかを確認します。

# docker run hello-world

Docker Composeをダウンロードしてインストールするには、以下のコマンドを実行します。

# sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Docker Composeファイルのパーミッションを設定するには、以下のコマンドを実行します。

# sudo chmod +x /usr/local/bin/docker-compose

Mastodonをインストール

以下のコマンドを実行して、GitリポジトリからMastodonをクローンします。

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

以下のコマンドを実行して、ダウンロードしたディレクトリに移動してください。

# cd mastodon

以下のコマンドを実行して、.env.production.sampleを.env.productionにコピーします。

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

秘密鍵を生成するには、Dockerイメージをビルドして実行する必要があります。ビルドするには、以下のコマンドを実行します。

# docker-compose build

Dockerイメージの構築に成功しました。設定に必要な3つの秘密鍵を生成する必要があります。SECRET_KEY_BASEを生成するには、以下のコマンドを実行します。

# SECRET_KEY_BASE=$(docker-compose run --rm web bundle exec rake secret)

以下のコマンドを実行して、.env.productionファイルにSECRET_KEY_BASEの値を挿入します。

# sed -i -e "s/SECRET_KEY_BASE=/&${SECRET_KEY_BASE}/" .env.production

OTP_SECRETを生成するには、以下のコマンドを実行します。

# OTP_SECRET=$(docker-compose run --rm web bundle exec rake secret)

以下のコマンドを実行して、.env.productionファイルにSECRET_KEY_BASEの値を挿入します。

# sed -i -e "s/OTP_SECRET=/&${OTP_SECRET}/" .env.production

PAPERCLIP_SECRETを生成するには、以下のコマンドを実行します。

# PAPERCLIP_SECRET=$(docker-compose run --rm web bundle exec rake secret)

以下のコマンドを実行して、.env.productionファイルにPAPERCLIP_SECRETの値を挿入します。

# sed -i -e "s/PAPERCLIP_SECRET=/&${PAPERCLIP_SECRET}/" .env.production

LOCAL_DOMAINの値を更新する必要があります。そのためには、テキストエディタで.env.productionファイルを開く必要があります。以下のコマンドを実行して、.env.productionファイルを開きます。

# sudo nano ~/mastodon/.env.production

LOCAL_DOMAIN変数を見つけ、その値をexample.comからECSのドメイン名またはIPアドレスに変更し、更新したファイルを保存します。

mastodonに移動します。

# cd mastodon

上記で変更したので、再度Dockerイメージをビルドする必要があります。ビルドするには、以下のコマンドを実行します。

# docker-compose build

を実行してマイグレーションを実行します。

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

物事をよりスムーズにするためには、アセットを事前にコンパイルする必要があります。そのためには、以下のコマンドを実行します。

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

以下のコマンドを実行してコンテナを実行します。

# docker-compose up -d

Nginxサーバーのインストールと設定

Nginxの設定を作成してMastodonを動作させ、SSL証明書をインストールするには、Nginxサーバーをインストールする必要があります。

以下のコマンドを実行してnginxサーバーをインストールします。

# sudo apt-get install nginx

以下のコマンドを実行して、デフォルトサイトのNginx設定を削除する必要があります。

# sudo rm /etc/nginx/sites-available/default

以下のコマンドを実行して、デフォルトサイトのシンボリックリンクを削除します。

# sudo rm /etc/nginx/sites-enabled/default

以下のコマンドを実行して、Mastodon用のNginx設定ファイルを作成します。

# sudo touch /etc/nginx/sites-available/mastodon

以下のコマンドを実行して、Mastodonのシンボリックリンクを作成します。

# sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

以下のコマンドを実行して、Mastodon Nginxの設定ファイルをnanoのテキストエディタで開きます。

# sudo nano /etc/nginx/sites-available/mastodon

開いているファイルに以下のテキストをコピーペーストし、変更内容を保存します。

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name softpedia.xyz;
  root /home/mastodon/live/public;
  # Useful for 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 softpedia.xyz;

  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/softpedia.xyz/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/softpedia.xyz/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  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 ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    try_files $uri @proxy;
  }

  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://127.0.0.1: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;
}

SSL証明書をインストール

Let's Encrypt with Certbotを使ってSSL証明書をインストールします。そのためには、以下の手順を実行します。

パッケージを更新します。

# sudo apt-get update

software-properties-commonをインストールします。

# sudo apt-get install software-properties-common.

以下のコマンドを使用して、サートボットのリポジトリを追加します。

# sudo add-apt-repository ppa:certbot/certbot

追加された certbot リポジトリを読み込むようにパッケージを更新します。

# sudo apt-get update

SSL証明書発行前にapacheを停止します。

# sudo systemctl stop apache2

以下のコマンドでpython-certbot-apacheをインストールします。

# sudo apt-get install python-certbot-apache

以下のコマンドを実行して、Let's Encrypt SSLを発行してもらいます。

# sudo certbot --apache -d softpedia.xyz

オプション2を選択してリンクをhttpsにリダイレクトし、SSLのバーチャルホスト設定を更新します。apacheサーバを再起動します。

# sudo systemctl start apache2

あなたのウェブサイトにアクセスするには、https://your_domain_name.tld

これで完了です。Alibaba Cloud ECSサーバーにMastodonをインストールすることに成功しました。データベースのデフォルトパスワードを変更し、管理者アカウントを設定することで安全にインストールできます。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ