マストドンを3分でインストール する方法 (事前準備含まず)

  • 2
    いいね
  • 0
    コメント

経緯

マストドンのホスティングサービス、mastohostに関して気になっていたので一括インストールを試してみました。サブドメーンでのインストールになります。CloudFlare、SparkPost依存なため大規模なサイト向けではないです。

実行結果

マストドンを3分でインストール
https://www.youtube.com/watch?v=SQ6z0YmZpWg

対象の方

  • 基本的なシェール(bashなど)、エディターなどの使い方の理解可能な人(コメントでなんでも聞いてもらっても大丈夫です) (Comments/Questions can also be in English.)

環境

# debian8 (OSX/VirtualBox使用)
% uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 GNU/Linux
# 普段zsh使用していますが、ここはbash上でしか試していないです。

利用サービス

事前準備

  • debianもVirtualBoxもない場合は、以下からVirtualBoxをダウンロードしインストール(詳細は割愛)
  • debianが手元にない場合、以下からダウンロードしインストール(詳細は割愛)
  • debianにログインする(ssh経由と想定)
  • sudoがインストールされていない場合は
    • su - (rootパスワードを入力)
    • apt-get install sudo
    • visudo (編集画面を立ち上げ)
      • ログイン名 ALL=(ALL:ALL) ALLを追加(Ctrl+xで終了、保存するかは聞かれる)
    • exit(一般ユーザに戻る)
  • curl、証明書などインストールされていない場合は以下を実行

    • sudo apt-get install apt-transport-https ca-certificates curl
    • curl --version
  • dockerインストールされていない場合は以下を実行

    • curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    • echo deb https://download.docker.com/linux/debian jessie stable | sudo tee -a /etc/apt/sources.list
    • sudo apt-get update
    • sudo apt-get install docker-ce
    • docker -v
  • dockerサーバに接続できない場合は、グループに入っていない可能性あるので

    • sudo usermod -aG docker 自分のユーザID
    • 一旦ログアウトし、再度ログインし直す
    • docker psで接続エラーにならないことを確認
  • docker-composeインストールされていない場合は以下を実行

    • curl -sL https://github.com/docker/compose/releases/download/1.13.0-rc1/docker-compose-Linux-x86_64 > docker-compose && chmod +x docker-compose && sudo mv docker-compose /usr/local/bin/
    • docker-compose -v
  • jqがインストールされていない場合は以下を実行 (APIの結果JSONを解析)

    • curl -sL https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 > jq && chmod +x jq && sudo mv jq /usr/local/bin
    • jq --version
  • 共通のコンテナを取得

    • docker pull gargron/mastodon
    • docker pull postgres:alpine
    • docker pull redis:alpine
    • docker pull syou/alpine-nginx # 個人のコンテナ、軽量nginx (ソースDockerfile)

マストドンのインストールはここから

  • 実行し方: bash install-mstdn.sh subdomain.main-domain.tld (サーバIP、各APIキーを入力後)
  • 雑に書いている部分結構あるのでご了承くださいませ。ご指摘いただければと思います。
install-mstdn.sh
#!/bin/bash

# 以下編集してください
SERVER_IP=1.2.3.4                                # サーバのグロバルIPアドレス (1.2.3.4)

SPARKPOST_APIKEY=ffffffffffffffffffffffffffffffffffffffff #フル権限 - https://app.sparkpost.com/account/credentials
SPARKPOST_SENDKEY=$SPARKPOST_APIKEY             # フルアクセス当てたくない場合に個別に指定、インスタンスの中にコピーされます

CF_EMAIL="username@domain.tld"                  # CloudFlareのログインメールアドレス
CF_AUTH="cffffffffffffffffffffffffffffffffffff" # https://www.cloudflare.com/a/account/my-account - アカウントごと
CF_ZONE="ffffffffffffffffffffffffffffffff"      # https://www.cloudflare.com/a/overview/$MAIN_DOMAIN - ドメーンごと

SUB_DOMAIN=$1                                    # 利用したいドメーン名(サブドメーンsub.main.com)、通常は第ーパラメータを使用するため基本は編集不要
MAIN_DOMAIN=$(echo $SUB_DOMAIN | cut -d"." -f2-) # メインドメーン、基本は編集不要 (main.com)
# ----- ここまで ------


# ---- 各プログラム利用可能かチェック -------
set -e # エラーあれば即終了
uname -a
docker -v
docker-compose -v
jq --version

# ------ MASTODON APP -------

# 新しいSENDING_DOMAINSと追加し、DKIMを発行
SPARKPOST_RESULT=$(curl -s -H "Content-Type: application/json" -H "Authorization: $SPARKPOST_APIKEY" -X POST -d '{"domain":"'$SUB_DOMAIN'","generate_dkim":true,"shared_with_subaccounts":false}"' "https://api.sparkpost.com/api/v1/sending-domains")
# 確認はこちら、https://app.sparkpost.com/account/sending-domains

# DKIMを収納
DKIM_KEY=$(echo $SPARKPOST_RESULT|echo $SPARKPOST_RESULT|jq -r '.results.dkim.selector')
DKIM_VALUE=$(echo $SPARKPOST_RESULT|echo $SPARKPOST_RESULT|jq -r '.results.dkim.public')

