LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-28

経緯

マストドンのホスティングサービス、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 nginx:alpine

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

  • 実行し方: 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
cat <<EOF>>docker-compose.yml
  nginx:
    restart: always
    image: nginx:alpine
    extra_hosts:
      - "$SUB_DOMAIN:172.17.0.1"
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
    volumes:
      - ./nginx:/etc/nginx
EOF

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

# 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

# コンテナを全部立ち上げる
docker-compose up -d

# ログの確認したい方は
# docker-compose logs -f #(ctrl+cで終了)

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

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

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

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6