IT

Docker+MacでMastodonインスタンスをローカルで構築する

こんにちは,しまさん(@nitkcdadon)です.

先日,TwitterのUserStream APIの終了もあって再びMastodonに注目が集まっていました.

私はCentOS7でのMastodonのインスタンス構築は昨年やりましたがMacでしたことはなかったので今回やってみようと思います.

MastodonのDocumentを読めばわかるのですがDockerで構築するのは開発者にとってはあまり勧められません.

しかし,自分の環境に直にインストールするのは失敗したときにかなり面倒です.

なのでまずはこのDockerを用いることでMastodonがどんな構造でどのように動くのか手を動かして試してみてください.

Docker for Macのインストールから紹介していきます.

今回の環境

・Mac OS High Sierra 10.13.5

・Docker for Mac : Version 18.06.1-ce-mac73

・nginx version: nginx/1.15.3

Docker for Mac のインストール

まずはdockerのサイトへ行き,「Downliad from Docker Store」をクリックしてください.

「Please Login To Download」を押しましょう.

アカウントがないので「Create Account」でアカウント作成をします.

必要事項の記入を行い,アカウントを作成してください.

作成したらメールの確認がありますのでメールの確認をし,登録を完了させてください.

そしたらもう一度「Log in to Docker」のページに行き先程作成したアカウントでログインしてください.

そうすると「Get Docker」が表示されるのでdmgファイルをダウンロードしましょう.

ダウンロードしたらdmgファイルをマウントし,Docker.appをApplicatonsに入れてください.

そうしたら実行しましょう.

注意やアクセス許可を求められるのでOpen,OKを押して,許可に関しては自分のMacのパスワードを入力してください.

するとMacの画面の上にクジラさんが追加されていると思います.

それをクリックして,先程作成したアカウントを使って「Sign in / Create Docker ID」でログインしましょう.

では実際にインストールできたので,ターミナルを使ってバージョンの確認をします.

MacBook-Pro:~ $docker -v
Docker version 18.06.1-ce, build e68fc7a

ふむ,どうやら完璧です.

CentOS7ではdocker-compose等の準備もいるのですがそう考えると楽ですね.

Mastodonとは

Mastodonとはオイゲン・ロッコが開発したActivityPubやOstatusといったオープンウェブプロトコルをベースとするSNSの一種です.

既存のSNSであるTwitterやFacebookは一つのサーバー(とみなせるもの)に対してすべてのユーザーが所属する中央集権型と呼ばれる構造になっています.

つまり,サービスの変更があってそれがユーザーにとって気に入らないからその変更は受けないということはできません.

それに対してMastodonは複数のサーバーで構成され,個々のサーバーは独立しています(サーバー間は必ずしも繋がる必要はない).

個々のサーバーは独立しているため,ユーザーは自分に合ったサーバーを選んで所属できます.

Mastodonのインストール

mkdir Mastodon && cd Mastodon

まずはMac上で適当なディレクトリを作成しておいてください.

MastodonのGithubのページに行き,「Clone or download」を押してCloneするかzipをダウンロードするか選択してください.

zipをダウンロードした場合は用意したディレクトリに保存し,解凍をお願いします.

Cloneする場合は,

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

を実行してください.

終わったらlsコマンドでちゃんとダウンロードされているか確認してください.

Mastodonの構築

.env.productionの編集

まずは.env.productionを作成していきます.

cd mastodon/
#.env.production.sampleをコピーします
cp .env.production.sample .env.production

次にdocker-compose.ymlの編集をします.


この編集をすることでDockerのコンテナを落としても設定が残ります.

vim docker-compose.yml

#docker-compose.yml

   db:
     restart: always
     image: postgres:9.6-alpine
     networks:
       - internal_network
 ### Uncomment to enable DB persistance
 #    volumes:
 #      - ./postgres:/var/lib/postgresql/data
 ############コメント削除######################
      volumes:
      - ./postgres:/var/lib/postgresql/data
 ############################################

   redis:
     restart: always
     image: redis:4.0-alpine
     networks:
 	       - internal_network
### Uncomment to enable REDIS persistance
#    volumes:
#      - ./redis:/data
############コメント削除######################
    volumes:
      - ./redis:/data
############################################

次にアンコメントしたのでその対象のフォルダを作成します.

mkdir postgres
mkdir redis

とりあえずここまできたら,MastodonのDockerイメージを作成しちゃいましょう.

