CreateInstanceOnHeroku

syui edited this page Apr 24, 2017 · 28 revisions

Heroku Buttonを使う手順、または、Heroku CLIを使う手順に従ってデプロイして、必要なら追加の設定もしてください。現在のところStreaming APIは動作しません。下記のStreaming APIの有効化の項のように2つめのアプリケーションを作成することで対応できます。

Heroku Buttonを使う

デプロイ

https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Heroku-guide.md のHeroku Buttonを押し、

  • App Nameを希望のアプリ名に
  • S3_ENABLEDfalse
  • LOCAL_DOMAIN<アプリ名>.herokuapp.com

変更して、Deployボタンを押す。

Manage appボタンからダッシュボードを開き、Dyno formationからConfigure Dynosをたどり、worker dynoをONにする。

Manage appボタンからダッシュボードを開き、Installed add-onsからConfigure add-onsをたどり、Add-ons欄の検索窓にHeroku SchedulerとタイプしてProvisionし、リストに追加されたHeroku Schedulerをクリックし、開いたHeroku Schedulerのダッシュボードで、Add new jobをクリックし、rake mastodon:dailyをDailyでSaveする。

ユーザー登録

デプロイできたら、Viewボタンを押してアプリケーションを開き、自分のユーザー名、メールアドレス、パスワードを登録する。

メールアドレスの確認。(追加の設定にあるメールの設定作業をしておけば、メールを受信して確認することもできます。)

heroku run rails mastodon:confirm_email USER_EMAIL=<メールアドレス> -a <アプリ名>

自分を管理者にする

heroku run rails mastodon:make_admin USERNAME=<ユーザー名> -a <アプリ名>

ここまででMastodonを使ってみることができるはずです。アップロードされたファイルはDynoの再起動で消えちゃうので注意。

Heroku CLIを使う

Herokuアプリの準備

APP_NAME=<希望のアプリ名>
heroku create $APP_NAME
heroku buildpacks:add heroku/nodejs -a $APP_NAME
heroku buildpacks:add heroku/ruby -a $APP_NAME
heroku addons:create heroku-postgresql -a $APP_NAME
heroku addons:create heroku-redis -a $APP_NAME

PapertrailかLogentriesなども付けておくとよい。

デプロイ

コードをデプロイする。例えば、

git clone https://github.com/tootsuite/mastodon.git
cd mastodon
heroku git:remote -a $APP_NAME
git push heroku master

データベースのマイグレーション

heroku run rails db:migrate -a $APP_NAME
heroku run rails db:seed -a $APP_NAME

アプリケーションの設定

heroku config:set HEROKU=true -a $APP_NAME
heroku config:set LOCAL_DOMAIN=$APP_NAME.herokuapp.com -a $APP_NAME
heroku config:set PAPERCLIP_SECRET=`heroku run rails secret -a $APP_NAME` -a $APP_NAME
heroku config:set SECRET_KEY_BASE=`heroku run rails secret -a $APP_NAME` -a $APP_NAME
heroku config:set OTP_SECRET=`heroku run rails secret -a $APP_NAME` -a $APP_NAME

日次のタスクの登録

heroku addons:create scheduler -a $APP_NAME
heroku addons:open scheduler -a $APP_NAME

開いたHeroku Schedulerのダッシュボードで、Add new jobをクリックし、rake mastodon:dailyをDailyでSaveする。

  • シークレットのもっと良い取得方法

ユーザー登録

Dynoをスケールする

heroku ps:scale web=1 worker=1 -a $APP_NAME

http://$APP_NAME.herokuapp.comから自分のユーザー名、メールアドレス、パスワードを登録する

メールアドレスの確認。(追加の設定にあるメールの設定作業をしておけば、メールを受信して確認することもできます。)

heroku run rails mastodon:confirm_email USER_EMAIL=<メールアドレス> -a $APP_NAME

自分を管理者にする

heroku run rails mastodon:make_admin USERNAME=<ユーザー名> -a $APP_NAME

ここまででMastodonを使ってみることができるはずです。アップロードされたファイルはDynoの再起動で消えちゃうので注意。

うまくいかない時は

アプリケーションのログを見ながらアクセスしてみる

heroku logs -t -a $APP_NAME

追加の設定

ファイルストアの設定

Mastodonはデフォルトではdynoのファイルシステムにアイコンやメディアなどのファイルを格納します。これらのファイルは1日に1度のdynoの再起動の際に消えてしまいます。

Amazon S3のバケットを作成し、そこにファイルを格納するようにします。著者はAWSについて詳しくないので下記の記述には誤りや危険な設定が含まれる可能性があります。気づいたことがあればお知らせください。

バケットの作成

https://aws.amazon.com/ からログインし、AWS Management Consoleに進み、AWS servicesからS3を検索し、クリックして、

  • Create bucketをクリック、
  • bucket nameを設定 (ファイルのダウンロード元のホスト名の一部として使われます)、
  • regionを設定、
  • versioning、logging、tagsを適宜設定、
  • permissionはデフォルト (Ownerのみ読み書き)、

して作成する。

IAMユーザーの作成

まずIAMユーザーに付与する権限を定義します。

https://aws.amazon.com/ からログインし、AWS Management Consoleに進み、AWS servicesからIAMを検索し、クリックして、

  • Policiesをクリック、
  • Create policyをクリック、
  • Create Your Own Policyをクリック、
  • Policy NameとDescriptionを適宜設定、Policy Documentに下記をペースト、
  • Create Policyをクリック
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        }
    ]
}

次にIAMユーザーを作成します。

