LoginSignup
28
32

More than 5 years have passed since last update.

[Heroku] 無料で Mastodon を動かす(~v1.3.3未満) [マスト丼]

Last updated at Posted at 2017-04-23

PTA会長業が多忙で、Heroku でちゃんと Mastodon 動かすのに時間がかかってしまいました。ただ動かすだけなら、Heroku Buttonでちょろっと設定するだけなんですが、完全な状態で動かすには一手間いります。

ただ、その一手間を入れても、ある程度は Herokuの無料範囲で使えるので、「試してみたい」という方はこちらをどうぞ。

前提条件

  • Heroku アカウントを持っている
  • (推奨)Heroku アカウントでクレジットカードを登録している
  • Heroku CLI が導入済み
  • Git が使える
  • (強く推奨)Amazon S3 が使える
  • (推奨)自由にメールを送信できるサーバ(smtp)がある

Heroku へ本体を deploy

なにはともあれ、本体を deploy しましょう。

Heroku GuideHeroku Button をクリックします。該当ページのタイトルのすぐ下にあるので問題ないですね。このボタンです。

Screen Shot 2017-04-23 at 11.30.46.png

なにやら、色々と入力項目があるので、各々説明していきます。

App Name を登録しよう

Heroku へアプリケーションを登録すると、xxxx.herokuapp.com というホスト名が割り当てられます。この xxxx を入力します。一意でなければならないのですが、入力してみると、OKかNGかすぐにわかりますので、適当に入力してみて、好きな名前を決めましょう。なお、何も入力しなければ、Heroku が勝手に割り当ててくれますが、今回は訳あって入力する必要がありますので、必ず何か入力してください。

Screen Shot 2017-04-23 at 11.32.17.png

Heroku に関する定義情報を入力しよう

次に、環境変数を入力する項目が並んでいます。そのうち、冗談から順番に入力していきましょう。まずは、Heroku の基礎情報の入力です。

Screen Shot 2017-04-23 at 11.43.01.png

各項目については、次の通り入力してください。なお、入力項目の前に「*」がついているものは、必須項目になります。

項目名 設定内容・説明
Heroku Herokuを使う場合は、これがtrueでなければなりませんので、このまま
LOCAL_DOMAIN Mastodonがアクセスすることになるホスト名です。先に入力した App Name.herokuapp.comになります。ここで入力する必要があるので、App Name は必ず入力しなければなりませんです
LOCAL_HTTPS Herokuは標準でhttpsも使えますので、特に何もなければ trueで良いです
SINGLE_USER_MODE Mastodonを一人だけで使う場合には、ここをtrueにしておいてください

他にもなにやら 3つほどありますが、「autogenerated」となっているとおり、自動的に割り振られますので、これらの項目は無視です。

Amazon S3 の設定

次は Amazon S3 の設定です。アイコンや背景の画像ファイル、投稿した画像ファイルなどの保管場所になります。Heroku ではローカルのファイルシステムが利用できず、ファイルを永続化させられないので、S3 に頼る必要があります。入れなくても試す分にはなんとかなるとは思いますが、24時間以内にファイルがなくなって切ない思いをするので、個人用でもちょっと使ってみようという場合は S3を使いましょう。

Screen Shot 2017-04-23 at 11.54.58.png

項目名 設定内容・説明
S3_ENABLED S3を使わない場合にはfalseに変更します。trueの場合は以下の項目すべて必要です
S3_BUCKET S3のバケット名を入力します。s3://やバケット下のフォルダ名など不要で、バケットの名前だけにします
S3_REGION 使用するS3リージョン名を指定します。Tokyoならap-northeast-1とかになりますね。ただ、us-east-1のときだけうまくいかないので、S3_HOSTNAME環境変数の設定が必要みたいです。俺だけ? 1
AWS_ACCESS_KEY_ID AWSへアクセスするためのアクセスキーを指定します
AWS_SECRET_ACCESS_KEY 同様にシークレットキーを指定します

S3を使う場合の注意事項

