大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

Mastodon with IIS (Mastodon編)

というわけでやりました、Mastodon インスタンス構築。"サーバを自分で建てられる" と聞いてやらないわけがない性格なので仕方ないね。 今回はMastodon 本体の構築。と言っても、ほとんど公式ドキュメント (Production guide)に準拠します。

下記手順については、記事執筆時点の公式ドキュメントに従ったものです。公式ドキュメントは頻繁に更新されるため、最新の手順に従ってください。

注意事項など

  • サーバの構築などは学習目的で行っています。間違いや改善すべき点等含んでいる前提でご覧ください。
  • クレジットカードが無い(作るのも現状不可)などの理由で、クラウドの利用はそもそも選択肢にありません。
  • 今回は非Docker環境で構築します。そもそもDocker についての知識が乏しいことなどが理由です。
  • 構築先の環境等の詳細については、構築済みインスタンス "どんぶり大破" の about/more ページに記載しています。

必要パッケージのインストール

Production guide の "General dependencies" "Redis" "Postgres" に従ってインストールしていきます。

General dependencies

Nginx は apt-get install の中にありませんが、OSに入ってないのでここで入れてしまいました。 [sourcecode language="bash"] sudo apt install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl nginx curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -

sudo apt install nodejs

sudo npm install -g yarn [/sourcecode]

Redis

そのまんまインストール [sourcecode language="bash"] sudo apt install redis-server redis-tools [/sourcecode]

Postgres

インストール

[sourcecode language="bash"] sudo apt install postgresql postgresql-contrib [/sourcecode]

Mastodon 用ユーザーの作成

ユーザーを Postgresql によって作成済みのユーザー "postgres" に切り替えて Postgresql のコンソールへログインし、データベース管理の新規ユーザー "mastodon" を作成する。 [sourcecode language="bash"] sudo su - postgres psql

↓新規ユーザー "mastodon" をデータベース作成権限を与えて作成

CREATE USER mastodon CREATEDB;

Postgresql のコンソールを終了

\q [/sourcecode]

その他

上記の "\q" の下に "Under Ubuntu 16.04, ..." と書かれているが、Ubuntu 16.04 未満の場合必要な操作なので、Ubuntu Server 16.04 を用いている今回は関係無し。

新規 Linux ユーザーの作成

Mastodon は専用のユーザーアカウントで実行する関係で、新規のユーザー "mastodon" を作成する。参考 [sourcecode language="bash"] sudo adduser mastodon

パスワード入力後、色々聞かれるが何も入力せず4回ほどEnter。最後 "これで良いか" という問いは "y" と入力しEnter でユーザーの作成を完了する。

gpasswd -a mastodon sudo [/sourcecode] ユーザーの作成と sudo 権限の付与が完了後、sudo su - mastodon で作成したアカウントに切り替える。 これ以降の作業は、このアカウントで行う。

Rbenv

Ruby のインストール / 管理を行う rbenv の準備 "Production guide" にある通り、rbenv の公式ドキュメントにある方法でインストールを行う。GCC などが必要になるので、"まあいいや" とか言いつつ apt install build-essential をしてしまった。 rbenv のインストールが完了後、 [sourcecode language="bash"] rbenv install 2.4.1 rbenv global 2.4.1 [/sourcecode] で Ruby ver.2.4.1 のインストールとグローバルバージョンの設定を行った。 Ruby のインストールの際、必要なパッケージが不足していてビルドがコケたりもした。コンソール上のエラーメッセージ内に不足しているパッケージが表示される(libreadline-devなど)ので、それに従い追加でインストールする。

Mastodon 本体の引き込みと追加インストール

Git を利用してMastodon 本体をサーバー上に引き込み、必要パッケージの追加インストールを行う。

引き込み

git clone で、そのまま引き込む。場所は特に変える理由もなかったので、公式ドキュメントに従った。 [sourcecode language="bash"] cd ~ # /home/mastodon git clone https://github.com/tootsuite/mastodon.git live # /home/mastodon/live/ 以下に clone cd live

master(開発版)はバグが入り込みやすく不安定なため、安定版のバージョンのコードを引き込む

git checkout $(git tag | tail -n 1) [/sourcecode]

追加パッケージのインストール

ここで "gem コマンドがインストールされていない" などのエラーが出る場合、Ruby のインストールに失敗している可能性があるので rbenv からやり直し。 [sourcecode language="bash"] gem install bundler bundle install --deployment --without development test yarn install --pure-lockfile [/sourcecode]

Mastodon の設定

Mastodon の全体的な設定を行う。

設定ファイルの作成

既存の .env.production.sample ファイルを .env.production としてコピー。 [sourcecode language="bash"] cp .env.production.sample .env.production [/sourcecode]

