heroku上にbaukisをデプロイして動かしてみました。

はじめに

  • 「herokuって何ですか?」
    無料で試用できる、Webアプリの実行環境。とでもいえばいいんでしょうか。
    よくわからん。ってひとは、自分で調べたほうが早いです。

  • 「baukisって何ですか?」
    以下の書籍内で、作成することになる、Railsのサンプルアプリです。
    book.impress.co.jp
    完成品のソースコードや、Vagrantfileは↓からダウンロードできます。
    www.oiax.jp

heroku上で、Railsアプリを動かすときは。

ひとまず、以下のリンク先のページを読めば、なんとかなるでしょう。
Getting Started with Rails 4.x on Heroku | Heroku Dev Center

なんとかならない人は、今回のこの記事を読めば少しは役に立つかもしれません。

 

私が、heroku上で動かしたbaukisへのリンク先

Admin top page - Baukis
Staff top page - Baukis

もちろん、ログインパスワードは変えてありますし、教えませんよ。

 

私が、heroku上でbaukisを動かしたときの、メモ

ここからが本題。(内容は、自分用の備忘録です。特に難しいことはありません。)

自分のbaukisがMySQLで動いている場合は、 PostgreSQLで動くように変更します。

heroku上でwebアプリを動かす時は、PostgreSQLがデフォルト。
MySQLを使いたいときは、クレジットカード情報を登録しなければならないとかなんとか。

herokuについて、いろいろ調べるのは面倒なので、
アプリ(baukis)をPostgreSQLで、動くようにしちゃったほうが手っ取り早いでしょう。

どうせ、データベースに投入してあるデータは、テスト用のダミーデータでしょう。
全部消して、一からデータベースを作るだけなら、簡単でしょう。
(データベースのデータを移植しない場合ってこと。)

やりかたを箇条書きしておきます。
・Gemfile内の mysql と書いてあるところを pg に変更する。
・PostgreSQL用に config/database.yml を書き換える。
・bin/bundle を実行して、gem(pg)をインストールする
・"bin/rake db:migrate:reset", "bin/rake db:reset" とかで、DBのデータを一から構築する。(シードデータ生成スクリプトは既に持ってるはず。)
もし、PostgreSQLが入ってない場合は、yumとかapt-getでインストールしましょう。

とりあえず、私が使った、config/database.yml を貼り付けておきます。

$ cd /vagrant
$ egrep "pg|mysql" Gemfile 
gem 'pg'
$ 
$ cat config/database.yml 
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
development:
  <<: *default
  database: baukis_development
test:
  <<: *default
  database: baukis_test
production:
  <<: *default
  database: baukis_production

一番手っ取り早いのは、
「baukis/db/seeds/developmentをコピーして、新たにproductionを作る。」これだけでしょう。
もちろん、スクリプトを変更して、ログインパスワードは変えておきます。

手元で動かないものは、heroku上でも動かないですね。当たり前ですが。

念の為、
・ ~/.baukis_secret_key_base ファイルがあること(本に従って自分が作成しているはず)
・ 環境変数 $SECRET_KEY_BASE に、そのファイルの内容がセットされてること
は、チェックしておきましょう。

$ ls -l ~/.baukis_secret_key_base 
-rw-rw-r-- 1 vagrant vagrant 128 Dec 10 14:33 /home/vagrant/.baukis_secret_key_base
$ echo $SECRET_KEY_BASE
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (ランダムの文字列がこんな感じで表示されます。)

— ここまでが、大前提 —

これも、やり方は、適当にwebサイトを漁れば、いくらでも情報は出てきます。

heroku CLIは↓を見れば、やり方が書いてあります。
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.07 - Qiita
(wget使って、インストールシェルを実行している。)

gitは、最初からLinuxレポジトリに登録されてあるはずなので、
"apt-get install" とか、yum とかで、インストールするだけですね。

baukisの書籍で紹介されている、Vagrantfile。
これを使って、VMのLinuxを構築していれば、確実にapt-getとかyumが使えるはずです。
あくまで、VMのLinuxにgitをインストールする。って話なので、
俺はMACだから、とか、俺はWindowsだから、とかって話にはなりません。

前出ですが、Vagrantfileは、
『実践Ruby on Rails 4』読者サポートページ - Ruby on Rails with OIAX
ここにダウンロード先のリンクが書いてあります。

config/database.yml の記述は、1に書いてあります。
1のプロセスをスキップした人は、ここで、忘れずに書き換えて置きましょう。

さて、この項は、少し悩んだのですが、
・手元のvagrant上のVMで動いているbaukis
・heroku上で動かす予定のbaukis

全く同じアプリですが、当然、実行環境が違います。
そして、この2つは並走させたいです。
ならば、2つのbaukisに対して、それぞれ別々のURLを用意する必要がある。(はずです。)

じゃあ、どうしようか?と考えたのですが、
「config/environments/production.rb を、ベタ書きで変更する。」
これでいくことにしました。(手抜き。)

以下、config/environments/production.rb の変更内容。

$ git diff
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 3873377..7e71834 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -82,11 +82,11 @@ Rails.application.configure do
   config.active_record.dump_schema_after_migration = false
 
   config.baukis = {
-    staff: { host: 'baukis.example.com', path: '' },
-    admin: { host: 'baukis.example.com', path: 'admin' },
-    customer: { host: 'example.com', path: 'mypage' }
+    staff: { host: 'baukis-dup.herokuapp.com', path: '' },
+    admin: { host: 'baukis-dup.herokuapp.com', path: 'admin' },
+    customer: { host: 'baukis-dup.herokuapp.com', path: 'mypage' }
   }
 end