# A レコードを追加
CF_RES1=$(curl -s -H "X-Auth-Email: $CF_EMAIL" -H "X-Auth-Key: $CF_AUTH" -H "Content-Type: application/json" -X POST -d '{"type":"A","proxied":true,"name":"'$SUB_DOMAIN'","content":"'$SERVER_IP'"}' "https://api.cloudflare.com/client/v4/zones/$CF_ZONE/dns_records")

# TXT レコードにDKIMを追加
CF_RES2=$(curl -s -H "X-Auth-Email: $CF_EMAIL" -H "X-Auth-Key: $CF_AUTH" -H "Content-Type: application/json" -X POST -d '{"type":"TXT","name":"'$DKIM_KEY'._domainkey.'$SUB_DOMAIN'","content":"v=DKIM1; k=rsa; h=sha256; p='$DKIM_VALUE'"}' "https://api.cloudflare.com/client/v4/zones/$CF_ZONE/dns_records")

# 結果などは無視していますが、確認したい方は
# echo $DKIM_KEY, $DKIM_VALUE, $CF_RES1, $CF_RES2

mkdir -p $SUB_DOMAIN && cd $SUB_DOMAIN

# 環境ファイルを作成
cat <<EOF>.env.production
REDIS_HOST=redis
REDIS_PORT=6379
# REDIS_DB=0
DB_HOST=db
DB_USER=postgres
DB_NAME=postgres
DB_PASS=
DB_PORT=5432

LOCAL_DOMAIN=$SUB_DOMAIN
LOCAL_HTTPS=true

PAPERCLIP_SECRET=`docker run --rm gargron/mastodon rake secret`
SECRET_KEY_BASE=`docker run --rm gargron/mastodon rake secret`
OTP_SECRET=`docker run --rm gargron/mastodon rake secret`
# 毎回--rm使わずに後で消せば早くなると思います、その分コンテナの名前を持つ必要あり

SMTP_SERVER=smtp.sparkpostmail.com
SMTP_PORT=587
SMTP_LOGIN=SMTP_Injection
SMTP_PASSWORD=$SPARKPOST_SENDKEY
SMTP_FROM_ADDRESS=root@$SUB_DOMAIN

STREAMING_API_BASE_URL=//$SUB_DOMAIN/api/v1/streaming
STREAMING_CLUSTER_NUM=1
EOF

# docker-compose.ymlをダウンロードし、コメント部分をアンコメント
curl -s -O https://raw.githubusercontent.com/tootsuite/mastodon/master/docker-compose.yml
sed -i 's/# / /g' docker-compose.yml

# データベースのスキーマなどを作成、アセットなどをコンパイル
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile
# precompile超遅い、2分ほど時間かかる

# コンテナを立ち上げる、これ立ち上がればで3000にアクセス可能ですが、HTTPSに強制リダイレクトされるためまだ使用不可
docker-compose up -d
# ログの確認したい方は
# docker-compose logs -f #(ctrl+cで終了)

# SparkPostのDKIM 確認をここでする。DNS普及のため、わざと時間を空けています。
DKIM_VERIFY=$(curl -s -H "Content-Type: application/json" -H "Authorization: $SPARKPOST_APIKEY" -X POST -d '{"dkim_verify":true}"' "https://api.sparkpost.com/api/v1/sending-domains/$SUB_DOMAIN/verify")

# ------------- NGINX ----------------
mkdir -p nginx

# オレオレ証明書を準備、実際の証明書はCloudFlareが提供するため、特に問題ない
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx/$SUB_DOMAIN.key -out nginx/$SUB_DOMAIN.crt \
  -subj "/C=GB/ST=Tokyo/L=Tokyo/O=Global Security/OU=IT Department/CN=$SUB_DOMAIN"

cat <<'EOF'>nginx/nginx.conf
user  nginx;
worker_processes  1; # 適当にあげてください
error_log  /var/log/nginx/error.log warn;
pid        /var/tmp/nginx.pid;
worker_rlimit_nofile 65535;
events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}
http {
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    tcp_nopush     on;
    tcp_nodelay     on;
    server_tokens   off;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;
    proxy_buffering off;
    proxy_http_version 1.1;

    server {
        listen 80;
        listen 443 ssl;
        server_name $SUB_DOMAIN;
        ssl_certificate /etc/nginx/$SUB_DOMAIN.crt;
        ssl_certificate_key /etc/nginx/$SUB_DOMAIN.key;
        location / {
            proxy_pass http://172.17.0.1:3000;
        }
        location /api/v1/streaming {
            proxy_pass http://172.17.0.1:4000;
        }
    }
}
EOF
sed -i 's/\$SUB_DOMAIN/'$SUB_DOMAIN'/g' nginx/nginx.conf

# nginxを立ち上げ。ポート80番と443番利用されるため空いている必要あります。80番なくても動くかもしれません(未確認)
docker run -d --rm -p 80:80 -p 443:443 --add-host $SUB_DOMAIN:172.17.0.1 -v `pwd`/nginx:/etc/nginx syou/alpine-nginx

# -------- INFO -----------

# ここで初めてアクセスできるようになる
echo https://$SUB_DOMAIN/

# 管理者に昇格
echo "以下のコマンドの末にユーザIDを指定して実行すれば管理者に昇格される"
echo docker-compose run --rm web rails mastodon:make_admin USERNAME=

以上、指摘、補足などがあればコメントでお願いします。