heroku

railsのホスティングサービス。平たく言えば、railsアプリケーションが動くサーバをインターネット上に無料で用意できる。当然、無料範囲では、いくらかの制限がある。軽くデモりたい程度なら余裕。

制約と対処

ローカルファイルへの保存

プログラムからファイルシステムに書き込みできない。たとえば、投稿された画像を保存できない。書き込みはdbに対してだけ可能。

対処

  • 画像をdbに保存する
    • dbの容量にも制限があるので解決にならない
  • 外部に保存する
    • AmazonS3に保存する
    • 幸いにもプラグインまである

Herokuの準備

アカウント作成

さっさと作成する。 http://www.heroku.com/

ツールのインストール

Heroku Toolbelt

https://toolbelt.heroku.com/

https://devcenter.heroku.com/articles/heroku-command

これでHerokuとやり取りするherokuコマンドが使える。

C:\Sites>gem install heroku
herokuへのログイン情報を準備する。
C:\Sites>heroku login
Enter your Heroku credentials.
Email: herokuにサインアップしたメールアドレス
Password (typing will be hidden):herokuアカウントのパスワード

参考

鍵の作成

heroku側に認証の鍵を作る。

C:\Sites>heroku keys:add
これで普段コンソールから使っている鍵をherokuで使える。

プロジェクトの準備

ここではpettantempという名前のサイトをherokuに立ち上げるとする。 このアプリケーションが稼働すれば、http://pettantemp.herokuapp.comというurlで遊べるようになる。

herokuのアプリケーション作成は後でするとして、とりあえず新規プロジェクトを作成する。

C:\Sites\heroku>rails new pettantemp
C:\Sites\heroku>cd pettantemp
この新規プロジェクトにぺったんRソースファイルを被せて、herokuにぺったんRを構築していく。

アプリケーション作成

herokuコマンドを使ってpettantempという名前のアプリケーションをherokuに作成する。

C:\Sites\heroku\pettantemp>heroku create pettantemp
herokuのアカウントページから、作成したアプリケーションを確認できるはず。

このアプリケーションにgitでファイルを転送する。 herokuの無料プランでは共同開発ができないので、ローカルから作成してPUSHしていくだけ。

C:\Sites\heroku\pettantemp>git init
Initialized empty Git repository in C:/Sites/heroku/pettantemp/.git/

なお、public/index.htmlは削除しておく。

C:\Sites\heroku\pettantemp>heroku git:remote -a pettantemp

参考

ぺったんRの上書き

ぺったんRをgitからcloneしておく。ただし、このファイルはSourceForgeにつながっているので、手作業でpettantempにコピーする。なお、コピーするとき、.gitディレクトリだけはコピーから除外しておくこと。これまで上書きするとおかしくなる。

コピーをはじめる前にcloneした環境で動作を確認しておいた方が無難。

無視しない

開発者が混乱しないように環境依存のファイルはgitで扱わないように無視する設定になっているが、heroku本番環境では無視しないように.gitignoreを編集する。

