やりたいこと
Rails TutorialをやっているとHerokuを標準で使います。しかし今後Webアプリを公開していく上で、Herokuだと無料運営ができなさそうなので、無料運営可能なIBM Bluemixにもデプロイしたい。
Rails Tutorial のhello appをIBM Bluemixにデプロイしようとしてはまった件で、hello appのデプロイまでできたので、次はtoy app。何が違うかというとデータベースを使う点。Herokuでは特に意識せずにできたけれど、IBM Bluemixでもデータベースを使って、Ruby on Railsの開発を行いたい。
注意事項ですが、IBM Bluemixは日々変化しています。私がもたもた検証している間でも、ログイン画面が変わったりしました。内部的にも色々変わっているかも。。。そのため古い情報になっている可能性があることを認識下さい。
私もインターネットで調べたりしましたが、古い情報で提供されているサービスもかなり違っているようでした。そのため昔はできたけど、今はできない。その逆もかなりあると思います。
実験
IBM Bluemixのサービス(PostgreSQL by Compose)でpostgresqlのデータベースを使う(無料では不可)
- Herokuと同じpostgresqlを使えばそのままtoy appをデプロイできるはず
- IBM BluemixにあるPostgreSQL by Composeのサービスを追加して、バインド
- 接続情報は自動で生成
- 結果はエラー
- 問題は「by Compose」。ComposeはDBaaS(DataBase as a Service)で、データベース本体はComposeにある(Composeではデータベースを作っていなかった)
- PostgreSQL by Composeは、Composeのデータベースに接続するだけ
- Composeのpostgresqlは、30日は無料だけど、その後は有料
- 元々の目的の、無料で運営が不可になるので、却下
sqliteでデータベースを使う(不可)
- sqliteはgemの設定とdatabase.ymlの設定だけで簡単に使えるはず
- development環境ではsqliteを使っているので、production環境も同じにする
- 結果はエラー(接続エラー)
Instance (index 0) failed to start accepting connections
- Herokuでもsqliteは使えないように、IBM Bluemixでも使えないよう
- おそらくPaaSだとファイルシステムに自由に書き込まれるのは問題があるから?
IBM Bluemixのサービス(dashDB)でdashDBのデータベースを使う(最終的に成功)
- dashDBは無料で提供されている
- gemのibm_dbをインストールすれば使える(Gemfileに追加)
- dashDBのサービスを追加して、バインドすれば接続情報も自動で作成
- 結果はエラー(以下の事を解決することで成功しました)
Railsのproduction環境のデータベースの基本
-
db:migration時に、オプションを付ける~~RAILS_ENV=production~~
デフォルトはdevelopmentのため
dashDBはclob型がない
- Railsでテーブル項目の型をtextにしているとclob型でテーブルを作成する
- dashDBにはclob型がないためエラー
- ibm_dbはDB2用のgemのため、DB2の型になるよう
- textをstringに変更して対応
方法
- toy appを作成する
- Gemfileにibm_dbを追加(productionのグループ)
gem 'ibm_db'
- db/migrateのmicropostのマイグレーションファイルのtextをstringに変更
- rakeコマンドをつけてcf push(なぜかエラー。次の手順コマンドを削除して再起動すると起動します)
cf push --command "bundle exec rake db:migrate"
- コマンドを削除
cf push --command ""
感想
使ったことのあるsqlite,postgresql,mysqlなどがよかったのですが、今回初めてdashDBを使いました。型の部分は、暫定対応なのですが、ibm_dbがDB2用に提供されている限り、dashDBはどうすることもできないのか。。。しかし無事接続できてよかったです。
ここには記載してないですが、試行錯誤の中ではdatabase.ymlを変えてみたり、manifest.ymlを変えてみたりと色々試しました。最終的に必要な部分だけをまとめましたが、IBM Bluemixの仕様も絡むところが多く、整理が必要だと感じています。
Railsも勉強中の上、IBM Bluemixの仕様もあるので問題の切り分けに時間がかかりましたが、こうやって試行錯誤していくうちに、それぞれの仕様が理解できていくので、よい経験だと思います。
未解決事項
cf push するときに必ず出るエラーがあります。
- Cloning into '/tmp/buildpacks/ruby-buildpack'..
- Cloning into 'compile-extensions'...
- 下記manifest.ymlに記載ある、cloudfoundryのbuildpackだと出るようです。Bluemix標準のを使うと出ませんでした。
- ただBluemix標準のものだとibm_dbのgemがちゃんとインストールされず、cloudfoundryのだとインストールされて動きました。
他にもcf push するときに rake db:migrate のコマンドなどを入れると違うエラーが出たり。。。もう少し調べる必要があると思っています。
使ったmanifest.yml
manifest.yml
applications:
- name: app-name
host: app-name
domain: au-syd.mybluemix.net
buildpack: https://github.com/cloudfoundry/ruby-buildpack
instances: 1
memory: 128M