まあまあの時間がかかります.ソシャゲで時間を潰しましょう.

docker-compose build

では作成して放置していた.env.productionを編集します.

そのために必要な準備をします.

#このコマンドを2回実行し,その結果(文字列)をメモしておいてください.
docker-compose run --rm web rake secret


では.env.productionを設定していきます.

vim .env.production

#.env.productionの編集

20:LOCAL_DOMAIN=localhost:3000

36:SECRET_KEY_BASE=#先程メモした文字列1つ目
37:OTP_SECRET=#先程メモした文字列2つ目


昔はLOCAL_HTTPSの設定ができたので,LOCAL_HTTPS=falseとすれば簡単に構築できたのですが今後なくなるようなのであとでhttpsにしたいと思います.

Databaseを作成

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

 

アセットの作成

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

 

Mastodonスタート!!!!!!


もろもろの用意が完了したのでMastodonを立ち上げましょう.

docker-compose up


次はnginxの設定を行っていきます.まずはインストールから.

brew install nginx
#nginx.confの編集 vim /usr/local/etc/nginx/nginx.conf 34:include /usr/local/etc/nginx/mastodon.conf; #追加


そしたらGithubにあるnginxの設定を少し変えてコピペします. 少々変更する部分があるので注意してください.

vim /usr/local/etc/nginx/mastodon.conf

#mastodon.confの編集



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

server {
  listen 80;
  listen [::]:80;
  server_name localhost:3000;
  ##rootのパスは自分がmastodonをDLした場所##
  root /自分がDLした場所/mastodon/live/public;
  # 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 localhost:3000;

  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/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#########################################

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;
  ##rootのパスは自分がmastodonをDLした場所##
  root /自分がDLした場所/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;
}

ドメインを持っている方はletsencryptで証明書を発行してもらってもいいのですが,とりあえずMastodonを動かそうとしているのでオレオレ認証局を使うことにします.

証明書発行はmasOSでオレオレ認証局を立てて証明書を発行するを参考にしてください.

ただし,このサイトはexsample.comで発行しているのでlocalhost:3000に変更してください.

私はdemoCAをMastodonディレクトリ以下に作成しました.

全てのファイルをdemoCAに入れています.

では先程のmastodon.confをもう一度変更します.

# ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_certificate     /自分が作成した場所/localhost:3000.crt;
  ssl_certificate_key /自分が作成した場所/localhost:3000.key;


ではNginxを起動させましょう.

sudo nginx

#停止させるには
sudo nginx -s stop


ではlocalhostにアクセスしてみましょう.


よっしゃ〜〜〜〜!!!!!動いたぞ〜〜〜〜〜〜!!!!!

Mastodon(Docker)のコマンド


#Mastodonの停止
docker-compose stop

#Mastodonの再起動
docker-compose start

#コンテナ破壊
docker-compose down

#コンテナ破壊から復帰する手順
docker-compose build
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile
docker-compose up -d

 

Mastodonのアカウントのもろもろ設定

これまでの手順でMastodonは動きましたが参加できてませんね.

なのでアカウントを作成し,登録していきましょう.

まずは枠の部分を適当に入力してください.

メールアドレスも適当でいいですよ.

入力したら「登録する」を押してください.

メールアドレスによって認証しています.

しかし,先程適当にメールアドレスを打ったので実在しないですよね.

でも問題ありません.私達がこのMastodonインスタンスの管理者です.

いくらでも認証できます.

docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=メールアドレス
docker-compose run --rm web rails mastodon:make_admin USERNAME=ユーザー名


では先程の画面に戻り,ログインをしてください.

無事ログインできました!!!

Tootもできますね.

さいごに

今回はローカルにMastodonインスタンスを構築するまでを紹介しました.

本当に運用したいならちゃんとドメイン用意して,証明書も取りましょう.

何回失敗してもコンテナ破壊すればいいだけなので気軽に構築できますので是非やってみてください.

参考

DockerでMastodonをローカルで動かしてみた! ので、その方法をご紹介。

ABOUT ME
しまさん
てくてくぷれいす運営者のしまさんです. 高専→大学編入してから行動的な学生ブロガー? / 自身の変化を求めてブログを6月から開始 / グレープフルーツと本が好き / Distributed SNSやSecurity,プログラミングやVR等のIT系や自身の編入体験談や高専のこと,大学生活を書いてます(たまに小ネタ) / Progateで勉強中