"baukis-dup.herokuapp.com" ってのは、私がheroku上で動かす予定のbaukis。
これのドメイン名です。

本当は、"baukis.herokuapp.com"という名前を使いたかったんですが、
既に、誰かが使っている名前だったので、使えませんでした。
(heroku上でのアプリケーション名は、ユニークである必要があるようです。)

例えば、
baukis.herokuapp.com を作る場合は、以下のコマンドを実行するわけですが、
$ heroku create baukis
Creating ⬢ baukis... !
 ▸    Name is already taken
"Name is already taken" と怒られてしまいます。

当然、私が使っている "baukis-dup.herokuapp.com" も使えません。
各自、適当にユニークネームを考えてください。

大した操作では無いので、操作logだけ貼り付けておきます。
以下参照です。

$ cd /vagrant
$ git init
Initialized empty Git repository in /vagrant/.git/
$ git add .
$ git commit -m "Init"
[master (root-commit) 8004838] Init
 685 files changed, 85998 insertions(+)
 create mode 100644 .rspec
 create mode 100644 .ruby-version
    :
    : (長いので省略)
    :
$ 
$ git log
commit 8004838cafad7de20acf2337323d392b824d5956
Author: Admin for baukisdup <you@example.com>
Date:   Thu Feb 9 16:21:21 2017 +0900

    Init

また、操作logだけ貼っておきます。

$ cd /vagrant
$ heroku create baukis-dup
Creating ⬢ baukis-dup... done
https://baukis-dup.herokuapp.com/ | https://git.heroku.com/baukis-dup.git
$ git config --list | grep heroku
remote.heroku.url=https://git.heroku.com/baukis-dup.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
また、一応の注意として、名前を指定してcreateしたほうが良さそうです。

既に作成済みの "~/.baukis_secret_key_base"
この値を、heroku上のbaukisでも使うことにします。

以下、操作log

$ cd /vagrant
$ heroku config:set SECRET_KEY_BASE=`cat ~/.baukis_secret_key_base`
    : (実行結果は省略)
ファイルを作成してなければ、以下の操作で作れます。
$ ruby -e 'require "securerandom";  print SecureRandom.hex(64)' > ~/.baukis_secret_key_base

例によって、また操作logだけ貼っておきます。以下参照です。

$ cd /vagrant
$ git push heroku master
Counting objects: 618, done.
Compressing objects: 100% (581/581), done.
Writing objects: 100% (618/618), 1.70 MiB | 228.00 KiB/s, done.
Total 618 (delta 200), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
    :
    : (実行結果は、かなり長いので省略)
    :
To https://git.heroku.com/baukis-dup.git
 * [new branch]      master -> master

vagrant上のVMでrakeコマンドを使うのと、全く同じ感覚で、データベースを作ることができます。

例によって、また操作logだけ貼っておきます。以下参照です。

$ cd /vagrant
$ heroku run rake db:migrate
Running rake db:migrate on ⬢ baukis-dup... up, run.8340 (Free)
Migrating to CreateStaffMembers (20161213034748)
    :
    : (実行結果は、かなり長いので省略)
    :  
$ 
$ heroku run rake db:seed
Running rake db:seed on ⬢ baukis-dup... up, run.4824 (Free)
Creating staff_members....
Creating administrators....
Creating administrators....
Creating staff_events....
Creating customers....
$ 
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free
$ 
$ heroku ps
=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2017/02/09 16:27:34 +0900 (~ 1m ago)

ちなみに、"rake db:setup" を使うと、何故か怒られてしまいました。(以下参照。)
$ heroku run rake db:setup RAILS_ENV=production
Running rake db:setup RAILS_ENV=production on    gentle-atoll-64698... up, run.5341 (Free)
FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
  :
  : (結果は長いので省略)
  :
あまりちゃんと調べてないのですが、
heroku では、複合系のコマンド(db:setupは、db:create,db:schema:load,db:seed の複合)は、
何故か失敗するとかなんとか。って話を、散見しました。

私も「手元のvagrantではrakeコマンドで、問題なくDB操作できるのに、heroku ではうまくいかない。」
ってケースを、結構体験させられました。

"rake db:migrate:reset", "rake db:reset" このあたりも、うまくいかなかった記憶があります。。。
しかし、"rails_12factor"のgemを入れて、ログを強化しておけば、どうにか対処できると思います。


ちなみに、私が、heroku上のbaukisに全くログインできない状況に遭遇したときに、以下のようなlogがコンソールに出ていました。
 app[web.1]: PG::UndefinedTable: ERROR:  relation "staff_members" does not exist
 app[web.1]:   Rendered errors/internal_server_error.html.erb within layouts/staff (0.3ms)
 app[web.1]:   Rendered staff/shared/_header.html.erb (0.5ms)
 app[web.1]:   Rendered shared/_footer.html.erb (0.1ms)
 app[web.1]: Completed 500 Internal Server Error in 8ms (Views: 2.3ms | ActiveRecord: 3.0ms)
この問題は、DBが全く作成されていないことが原因で、
つまり、結局、"heroku rake db:xxxx" がうまくいってなかったって話だったのですが、
結構、トラブルシューティングに時間を割くことになりました。

つまんないトラブルですが、対処するのが意外と面倒だったりします。
"rails_12factor"のgemは役に立ちますです。