設定

デフォルトの設定からの変更のみ列挙、未変更の箇所は未記載。DBのパスワードは、公式ドキュメントにある通り空欄のままにする。 [sourcecode] REDIS_HOST=localhost DB_HOST=/var/run/postgresql DB_USER=mastodon DB_NAME=mastodon_production

Mastodonで利用するドメイン

LOCAL_DOMAIN=mstdn.taiha.net

~/live/ 以下で rake secret コマンドを1回ずつ実行して、生成された乱数を入れる。なので計3回実行することになる。

PAPERCLIP_SECRET=(乱数) SECRET_KEY_BASE=(乱数) OTP_SECRET=(乱数)

Mastodon サイトアクセス時に、既定で表示に使われる言語

DEFAULT_LOCALE=ja

アカウントの確認用に送信するE-Mail設定。

今回は Mailgunを試したものの無料アカウントの制限が厳しかったため、新規に取得した Gmail のアカウントを利用することにした。

SMTP_SERVER=smtp.gmail.com SMTP_PORT=587 SMTP_LOGIN=(Gmail アカウントのメールアドレス 例: hogehoge@gmail.com) SMTP_PASSWORD=(Gmail アカウントのパスワード) [/sourcecode]

その他

ユーザーのアイコンやヘッダー、アップロードされる画像や動画の保存先も変更したかったので "PAPERCLIP_ROOT_PATH" も設定してみたものの、メディアが保存はされるのにそこから読み出せないというトラブルが発生したため、デフォルトの保存先である "~/live/public/system" に対して、マウントしたドライブからシンボリックリンクを設置した。ドライブの当該フォルダの所有者は "mastodon" ユーザーに変更済み。 [sourcecode language="bash"] cd ~/live/public mv ./system ./system.bak # 一旦名前を変える ln -s /mnt/mstdn_media/system system [/sourcecode]

Mastodon のセットアップ

データベースとCSSJavaScriptの準備。

データベースの作成

データベース及びテーブルの作成。 [sourcecode language="bash"] RAILS_ENV=production bundle exec rails db:setup [/sourcecode]

CSSJavaScript の precompile

[sourcecode language="bash"] RAILS_ENV=production bundle exec rails assets:precompile [/sourcecode]

Systemd サービスの作成

Mastodon の各プロセスを、systemd のサービスとして登録する。

  • /etc/systemd/system/mastodon-web.service
  • /etc/systemd/system/mastodon-sidekiq.service
  • /etc/systemd/system/mastodon-streaming.service

上記の3つを、Production guide からそれぞれそのままコピーして設置。 そのうえで、OS起動時の自動開始有効化と手動での開始を行う。 [sourcecode language="bash"]

3つのサービスの自動開始有効化

sudo systemctl enable /etc/systemd/system/mastodon-*.service

手動開始

sudo systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service [/sourcecode]

Nginx の設定

今までに設定した Mastodon にアクセスできるように、Nginx のプロキシ等の設定を行う。 今回 Mastodon インスタンスのサーバー上で一緒に Nginx が動作するが、その上位でさらに別のサーバー上にある IIS を経由してクライアントからのアクセスを行えるようにするため、Producion guide にあるNginx の設定例から以下の部分を変更した。 Let's Encrypt を利用した暗号化 (HTTPS) は上位の IIS で行うため、関連する設定は全て無効化。 server_name には、Mastodonで使用するドメイン名を設定する。 [sourcecode highlight="1-8,11-15,17-21,23-25"]

server {

listen 80;

listen [::]:80;

server_name example.com;

# Useful for Let's Encrypt

location /.well-known/acme-challenge/ { allow all; }

location / { return 301 https://$host$request_uri; }

}

server {

listen 443 ssl;

listen [::]:443 ssl;

listen 80; listen [::]:80; server_name mstdn.taiha.net;

ssl_protocols TLSv1.2;

ssl_ciphers EECDH+AESGCM:EECDH+AES;

ssl_ecdh_curve prime256v1;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/example.com/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 { 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; } [/sourcecode]

設定を記述し終わったら、/etc/nginx/sites-available/mastodon として保存し、/etc/nginx/sites-enabled/default を削除の上 /etc/nginx/sites-enabled/mastodon としてシンボリックリンクを作成する。 [sourcecode language="bash"] cd /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/mastodon mastodon [/sourcecode] その後、Nginx サービスを再起動する。 [sourcecode language="bash"] sudo service nginx restart [/sourcecode]


以上で Mastodon 側の設定は終了。あとは IIS 側の設定に続きますが、疲れたので後で書きます...

2017/04/26追記: 書きました ==> Mastodon with IIS (IIS編)