Help us understand the problem. What is going on with this article?

AWS上にMastodon(v3.1.1)を構築した時にハマったこと(非docker)

はじめに

Mastodon(v3.1.1)をAWS上に構築しました。
(非dockerです)
その際にハマったこと、公式手順に追加した手順を記載します。

サーバー構成

  • AWS

今回は社内用の簡易的なものなので、ドメインとELB以外は無料枠内で収まる構成にしました。

Untitled Diagram (2).png

EC2: Ubuntu 18.04

手順とポイント

基本的な手順自体はMastodon公式に則っています。
Installing from source - Mastodon documentation

以下の手順でつまずきました。

precompileが終わらないのでスワップ確保

t2.microインスタンスだとメモリスペックが足りないようで、
スワップ領域を確保してやる必要がありました。
(素のままだとprecompileが終わりませんでした。。)

$ sudo fallocate -l 4G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

AWSは事前に設定しておくとスムーズかも

$ RAILS_ENV=production bundle exec rake mastodon:setup

mastdon:setupで.env.productionを生成してくれます。

.env.productionの設定は後付けでも問題ないのですが、
ツールに任せてしまった方が必要なものだけ作れるので、
事前にAWSの設定は全て完了しておくのが良かったかなと思いました。

そうすると以下のCreate a configuration fileがスムーズかと思います。

This will:
・Create a configuration file
・Run asset precompilation
・Create the database schema

nginxの設定ファイルとポート

手順にはnginxの設定ファイルはMastodonのリポジトリからコピーして使ってね、
という記載があります。

Copy the configuration template for nginx from the Mastodon directory:

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

今回は、ELB(443)→nginx(80)→mastodon(3000)という構成なので、
コピーしたファイルを編集する必要がありました。

ちなみに、ファイル名はmastodonとなってますが、
今回はdefaultを上書きする形で対応しました。

コピー元のファイルにはhttp(80)とhttps(443)の設定が記載されていますが、
今回の構成の場合、実際にはhttp(80)のみで動かす必要がありました。
(ドメインにアクセスしてもHTTP 403エラーとなってハマりました...)

編集後のファイルです。

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

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

server {
  listen 80;
  listen [::]:80;
  server_name yourdomain.com;

  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";
    add_header Strict-Transport-Security "max-age=31536000";
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    add_header Strict-Transport-Security "max-age=31536000";
    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 on;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_cache CACHE;
    proxy_cache_valid 200 7d;
    proxy_cache_valid 410 24h;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cached $upstream_cache_status;
    add_header Strict-Transport-Security "max-age=31536000";

    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証明書の設定は不要でした。

Acquiring a SSL certificate

おわりに

これで無事にMastodonが構築できました。

参考にさせていただいた記事

AWSでMastodonインスタンスを作るまで。自分まとめ - Qiita

マストドンAWS構築チュートリアル完全版|初心者から大規模運用まで

shikumiya_hata
シクミヤのコーポレートエンジニアです。
https://shikumiya.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした