vagrant上で開発してherokuにデプロイする環境を構築
久々にサイトを作ろうと思いたち、pushでデプロイされる環境で開発したくて、勉強も兼ねてサーバはherokuで、開発環境をvagrantで作ったので、手順メモ。
環境
cakephpはcomposerの最新が2.6だったので、versionはそれで。
git
composer
cakephp2.6
Vagrant
本当は一からVagrantfileファイル作りたいのですが、(まだ勉強不足なのと)個人サイトなので、一旦先人の知恵を借りてcakephp+vagrantなgitから環境作ります。
git clone git://github.com/borivojevic/cakephp-vagrant
作業用ディレクトリに移動
cd cakephp-vagrant/
puppetで環境構築するようです。仮想環境なので、何で構築しようが気にしなくていいのもvagrantの魅力ですね。
起動します。
vagrant up
Vagrantfileに書いてますが、IPは33.33.33.10 が割り当てられるので、hostsに分かりやすい名前つけておきます。
sudo vim /etc/hosts
33.33.33.10 cakphp26.localhost
ドキュメントルートはwebrootに設定されているので、適当にwebroot/index.php をおいて、ここhttp://cakphp26.localhostにアクセスして確認。
この作業用ディレクトリがvagrant上の/vagrant/ と共有されていますので、ここにソースファイルを置いていけばokです。
heroku
herokuはアカウント登録後めっちゃ丁寧にintroductionあるので、pushしたらサイトに反映って流れはそれに従うだけで簡単にできます。
一度それに従ってなんとなく構造が分かったので、今回必要な分だけ挙げておきます。
先ほど作業していたディレクトリと同じ場所で
- heroku環境作成。git remoteにherokuが追加される
heroku create (好きなアプリ名)
introduction の php-getting-started.gitにある、composer.jsonファイルを参考に、手を加える
addonなど使うために、クレジットカード情報は登録しておく。(無料枠でもこの情報が必要)
composer.json
{
"name": "example-app",
"repositories": [
{
"type": "pear",
"url": "http://pear.cakephp.org"
}
],
"require": {
"cakephp/cakephp": "2.6.*"
},
"config": {
"vendor-dir": "Vendor/"
}
}
で、書いたものをインストール
composer install
cakephp
この時点では、cakephpの本体部分しかないので、スケルトンを作成(参考:ComposerでCakePHPをインストール)
Vendor/bin/cake bake project app
この時点で、ファイル構成は、
- cakephp-Vagrant/
-- Procfile
-- Vagrantfile
-- Vendor/
-- app/
-- composer.json
-- composer.lock
-- puppet/
-- webroot/
こうなってるはず。で、webrootをappディレクリ内webrootをコピーして持ってきます。
(※本当はapp/webroot をそのままドキュメントルートにしたかったのですが、うまくいかず断念)
で、もろもろ足りないのはわかりつつも、一旦 http://cakphp26.localhost にアクセスして見て、画面真っ白。とりあえず
vagrant ssh
tail -f /var/log/apatch2/error.log
で、apacheのエラーログ(/var/log/apache2/errorl.log)見ながらwebroot/index.php の修正したり、権限変更してエラーを消して、cakephpは完了。DBは一旦後回し。
Procfile
cakephpのドキュメントルートはwebrootなのでProcfileを
web: vendor/bin/heroku-php-apache2 webroot/
に書き換える。
※と思ったら、これが不十分で、heroku上でapplication errorが発生。調べてみるとパスをこのように変えるのがいいらしい
web: $(composer config bin-dir)/heroku-php-apache2
composer config bin-dirの値が設定値になるようです。(参考)
デプロイ
さて、これで一度pushしてみます。
git push heroku master
heroku open
・・・
しばらく待って、ブラウザで見ると真っ白な画面が。。。heloku logs –tailでログを見てみると、パスのエラーが。vagrant上で動く前提で書いていたのでそりゃエラー出ますね。
このように今回は、ROOTを
// define('ROOT', "/vagrant");
define('ROOT', dirname(__FILE__)."/..");
ローカルのvagrantとheroku両対応に書き換え再度push。cakphpの初期画面が確認できたらOK!
DB on heroku
まずは、heroku側でDB用意してます。freeのmysql addonを追加してみます。
heroku addons:docs cleardb
一応無料ですが、スペックは、、、(参考)5M!!5Mで何か保存できるの。。。という不安が拭えないですが、無料なのでしょうがないですね。
ID/password はこうやって取得するようです。(参考)
なるほどー、環境変数にURLの形で保存されているので、それを解析することで、ソースに直接書かないようにしてるんですね。
※ちなみにこの環境変数の中身は
heroku config:get CLEARDB_DATABASE_URL
で確認できます。
DB on Vagrant
vagrant上のdbはmysqlがすでにインスールされています。が、dbも何もないので作ります。rootユーザのパスワードは、こちらに書かれていました。
puppet/modules/mysql-server/manifests/init.pp
なので、これでvagrant上にdbを作っていきます。
※あとで、自動化したいとこ
vagrant ssh
mysql -u root -p
create database local_db
これでローカルのvagrantとheroku上にdbが出来たので、環境によってDB設定が切り替わるようcakephpを書き換えたらpushします。
これで
CakePHP is able to connect to the database.
が出ればOK!
まとめ
Vagrant上で開発しherokuにdeployする環境を作った
中身はapache + mysql + cakphp2.6
さて、これでいよいよ楽しい開発の始まり〜