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

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

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-install-mastodon-using-docker-on-alibaba-cloud-ecs_595049)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#前提条件
- Alibaba Cloud [Elastic Compute Service (ECS)](https://www.alibabacloud.com/ja/product/ecs)を有効にし、有効な支払い方法を確認する必要があります。新規ユーザーの場合は、新規アカウントに[300ドル～1200ドル相当の](https://www.alibabacloud.com/ja/referral?referralCode=ffxt3q)Alibaba Cloudクレジットを獲得できます。ECSインスタンスのセットアップ方法がわからない場合は、[こちらのチュートリアル](https://www.alibabacloud.com/blog/3-ways-to-set-up-a-linux-server-on-alibaba-cloud_572384?spm=a2c65.11461447.0.0.1a0a6afb0TUJ83)または[クイックスタートガイド](https://www.alibabacloud.com/help/ja/doc-detail/25422.htm)を参照してください。ECSインスタンスは、少なくとも2GBのRAMと2コアプロセッサを搭載している必要があります。
- Alibaba Cloudから登録されたドメイン名。すでにAlibaba Cloudまたは他のホストからドメインを登録している場合は、そのドメインネームサーバーレコードを更新することができます。
- [ドメイン名](https://www.alibabacloud.com/ja/domain)は、あなたの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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d4b85b62-15c0-a577-cf2a-8b47f93fad53.png)


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

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