.bundle
db/*.sqlite3
db/schema.rb
log/*.log
tmp/
Gemfile.lock   ←削除
.sass-cache/
public/image/*
config/aws.yaml   ←削除
config/picture_io.yml   ←削除
config/license.yml   ←削除
config/test_layout   ←削除
lib/test/temp/
db/migrate/*_creative_commons_v??_licenses_attributes.rb   ←削除
db/migrate/*_pettan_commons_v??_licenses_attributes.rb   ←削除
db/migrate/*_pettan_protected_v??_licenses_attributes.rb   ←削除
db/migrate/*_pettan_public_v??_licenses_attributes.rb   ←削除
db/migrate/*_public_domain_v??_licenses_attributes.rb   ←削除
db/migrate/*_unknown_v??_licenses_attributes.rb   ←削除
ライセンスのmigrateファイルはgitでherokuに転送してやらないと反応してくれないらしい。さらに必要ならconfig/test_layoutか。 これらを無視しないように削除しておく。もちろん各ファイルは用意しておくこと。

ライセンステーブルの作成

ライセンスengineが利用するテーブルを作成するスクリプトを作成する作業(rake licenses:install)はローカルで実行してからgitにaddする。

C:\Sites\heroku\pettantemp>rake licenses:install

s3の設定

AWSとのやりとりはaws-s3というgemで実現しているのだが、これの本家がrails 4.1に対応しないまま打ち捨てられているのでforkしたプロジェクトを利用しなければならない。 githubから直接インストールするには、以下のコマンドを実行する。

gem specific_install -l 'https://github.com/bartoszkopinski/aws-s3'

AmazonS3のアカウントはできている前提。 access_keyとsecret_keyはあるよね?

Firefoxからs3Storageを操作するプラグインS3Foxなどが便利。S3Foxのアカウント管理でキーを設定して、s3が使えることを確認する。

rails 4.1 からは秘密にしたい接続情報をconfig/secrets.ymlに記述するようになった。本番環境ではサーバーを環境変数を参照するように設定されているので、次のように設定して行く。

heroku config:set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx
heroku config:set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx

S3Foxに戻って、原画・素材・実素材・システム画像のディレクトリを作成する。

そして、config/picture_io.ymlのproductionの項目にoriginal_picture、resource_picture、picture、system_pictureを(先ほどS3Foxから作成したディレクトリで)書き換える。

assetパイプライン

railsには通信を効率的にするassetパイプラインという機能がある。herokuはassetパイプラインを有効にしておかないと動かない。assetパイプラインはテスト環境では問題が起きないので、案外曲者である。

C:\Sites\heroku\pettantemp>bundle exec rake assets:precompile

参考 https://devcenter.heroku.com/articles/rails3x-asset-pipeline-cedar

コンパイルできません?

JavaScriptファイルが肥大化しすぎたため、 rails Installerを使ったWindows環境ではリソース不足によりコンパイルできない。これまでは Linux系OSでコンパイルしていたが、 RubyInstaller+DevKitなら問題なくいける。

migration

本番環境向けにマイグレーションする。

rake db:migrate RAILS_ENV='production'

コンパイル
bundle exec rake assets:precompile RAILS_ENV=production

Publicの下にコンパイルされたファイルができる。これらをすべてherokuのプロジェクト側にコピーする。

コミット

これでherokuに転送するファイルは揃った。 ここからは普通にgitからaddしたりcommitしてPUSHしていくだけ。

C:\Sites\heroku\pettantemp>bundle install --without production
C:\Sites\heroku\pettantemp>git add .
C:\Sites\heroku\pettantemp>git commit -a -m "init"

デプロイ

pushすると自動的にデプロイされる。

C:\Sites\heroku\pettantemp>git push heroku master
C:\Sites\heroku\pettanr>git push heroku master
Enter passphrase for key '/c/Users/yas/.ssh/id_rsa':
Counting objects: 701, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (632/632), done.
Writing objects: 100% (701/701), 466.25 KiB | 207 KiB/s, done.
Total 701 (delta 241), reused 0 (delta 0)
-----> Ruby/Rails app detected
-----> Installing dependencies using Bundler version 1.3.0.pre.2
       Running: bundle install --without development:test --path vendor/bundle -
-binstubs bin/
       Fetching gem metadata from http://rubygems.org/.........
       Fetching gem metadata from http://rubygems.org/..
       Installing rake (10.0.3)
       Installing multi_json (1.5.0)
       Installing activesupport (3.1.1)
       Installing builder (3.0.4)
       Installing i18n (0.6.1)
       Installing activemodel (3.1.1)
       Installing erubis (2.7.0)
       Installing rack (1.3.6)
       Installing rack-cache (1.2)
       Installing rack-mount (0.8.3)
       Installing rack-test (0.6.2)
       Installing hike (1.2.1)
       Installing tilt (1.3.3)
       Installing sprockets (2.0.4)
       Installing actionpack (3.1.1)
       Installing mime-types (1.19)
       Installing polyglot (0.3.3)
       Installing treetop (1.4.12)
       Installing mail (2.3.3)
       Installing actionmailer (3.1.1)
       Installing arel (2.2.3)
       Installing tzinfo (0.3.35)
       Installing activerecord (3.1.1)
       Installing activeresource (3.1.1)
       Installing xml-simple (1.1.2)
       Installing aws-s3 (0.6.3)
       Installing bcrypt-ruby (3.0.1)
       Using bundler (1.3.0.pre.2)
       Installing coffee-script-source (1.4.0)
       Installing execjs (1.4.0)
       Installing coffee-script (2.2.0)
       Installing rack-ssl (1.3.2)
       Installing json (1.7.6)
       Installing rdoc (3.12)
       Installing thor (0.14.6)
       Installing railties (3.1.1)
       Installing coffee-rails (3.1.1)
       Installing orm_adapter (0.0.7)
       Installing warden (1.2.1)
       Installing devise (1.5.2)
       Installing jquery-rails (2.1.4)
       Installing rails (3.1.1)
       Installing pettanr_creative_commons_v30_licenses (0.0.6)
       Installing pettanr_pettan_commons_v01_licenses (0.0.7)
       Installing pettanr_pettan_protected_v01_licenses (0.0.7)
       Installing pettanr_pettan_public_v01_licenses (0.0.7)
       Installing pettanr_public_domain_v01_licenses (0.0.5)
       Installing pettanr_unknown_v01_licenses (0.0.6)
       Installing pg (0.14.1)
       Installing rmagick (2.13.1)
       Installing sass (3.2.4)
       Installing sass-rails (3.1.6)
       Installing therubyracer-heroku (0.8.1.pre3)
       Installing uglifier (1.3.0)
       Installing validate_url (0.2.0)
       Installing validates_existence (0.8.0)
       Your bundle is complete! It was installed into ./vendor/bundle
       Post-install message from rdoc:
       Depending on your version of ruby, you may need to install ruby rdoc/ri d
ata:
       <= 1.8.6 : unsupported
       = 1.8.7 : gem install rdoc-data; rdoc-data --install
       = 1.9.1 : gem install rdoc-data; rdoc-data --install
       >= 1.9.2 : nothing to do! Yay!
       Cleaning up the bundler cache.
-----> Writing config/database.yml to read from DATABASE_URL
-----> Preparing app for Rails asset pipeline
       Detected manifest.yml, assuming assets were compiled locally
-----> Rails plugin injection
       Injecting rails_log_stdout
       Injecting rails3_serve_static_assets
-----> Discovering process types
       Procfile declares types      -> (none)
       Default types for Ruby/Rails -> console, rake, web, worker
-----> Compiled slug size: 17.4MB
-----> Launching... done, v6
       http://pettanr.herokuapp.com deployed to Heroku

To git@heroku.com:pettanr.git
 * [new branch]      master -> master
ここまでいけばherokuアプリケーションを開ける。
C:\Sites\heroku\pettantemp>heroku open
まともには開かないでエラーページが出る。作業はここで終わらない。チャレンジャーはログを見る。
C:\Sites\heroku\pettantemp>heroku logs

db構築

実はまだheroku上のdbにテーブルを構築してない。ローカルでは

C:\Sites\heroku\pettantemp>rake db:migrate
のようにrakeコマンドを使うが、herokuでは
C:\Sites\heroku\pettantemp>heroku run rake db:migrate
とやっていく。他のrakeコマンドも同様。

管理者アカウントの作成

管理者アカウントの作成ではrakeコマンドではなく、railsコマンドを使う。consoleを開いてirbから実行する。

C:\Sites\heroku\pettantemp>heroku run console
irb(main):001:0> Admin.start('admin@mail.adr.ess', 'admin_password')
=> true
irb(main):002:0> SpeechBalloonTemplate.import('')
irb(main):003:0> exit

ライセンスのインポート

ライセンスのインポートはrakeコマンドを使う。

C:\Sites\heroku\pettantemp>heroku run rake licenses:import

どうだ?

ここまでいけばぺったんRが動くはず。ワッショイ!

C:\Sites\heroku\pettantemp>heroku open

その他インポート

フキダシテンプレート、色など、必要に応じて突っ込む。