なんとなくherokuで動かそうと思って苦労したので、インターネッツに貢献する意味で記録しておきます。
事例
kaggler-ja さんとかが使ってますね。
kagger-jaさんの過去ログサイト
kaggle slackの過去ログ閲覧アプリをGAEで構築した話
と思ったら、別者でした・・・。
まあ、見た目と機能性はおおむね同じだと思います(python製 vs Ruby製という違いはある)。
前提
- heroku cli が導入済み
- git が導入済み
- rubyが導入済み (bundler は無ければ rubygems で入れて下さい)
- Herokuにアカウントを作成済み
- 対象のSlackの過去ログをエクスポート (zipファイルでダウンロードできるやつ) してある
- npm が導入済み
- パスワード認証とかをかける仕組みを slack-patronはもたないので、万が一にも第三者に見られてはまずいということであれば、自前でベーシック認証などやる必要があると思いますが、heroku でできるのかは知りません(私は予測不可能なアプリ名にして、チャット参加者だけでそのアドレスを共有するという方法で、十分かと考えています)。
手順
はい、やっていきますよー。
私がちょこちょこと修正入れたりデプロイ用のファイルを追加したリポジトリをcloneしてくる
https://github.com/ryogrid/slack-patron.git
公式の 1.Setup をやる。これで config.yml が生成されるので、ローカルリポジトリに登録して下さい。
heroku create 好きなアプリ名
で、heroku上に今回使うアプリを空の状態で作成します。
これにより、ローカルリポジトリの remotes に heroku が追加されます。
続いて、herokuのダッシュボードから上記で作成したアプリを選択して、Resourcesのタブを選択し、アドオンの検索フォームから "mLab MongoDB" を選択し、アプリのアドオンとして登録してください。
これで MongoDBが使えるようになりました。
MongoDBにアプリケーションからアクセスするためにはユーザID、パスワード、データベース名が必要ですが、それらを丸っと含んだURIが、
heroku config:get MONGODB_URI
で読み取れます。
その内容をconfig.yml の database - uri のところに転記しておいて下さい。
(環境変数でアクセスするのが一番セキュアだとは思うのですが、なぜかうまくいかなかったので、私はこのようにしました。)
続いて、あまり大きいと微妙・・・・ではあるのですが、取得しておいたSlackの過去ログのアーカイブを gitリポジトリに登録して下さい。
これは、MongoDBに取得しておいたデータをインポートするために行います。
そして、インポートは、
heroku run bundle exec ruby ./bin/import.rb エクスポートしたファイル.zip
ってな感じでheroku上のDynoでコマンド実行する形で行います。
過去ログの量が多いとすごく時間がかかるかもなので気長に待ってください(herokuは何でも一定時間で打ち切っちゃうんだっけな・・・。だとしたら面倒ですね)
あとは気づくまでにしばらく時間がかかったのですが、配信用のフロントエンド(JS)をローカル環境でビルドしておく必要あります。
cd viewer
npm install
npm build
これで、viewer/public/buildに app.js が生成されます。
このファイル一つでWebフロントエンドになっています。
ちなみに、この記事を書いた時点で私がビルドしたものをリポジトリに入れてあるので、slack-patron最新との乖離が大きくなったりするのが嫌でなければ、これを使っていただいても構いません。
あとは、以下のようにデプロイすればOK、のはずです。
git push heroku master
できたサイトは https://あなたがつけたアプリ名.herokuapp.com でアクセスできます。
なお、slack-patron は 最新の投稿も自動で取り込んでくれるようにできていて、そこの機能を担う、logger.rbというのも Worker dynoでデプロイされます。
こいつは、冒頭で取得した Slackのトークンを使って、ひたすら最新の情報を取得し、MongoDBに追加していく、というような処理をしているようです。
なお、worker dyno は外部からアクセスを受けない(起こせない)ので、どの程度の時間でスリープしたりするのかはちゃんと把握していません。
そこは私もこれからどうするか考えよう、という感じです。
(管理画面から見ると、最初からのような気もするのですが、loggerの方の dyno がOFFになっていたりするので、ONにするようにしてあげて下さい。もしかしたら、時間制限の話も同様に対応するしかないのかもしれません。
以上、誰かの助けになれば幸いです。
追記:
Worker dyno はそもそも sleep しないそうです。
なので、一か月でざっくり 744 dyno時間を消費するので注意して下さい。
(クレジットカードを登録していれば月に1000 dyno時間まで使えるはずなので、大抵は大丈夫だと思いますが)