21世紀のフォーラムDiscourseをHerokuで動かす

21世紀のフォーラムDiscourseをHerokuで動かす
====

はじめに
----
[Bounscale](https://github.com/bounscale/bounscale/)というオートスケールするHeroku Addonを作って公開に向けて作業しています。

Addonを使ってくれているユーザとのコミュニケーションは今のところGithubのIssuesでいいや、と割り切っていますが、今後を見据えるともっと使いやすく、かつユーザ同士が直接情報交換できるようなフォーラムサイトを準備したいところです。

[Discourse](http://www.discourse.org/)はRailsで作られている最近話題の「21世紀のフォーラム」だそうです。触った感じ、ソーシャルやら動画貼り付けやら、今風の機能が山ほど入っていてとてもいい感じなので、Herokuで大体無料の範囲で動かしてみます。

この記事の範囲
----
この記事ではDiscourseの機能についての説明はしません。
単純にHerokuで動かす手順について説明します。

世界は広い
----
とは言え、１から自力で対応しきるのは茨の道だと思います。
Githubを検索してみたところ、案の定[Herokuで動かせるように修正したfork](https://github.com/swrobel/discourse-heroku)が公開されていました。

ざっとコミットを見た感じ、本家との主な差分は下記のような感じです。

* メール送信の[Mandrill](https://addons.heroku.com/mandrill)など、各種Heroku Addonを使うための設定が入ってます。
* Discourseは[sidekiq](https://github.com/mperham/sidekiq)をバックグラウンドジョブ実行に使っています。そのDynoを使ってないときは落とす[autoscaler](https://github.com/JustinLove/autoscaler)の導入をしています。
  * Dynoが常時2つだと月間Dyno-hour上限を超えてHerokuの無料から外れるためと思われます。
* S3との連携周りの修正
  * Herokuは原則的にgitに入っていない静的ファイルを永続的に配置することはできません

という事で、このforkでインストールする手順を下記していきます。（大半がREADME.mdの翻訳みたいな感じになってしまいましたが・・・）

リポジトリのclone
----
上記したforkをcloneします。

````
git clone git://github.com/swrobel/discourse-heroku.git discourse
````

Heroku上にアプリを作成
----
普通に作ってください。

````
heroku apps:create [YOUR_APP_NAME]
````

アドオンをインストール
----
アドオンをインストールします。
まずはPostgresです。標準の無料の物を使います。バージョン指定がされているあたりになんとなく苦労の跡を感じます。

````
heroku addons:add heroku-postgresql:dev --version=9.2
````

その他のアドオンもインストールします。

````
heroku addons:add mandrill:starter
heroku addons:add rediscloud:20
heroku addons:add memcachier:dev
heroku addons:add scheduler
heroku addons:add newrelic:standard
````

ちなみに各アドオンは下記の役割です。

* mandrill   : メール送信
* rediscloud : Redis
* memcachier : memcached
* scheduler  : 定期実行処理
* newrelic   : 負荷監視

続いて下記のlabsの機能をONにします。

````
heroku labs:enable user-env-compile
````

Asset Pipelineがうまく動かないときに使う機能です。
実験的な機能なので今後どうなるかわからない等の表示でますので、留意してください。


環境変数の設定
----
シークレットトークンを生成します。

````
rake secret
````

出力をコピーして下記の設定をします。

````
heroku config:add SECRET_TOKEN=<ここにペースト>
````

[Herokuアカウントのページ](https://dashboard.heroku.com/account#api-key)からAPIキーをコピーして、下記の設定します。

````
heroku config:add HEROKU_API_KEY=<ここにペースト>
````

GCの設定値を[Discourse推奨の値](http://meta.discourse.org/t/tuning-ruby-and-rails-for-discourse/4126)に設定します。

````
heroku config:add RUBY_GC_MALLOC_LIMIT=90000000
````

[Herokuのアプリ一覧](https://dashboard.heroku.com/apps)から該当のアプリを選択して、Mandrillアドオンのアイコンをクリックして設定画面を開きます。
表示内容に従って一定の初期化処理を実施したあと、Mandrillのメールアドレス、APIキーを表示してコピーして、下記の設定します。

````
heroku config:add SMTP_SERVER=smtp.mandrillapp.com SMTP_PORT=587 HEROKU_APP=<heroku_app_name>
heroku config:add MANDRILL_USERNAME=<MandrillのEメール>
heroku config:add MANDRILL_APIKEY=<MandrillのAPIキー>
````

コードのpush、migrate、seed
----
Heroku上で動作するようにいつもの初期化を実施します。

````
git push heroku master
heroku run rake db:migrate
heroku run rake db:seed_fu
````

Schedulerアドオンの設定
----
スケジューラアドオンのアイコンをクリックして、下記の設定をします。

|TASK                       | FREQUENCY        |
|:-------------------------:|:----------------:|
|rake enqueue_digest_emails | Daily            |
|rake category_stats        | Daily            |
|rake periodical_updates    | Every 10 minutes:|
|rake version_check         | Daily            |
管理者ユーザの作成
----
すでにDiscourseの画面自体にアクセスできるようになっているはずなので、画面から新規に通常のユーザアカウントを作成してください。Mandrillが正常に設定されていれば、Discourseの機能でアクティベーションメールが届くはずです。

ただし、このメールに記載されたアクティベーションリンクのURLはドメインが間違ったもの(EC2インスタンスの名前が入っている)です。ですので、ドメインをxxx.herokuapp.comに直してからブラウザのURLランに張り付けて開いてアクティベーションを済ませてください。
（手順的にスマートではないのですが、後の設定でドメインについては正しく設定しますので、ここはこの方法で進めてください）

続いて、下記のコマンドを実行して、該当のユーザを管理者に指定してください。

````
heroku run rails c

user = User.first
user.admin = true
user.moderator = true (this is optional)
user.save
````

ドメインの設定
----
上記でおかしな事になっていたドメインを直します。
作成した管理者ユーザでログインし /admin を開いてください。

「Site Settings」というページを開き、「force_hostname」という項目に「xxx.herokuapp.com」を入力します。


S3ストレージの設定（オプション）
----
Herokuはアップロードされたファイルなどをファイルとしてに永続保持することができません。（しばらくすると勝手に消えます）

ですので、ここだけは有料になってしまいますが、ファイルアップロード先にS3を指定します。（12か月の無料期間はありますが）
AWSのコンソールからアクセスキーとシークレットキーを取得して、下記の設定をします。

````
heroku config:add AWS_ACCESS_KEY_ID=<アクセスキー> AWS_SECRET_ACCESS_KEY=<シークレットキー>
````

先ほども設定した「Site Settings」をひらいて、「enable_s3_uploads」にチェックをして、「s3_upload_bucket」にバケット名を指定して下さい。

終わりに
----
ソーシャルネットワークが広がって、従来ほどフォーラムというコミュニケーションが活発ではなくなったようにも思いますが、それにしてもDiscourseはいい感じなので、ほとんど無料でHerokuで動かしてみてはどうでしょうか。