vagrant上で開発してherokuにデプロイする環境を構築

2015/02/03

久々にサイトを作ろうと思いたち、pushでデプロイされる環境で開発したくて、勉強も兼ねてサーバはherokuで、開発環境をvagrantで作ったので、手順メモ。

環境

cakephpはcomposerの最新が2.6だったので、versionはそれで。

  • git
  • composer
  • cakephp2.6

Vagrant

本当は一からVagrantfileファイル作りたいのですが、(まだ勉強不足なのと)個人サイトなので、一旦先人の知恵を借りてcakephp+vagrantなgitから環境作ります。

vagrant-cakephp

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/

こうなってるはず。で、webrootappディレクリ内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__)."/..");

ローカルのvagrantheroku両対応に書き換え再度push。cakphpの初期画面が確認できたらOK!

DB on heroku

まずは、heroku側でDB用意してます。freeのmysql addonを追加してみます。

heroku addons:docs cleardb

一応無料ですが、スペックは、、、(参考)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の形で保存されているので、それを解析することで、ソースに直接書かないようにしてるんですね。

※ちなみにこの環境変数の中身は

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

さて、これでいよいよ楽しい開発の始まり〜