https://aws.amazon.com/ からログインし、AWS Management Consoleに進み、AWS servicesからIAMを検索し、クリックして、

  • Usersをクリック、
  • Add userをクリック、
  • User nameを設定、
  • Programmatic accessを選択、
  • Attach existing policies directlyを選択、
  • 上記で作成したポリシーを検索して選択、
  • Reviewをクリック、
  • Create userをクリック

Access key IDとSecret access keyが表示されている状態で次に進みます。

アプリケーションの設定

Config varを設定します。S3_HOSTNAMEはリージョンによって異なるかもしれません。下記の例はus-east-1のものです。

$ heroku config:set S3_ENABLED=true -a $APP_NAME
$ heroku config:set S3_BUCKET=<バケット名> -a $APP_NAME
$ heroku config:set AWS_ACCESS_KEY_ID=<作成したIAMユーザーのものをペースト> -a $APP_NAME
$ heroku config:set AWS_SECRET_ACCESS_KEY=<作成したIAMユーザーのものをペースト> -a $APP_NAME
$ heroku config:set S3_REGION=<us-east-1などのリージョン名> -a $APP_NAME
$ heroku config:set S3_PROTOCOL=https -a $APP_NAME
$ heroku config:set S3_HOSTNAME=s3.amazonaws.com -a $APP_NAME

ここまででアイコンやメディアファイルがS3に保存されるようになったはずです。Mastodonから何かアップロードし、AWSのS3のコンソールから確認してみてください。

Bucketterアドオンが利用できるかもしれません。$5/月から。

メールの設定

rails mastodon:confirm_emailコマンドを使う場合にはこの作業は不要です。

ここではMailgunを使ってみています。

heroku addons:create mailgun -a $APP_NAME
heroku addons:open mailgun -a $APP_NAME

電話番号を入力してアカウントを認証してもらい、一番下のAuthorized RecipientsにMastodonのユーザー登録に利用するメールアドレスを追加し、ベリファイしておく。

Config varを設定する

$ heroku config:set SMTP_FROM_ADDRESS=<メールアドレス>  -a $APP_NAME
$ for v in SMTP_SERVER SMTP_PORT SMTP_LOGIN SMTP_PASSWORD; do
  heroku config:set $v=`heroku config:get MAILGUN_$v -a $APP_NAME` -a $APP_NAME
done

カスタムドメインでの運用

下記のコマンドで、カスタムドメインを使ってアプリケーションにアクセスできるようになります。

heroku domains:add <インスタンスのFQDN> -a $APP_NAME

DNSの設定

インスタンスのFQDNが、CNAMEで、上記のコマンドで表示されたターゲット<インスタンスのFQDN>.herokudns.comを指すように設定する。 トップレベルドメインを使う場合には、ANAMEあるいはALIASレコードにしてください (業者によっては利用できません)。

HTTPSの利用

Automated Certificate Managementを利用する場合には、Hobby以上のdynoを利用する必要があります (dynoの稼働時間に比例した料金がかかります)

heroku ps:type hobby -a $APP_NAME
heroku certs:auto:enable -a $APP_NAME

しばらくして、下記のコマンドがOKを表示するようになれば、HTTPSでのアクセスが可能です。

heroku certs:auto -a $APP_NAME

下記でMastodonがHTTP経由のアクセスをHTTPSにリダイレクトします。自ドメインの設定も直しておく。

heroku config:set LOCAL_HTTPS=true -a $APP_NAME
heroku config:set LOCAL_DOMAIN=<インスタンスのFQDN> -a $APP_NAME

Streaming APIの有効化

Mastodonではブラウザのリアルタイムに近い更新にNode.jsによって実装されているstreaming APIを利用します。上記で作成したアプリケーションではリクエストはRailsが処理しますので、streaming APIが利用できません。下記のように2つめのアプリケーションを作成してリクエストをそちらに送ることで対応できます。(ActionCableを使うようにコードを書き換えられればいいのかな?)

STREAMING_APP_NAME=<上記とは違う、希望のアプリ名>
heroku create $STREAMING_APP_NAME
heroku buildpacks:add heroku/nodejs -a $STREAMING_APP_NAME
heroku addons:attach $APP_NAME::DATABASE --as DATABASE -a $STREAMING_APP_NAME
heroku addons:attach $APP_NAME::REDIS --as REDIS -a $STREAMING_APP_NAME

Mastodonのコードのうち、Procfileを下記のように書き換えて、

web: npm start

レポジトリに登録する。

git add Procfile
git commit -m 'Start streaming service'

.profile.d/mastodon-nodejs-dataurl.shとして下記の内容のファイルを作成して、

# Obtain info from DATABASE_URL
set -- `echo $DATABASE_URL | sed 's/[:/@]/ /g'`
export DB_USER=$2
export DB_PASS=$3
export DB_NAME=$6
export DB_HOST=$4
export DB_PORT=$5

# Obtain info from REDIS_URL
set -- `echo $REDIS_URL | sed 's/[:/@]/ /g'`
export REDIS_HOST=$4
export REDIS_PORT=$5
export REDIS_PASSWORD=$3

レポジトリに加える。

chmod +x .profile.d/mastodon-nodejs-dataurl.sh
git add .profile.d/mastodon-nodejs-dataurl.sh
git commit -m 'Obtain redis connection information from DATABASE_URL and REDIS_URL'

このレポジトリを新しく作ったアプリケーションにデプロイする。手元では、ブランチを作成してそこにpushし、GitHub syncでそのブランチからコードをデプロイしています。

Streaming APIに新しく作ったアプリケーションを使うように設定する。

heroku config:set STREAMING_API_BASE_URL=https://$STREAMING_APP_NAME.herokuapp.com -a $APP_NAME

参考文献