Locomotive Engine を Heroku で動かすまで


最近LocomotiveCMSを使い始めました。コマンドラインや好きなテキストエディタを使ってCMSを更新できる所がなかなか便利だし、Railsベースなので機能追加も便利そうです。

LocomotiveCMS は、Locomotive Engine というサーバ部分と、Wagon というコマンドラインツールの組み合わせでできています。
Wagon で作ったサイトを、サーバで動いているLocomotive Engineにpushすることでサイトを公開できる仕組みです。

LocomotiveCMSでは[LovomotiveHosting](https://www.locomotivehosting.com/)というサイトを公開しており、そちらを使えばわざわざEngineを自前で用意することは無いのですが、今回のプロジェクトでは色々とEngine側にもカスタマイズが入りそうだったので、Herokuで自前でホストするようにしました。

以下は、ローカルで Engine の開発環境をセットアップしてから、Heroku に登録するまでの流れです。
ほとんどが[公式ドキュメント](http://doc.locomotivecms.com/get-started/heroku)通りなのですが、作業メモ的に残しておいたのを公開します。

まず、rails をインストールしていなければインストール

```bash:bash
gem install rails --version=3.2.16
```

インストールしたら、色々スキップして rails サイトを作成

```bash:bash
bundle exec rails new mycms --skip-active-record --skip-test-unit --skip-javascript --skip-bundle
cd mycms

```

Gemfile に以下の3行を追加


```bash:bash
gem 'locomotive_cms', '~> 2.4.1', :require => 'locomotive/engine'
gem 'compass-rails',  '~> 1.1.3'
gem 'unicorn'

```

上記の通りにやると以下のエラーが出た。

```bash:bash
Bundler could not find compatible versions for gem "mime-types":
  In Gemfile:
    rails (= 3.2.16) ruby depends on
      mime-types (~> 1.16) ruby

    locomotive_cms (~> 2.4.1) ruby depends on
      mime-types (2.2)
```

うーむ。rails のバージョンを外して対応したらインストールできた。（でも結局インストールされたのは 3.2.16。？）

bundle installする

```bash:bash
bundle install --path=vendor/bundle
```

mongodb を起動する。どこでもいいけど、db/mongo を作って起動した

```bash:bash
mkdir db/mongo
mongod --dbpath=db/mongo
```

Locomotive Engine をインストール

```bash:bash
bundle exec rails g locomotive:install
```

config/mongoid.yml を書き換える
vi config/mongoid.yml

```mongoid.yml
development:
  sessions:
    default:
      database: mycms_dev
      hosts:
        - localhost:27017
  options:
    identity_map_enabled: true

test:
  sessions:
    default:
      database: mycms_test
      hosts:
        - localhost:27017
  options:
    identity_map_enabled: true

production:
  sessions:
    default:
      uri: <%= ENV['MONGOHQ_URL'] %>
```

あとは起動してみる。

```bash:bash
% bundle exec unicorn_rails
I, [2014-03-25T19:39:13.983735 #37567]  INFO -- : listening on addr=0.0.0.0:8080 fd=9
I, [2014-03-25T19:39:13.983880 #37567]  INFO -- : worker=0 spawning...
I, [2014-03-25T19:39:13.985256 #37567]  INFO -- : master process ready
I, [2014-03-25T19:39:13.986196 #38022]  INFO -- : worker=0 spawned pid=38022
I, [2014-03-25T19:39:13.986635 #38022]  INFO -- : Refreshing Gem list
I, [2014-03-25T19:39:18.856479 #38022]  INFO -- : worker=0 ready
```

うまく起動したみたい。ブラウザで、http://localhost:8080/ にアクセス。初回アクセス時にはadminユーザーの登録画面が出てくる。

![locomotive-heroku.png](https://qiita-image-store.s3.amazonaws.com/0/1399/c4f20bc5-923d-7693-df80-d498dc4a4125.png "locomotive-heroku.png")


起動したので、Heroku に deploy してみる。以下の gem を Gemfile に追加

```Gemfile
gem 'locomotive-heroku', '~> 0.1.0', :require => 'locomotive/heroku'
gem 'thin', :group => 'production'
```

heroku でバージョン指定の為 Gemfile のgem設定が始まる前に以下の行を追加

```Gemfile
ruby '2.0.0'
```

bundle installする

```bash:bash
bundle install
```

heroku 上に新規アプリ作成

```bash:bash
git init .
heroku create <YOUR APP NAME>
heroku config:add BUNDLE_WITHOUT=development:test
```

mongodb をセットアップ

```bash:bash
heroku addons:add mongohq:sandbox
```

config/mongid.yml の production 部分を以下のように変更（mongo hq を使う為の設定）

```
production:
  sessions:
    default:
      uri: <%= ENV['MONGOHQ_URL'] %>
```

（Heroku 上で mongohq を有効にしていなければ、`heroku addons:add mongohq`で有効にすること）

メール送信用に SendGrid を設定

```bash:bash
heroku addons:add sendgrid:starter
```

Sendgridを使うように config/environments/production.rb を変更

```
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => 25,
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => ENV['SENDGRID_DOMAIN']
}
```

S3の環境設定をする
S3_BUCKET_REGION については[公式ドキュメント](http://doc.locomotivecms.com/get-started/heroku)を参照のこと

```bash:bash
heroku config:add S3_KEY_ID=<YOUR S3 KEY ID>
heroku config:add S3_SECRET_KEY=<YOUR S3 SECRET KEY>
heroku config:add S3_BUCKET=<YOUR S3 BUCKET NAME>
heroku config:add S3_BUCKET_REGION=<YOUR S3 BUCKET REGION>
```

config/initializers/locomotive.rbに以下の設定を追加

```
config.hosting = {
  :target     => :heroku,
  :api_key    => ENV['HEROKU_API_KEY'],
  :app_name   => ENV['HEROKU_APP_NAME']
}
```

Heroku のAPIキーとアプリ名をセットする

```bash:bash
heroku config:add HEROKU_API_KEY=<YOUR HEROKU API KEY>
heroku config:add HEROKU_APP_NAME=<YOUR APP NAME>
```

デバッグをしやすいように、アセットのプリコンパイルを済ます。config/application.rb 上の initialize_on_precompile オプションをオフにする
vi config/application.rb

```
module YourApplication
  class Application < Rails::Application
    ...
    config.assets.initialize_on_precompile = false
    ...
  end
end
```

アセットのプリコンパイル実行

```
bundle exec rake assets:precompile
```

デプロイしてみる

```
git add .
git commit -am "launch it"
git push heroku master
```

エラーがでなければOK.
あとは、`heroku open` でサイトを確認して、上記と同じように登録画面が出てきたら登録完了！

---
Locomotive 関連の記事一覧：
* [Locomotive Engine を Heroku で動かすまで](http://qiita.com/hal_sk/items/0512a4a9cb215fb016f5)
* [LocomotiveCMS でニュース記事一覧機能を作る](http://qiita.com/hal_sk/items/b72db4a288566e92096c)
* [LocomotiveCMS のページにユーザー認証機能を組み込む（Engineの拡張）](http://qiita.com/hal_sk/items/c6d4f5582d23bc4dd415)
* [LocomotiveCMS + Devise を使って作ったログインページのデザインをCMS側でできるようにする(1)](http://qiita.com/hal_sk/items/50c45f764cb95615dd59)
* [LocomotiveCMS + Devise を使って作ったログインページのデザインをCMS側でできるようにする(2)](http://qiita.com/hal_sk/items/c0f56736398f1154ddca)
* [LocomotiveCMS + Devise を使って作ったログインページのデザインをCMS側でできるようにする(3)](http://qiita.com/hal_sk/items/92d653f47ddadb6d879c)
* [LocomotiveCMS で、複数の Heroku インスタンスを使う](http://qiita.com/hal_sk/items/aba8d324638d205b2ce1)