久々にサイトを作ろうと思いたち、pushでデプロイされる環境で開発したくて、勉強も兼ねてサーバはherokuで、開発環境をvagrantで作ったので、手順メモ。
環境
cakephpはcomposerの最新が2.6だったので、versionはそれで。
- git
- composer
- cakephp2.6
Vagrant
本当は一からVagrantfile
ファイル作りたいのですが、(まだ勉強不足なのと)個人サイトなので、一旦先人の知恵を借りてcakephp+vagrantなgitから環境作ります。
作業用ディレクトリに移動
puppet
で環境構築するようです。仮想環境なので、何で構築しようが気にしなくていいのもvagrantの魅力ですね。
起動します。
Vagrantfile
に書いてますが、IPは33.33.33.10
が割り当てられるので、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
が追加される - 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/" } }
で、書いたものをインストール
cakephp
この時点では、cakephpの本体部分しかないので、スケルトンを作成(参考:ComposerでCakePHPをインストール)
この時点で、ファイル構成は、
- cakephp-Vagrant/ -- Procfile -- Vagrantfile -- Vendor/ -- app/ -- composer.json -- composer.lock -- puppet/ -- webroot/
こうなってるはず。で、webroot
をapp
ディレクリ内webroot
をコピーして持ってきます。
(※本当はapp/webroot
をそのままドキュメントルートにしたかったのですが、うまくいかず断念)
で、もろもろ足りないのはわかりつつも、一旦 http://cakphp26.localhost
にアクセスして見て、画面真っ白。とりあえず
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してみます。
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を追加してみます。
一応無料ですが、スペックは、、、(参考)5M!!5Mで何か保存できるの。。。という不安が拭えないですが、無料なのでしょうがないですね。
ID/password はこうやって取得するようです。(参考)
<?php $url = parse_url(getenv("CLEARDB_DATABASE_URL")); $server = $url["host"]; $username = $url["user"]; $password = $url["pass"]; $db = substr($url["path"], 1); $conn = new mysqli($server, $username, $password, $db); ?>
なるほどー、環境変数にURLの形で保存されているので、それを解析することで、ソースに直接書かないようにしてるんですね。
※ちなみにこの環境変数の中身は
で確認できます。
DB on Vagrant
vagrant上のdbはmysqlがすでにインスールされています。が、dbも何もないので作ります。rootユーザのパスワードは、こちらに書かれていました。
puppet/modules/mysql-server/manifests/init.pp
なので、これでvagrant上にdbを作っていきます。
※あとで、自動化したいとこ
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
さて、これでいよいよ楽しい開発の始まり〜