S3を利用する場合、IAM Policy または Bucket Policy に記述が必要です。前者は元ネタのサイトに書いてあるとおりですが、私は試したことないです。いずれも、サンプルを残しておきますので、ご参考に。いずれも mstdn というバケットの場合ですので、皆様の環境にあわせて変更ください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::mstdn",
                "arn:aws:s3:::mstdn/*"
            ]
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mstdn/*"
        }
    ]
}

SMTPの設定

最後に、送信メールサーバの設定です。メールによるユーザ登録を利用する場合は必ず必要ですが、なくても自分で Validation可能なので、個人で使う分には必死になることはないです。私は、Heroku Guideが勧めてくださったmailgunを素直に使うほどの、純粋に生きています。

Screen Shot 2017-04-23 at 11.50.21.png

項目名 設定内容・説明
SMTP_SERVER SMTPメールサーバのホスト名またはIPアドレスを入力します
SMTP_PORT SMTPメールサーバのポート番号
SMTP_LOGIN SMTP認証が必要な場合のユーザ名
SMTP_PASSWORD 同じく、その時のパスワード
SMTP_DOMAIN メールドメインの指定が必要であれば、指定します
SMTP_FROM_ADDRESS mastodonから送信されるメールのFROMを指定します
SMTP_AUTH_METHOD SMTPの認証方式を指定します。デフォルトだとplainですが、指定したほうが安心です
SMTP_OPENSSL_VERIFY_MODE SMTP認証時のSSL/TLSの定義。たいてい放置で良さげ
SMTP_ENABLE_STARTTLS_AUTO SSL/TLS認証を行う場合はtrueです。こちらも標準でtrue

これら環境変数は、Deployした後からでも追加・変更できますので、Herokuの必要最小限だけでも設定したら、進んでしまうのも一つの手です。ただ、まとめて入力できるのはここしかないので、入れられるならなるべく入れてしまったほうがあとが楽です。

詳細は、actionmailer 機能で調べてみてください。私もよく知らん。

Deploy しよう!!

ここまでまちがいなく入力できたら、一番下の Deployボタンをクリックしましょう。Heroku へ deployが始まります。

Screen Shot 2017-04-23 at 11.57.48.png

5分以上はかかると思います。お茶でもしばいて待っていただくか、仮眠でも取っておいてください。まだ半分と終わっていません。

次の通り、Deploy to Heroku の文字が緑色になれば、正常に Deployされましたヽ(´ー`)ノやったね

Screen Shot 2017-04-23 at 12.03.53.png

中身が気になる方は、「 Show build log 」をクリックすると、デプロイのログが見られますので、そちらもどうぞ。ここで、Viewボタンをクリックすると、下のよくみる Mastodon画面が出てきますので、ここまで来たらひとまず成功です。この状態で、一応使えます。

本体Deployまでで

一応動いている風ですが、実は非同期通信系が完全に動いていないので、他のインスタンスとの連携やメール送信はできませんが、ユーザ登録やローカルでのメッセージ送受信はできます。

そこで、バックエンドの Workerも動かしてあげます。先程の画面で「 Manage App 」というボタンがありますので、そちらをクリックしてみましょう。画面が切り替わったら「 Resouces 」タブに移動します。

Screen Shot 2017-04-23 at 12.21.36.png

なんとなく、「 Worker 」というやつが動いていない気がします。はい、実際動いてないです。なので、右側の鉛筆みたいなのをクリックしてください。$0.00 の左横のスライドスイッチが動かせそうなので、青くなるように動かしましょう。これで起動するように支持することになります。うまく動いたら Confirm ボタンをクリックすると、Worker くんが起動します。これで、メールの送信と他インスタンスとの連携が可能になります。

Screen Shot 2017-04-23 at 12.23.16.png

ここまでで、Mastodonの本体がDeployできて、必要な機能はほぼ利用可能な状態になっています。ただ、残念ながら、この状態だと Streaming APIが利用できないので、Mastodon 画面をボーッと眺めていても、リアルタイムに更新していってくれません。残念です。「俺は漢だ、更新は自分でやるぜ」という方はここで完成です。おめでとうございます。

俺は、Streaming も使いたい...っ!! という方は、このあともご覧ください。

Heroku で Streaming API を使う

ここまではGUIだけで済んでいたのですが、ここからは唐突にCUIばっかりになります。ひとまず Heroku CLIが使える状態であることを前提に進めます。

Streaming 用の Heroku App を準備する

適当な空フォルダへ行って、次の通りコマンドを打っていきます。このあと、コマンドの結果などでは、実際のコマンドの結果がそのまま入っている部分があります。これらは、臨場感を出すためにそのままにしているだけで、ここで定義したアプリケーションはすでに削除済みで利用はできませんので、「よーしパパハッキングしちゃうぞー」はできませんので、予めご承知おきください。

Heroku App の作成と環境変数の割当

ソースコードの入手
$ git clone https://github.com/tootsuite/mastodon.git
Cloning into 'mastodon'...
remote: Counting objects: 28567, done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 28567 (delta 23), reused 1 (delta 1), pack-reused 28499
Receiving objects: 100% (28567/28567), 35.03 MiB | 78.00 KiB/s, done.
Resolving deltas: 100% (17381/17381), done.

以後、新しく作成された mastodon ディレクトリ配下で作業を実施

Herokuアプリ作成
$ heroku create
Creating app... done, ⬢ gentle-island-20654
https://gentle-island-20654.herokuapp.com/ | https://git.heroku.com/gentle-island-20654.git

heroku create で、特にApp名を指定せずに作成すると、このように勝手にアプリ名が割り当てられます。以後、このgentle-island-20654 を使って、作業を実施したとします。なお は、先程 Deployしたアプリケーションの名前を入れます。作業内容としては、デプロイ済みの Heroku PostgresHeroku Redisのこれらデータベースの接続設定を、新しい Streaming API用のサーバにも割り当てているだけです。

DB環境変数の定義
$ heroku config:set `heroku config:get DATABASE_URL --app <deploy済本体のApp名> | awk -F'[@:/]' '{ printf "DB_USER=%s\nDB_PASS=%s\nDB_HOST=%s\nDB_PORT=%s\nDB_NAME=%s\n",$4,$5,$6,$7,$8 }'` --app gentle-island-20654
Setting DB_USER, DB_PASS, DB_HOST, DB_PORT, DB_NAME and restarting ⬢ gentle-island-20654... done, v3
DB_HOST: ec2-23-23-111-171.compute-1.amazonaws.com
DB_NAME: d3da5gkauvkrtc
DB_PASS: 9dbad98dce67d765f1852e9e262ba02980de6280114ebae88c04b710a3486a34
DB_PORT: 5432
DB_USER: arudjmvubxsuiw
Redis環境変数の定義
$ heroku config:set `heroku config:get REDIS_URL --app <deploy済本体のApp名> | awk -F'[@:/]' '{ printf "REDIS_PASSWORD=%s\nREDIS_HOST=%s\nREDIS_PORT=%s\n",$5,$6,$7}'` --app gentle-island-20654
Setting REDIS_PASSWORD, REDIS_HOST, REDIS_PORT and restarting ⬢ gentle-island-20654... done, v4
REDIS_HOST:     ec2-34-204-242-91.compute-1.amazonaws.com
REDIS_PASSWORD: p1348825873d3bea268d1f1c7665d40b63e3d0ca4bfb7301c314dd3ac44e1891b
REDIS_PORT:     22739
Node.js本番指定
$ heroku config:set NODE_ENV=production --app gentle-island-20654
Setting NODE_ENV and restarting ⬢ gentle-island-20654... done, v5
NODE_ENV: production

Streaming App側では Node.jsのみを利用します。Node.jsを使いますよという宣言も行います。

buildpackの指定
$ heroku buildpacks:set heroku/nodejs
Buildpack set. Next release on gentle-island-20654 will use heroku/nodejs.
Run git push heroku master to create a new release using this buildpack.

起動方法の指定

mastodon ディレクトリのルートに、Procfile というファイルがありますので、次のように書き換えます。

web: npm start

その後、変更を反映するために git commitします。

commit
$ git add -A && git commit -m 'Changed Streaming'
[master 527a13e6] Changed Streaming
 1 file changed, 1 insertion(+), 2 deletions(-)

Streaming用アプリのデプロイ

gitコマンドを使って、Heroku へデプロイします。Node.js側のみのデプロイなので、先程より時間はかからないはずです。

git
$ git push heroku master
Counting objects: 28321, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10524/10524), done.
Writing objects: 100% (28321/28321), 34.99 MiB | 3.94 MiB/s, done.
Total 28321 (delta 17201), reused 28321 (delta 17201)
remote: Compressing source files... done.
remote: Building source:
remote:
---(snip)---
remote:        https://gentle-island-20654.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/gentle-island-20654.git
 * [new branch]        master -> master

Streaming サーバアドレスの指定

最後の局面までやってきました。先にデプロイした本体側から、Streamingサーバへ接続するように、環境変数を設定します。

Streamingサーバの設定
$ heroku config:set STREAMING_API_BASE_URL=https://gentle-island-20654.herokuapp.com/ --app mstdn-prfm
Setting STREAMING_API_BASE_URL and restarting ⬢ mstdn-prfm... done, v20
STREAMING_API_BASE_URL: https://gentle-island-20654.herokuapp.com/

あとに作ったアプリサーバのURLが必要です。https://〜 ですね。ドメイン名までです。ディレクトリの指定は不要です。

設定上はここまでで終わりです。一応、2つのアプリともども、一度再起動をしておくと安心かもしれません。本体側は起動にそこそこ時間がかかるため、再起動指示のあと、すぐにアクセスに行っても飯能がないか、帰ってきてもエラーが発生するかだったりします。慌てずに。

最後に

無料だとできることが限定されていますので、一応補足しておきますね。近い将来「有料で作る〜」も書きますので、そちらもご参考に。

  • クレカ未登録ユーザは、550時間/月 Dyno (Heroku App)を稼働できます
  • クレカ登録ユーザは、1,000時間/月 Dyno (Heroku App)を稼働できます
    • 1ヶ月30日の場合 1Dynoをフル稼働すると 720時間消費します。したがって、今回のように 2Dynoをずっと稼働させたまま1ヶ月使い続けることはできません (1,440時間が必要。しかし、無料枠では1,000時間まで)
  • Heroku Postgres は 10,000行までです。

他にもいくらかありますが、Mastodon に限って引っかかりやすいのは上記と考えられます。

Build apps for free on Heroku


  1. 私の使っている us-east-1 の場合、URL が s3.amazonaws.com になって、リージョン名が入ってこないので、S3_HOSTNAMEs3.amazonaws.com を指定して難を逃れています。なんでだろ。 

28
32
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
28
32