iojs + express環境をherokuへdeploy


iojsとexpress環境をherokuへデプロイしたのでメモ。

基本的には参考記事の流れ通りにセットアップして、iojs用に少し記述を変更しました。あとはfacebookのAPI Secretなどcommitしたくない情報の扱いについてです。

ベースのセットアップ

基本は以下の記事通りにセットアップを進めます。

参考記事
http://tacamy.hatenablog.com/entry/2013/02/16/235127

参考記事の流れをざっとおさらいします。

  1. Heroku Toolbeltをインストール
  2. コマンドでログイン
    heroku login
  3. 既にあるgithub用の作業ディレクトリに移動しheroku create
    heroku create xxx

    xxxはheroku上のアプリの名前でhttps://xxx.herokuapp.com/に対応します。

  4. Procfileを作る
  5. pacakge.jsonに追記
  6. SSH Keyの登録
  7. Herokuへpush

iojs用に書き換えるところ

上記の処理の「4. Procfileを作る」、「5. pacakge.jsonに追記」の部分について通常のnodeでdeployするときと比べて少し変更が必要です。

Procfileをiojs用にする

デプロイされたアプリ起動時に実行されるスクリプトの記述はnodeではなくiojsにします。

web: iojs ./bin/www

package.jsonに追記するenginesエントリをiojs用にする

package.jsonのenginesのエントリはnodeではなくiojsにして、iojsのバージョンを記述します。

  "engines": {
    "iojs": "v1.2.0",
    "npm":  "2.5.1"
  }

以上の設定をした上で、herokuにgit pushすればきちんとhttps://xxx.herokuapp.com/にアクセスして動作確認ができるかと思います。便利!

github上のブランチがmasterではない時の対応

基本的なセッティングはもうできていますが、自分の環境はgithub用にdevelopブランチで作業していたものをherokuにデプロイするときに少しはまりました。

pushする際には、developブランチからherokuのmasterへpushすることを以下のコマンドで明示しましょう。

git push heroku develop:master

API keyなどsecretな情報を扱う方法

今回自分が作成しているアプリはFacebook認証の機能を入れようとしていて、node+express環境に提供されているpassportを使っています。そこでFBのAPI Keyなど、git上にcommitしたくないsecretな情報をどうやってherokuで扱うかという問題に直面しました。

もちろん解決策はあって、heroku上にnode/iojsから読める環境変数をセットする方法を使います。
ローカルで開発しているときは.gitignoreなどに追加しているconfigファイルを用意してそちらを読めばいいと思います。

以下の例はFacebook Applicationとして登録している時の例。

configuration/config.js(.gitignoreに追加済みのローカル開発環境で使うconfigファイル)

module.exports = {
    'FB_API_KEY': 'xxxxxxxxxx',
    'FB_API_SECRET': 'xxxxxxxxxx',
    'FB_CALLBACK_URL': 'http://xxxxx/auth/facebook/callback'
};

それに対応したconfigをherokuの環境変数にセットする

heroku config:add FB_API_KEY=xxxxxxxxxx
heroku config:add FB_API_SECRET=xxxxxxxxxx
heroku config:add FB_CALLBACK_URL=https://xxxxx.herokuapp.com/auth/facebook/callback

今回はローカルのconfigファイル(.gitignoreされていてcommitされることは無い)があればそちらを優先的に読み、なければ環境変数をconfigにセットするようにしています。

app.js

...

var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
var config = {};
try{
  config = require('./configuration/config');
}catch(e){
  // no config file try to env for deployment
  config = process.env;
}

...

// Use the FacebookStrategy within Passport.
passport.use(new FacebookStrategy({
    clientID: config.FB_API_KEY,
    clientSecret:config.FB_API_SECRET ,
    callbackURL: config.FB_CALLBACK_URL
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function () {
      //Check whether the User exists or not using profile.id
      //Further DB code.
      return done(null, profile);
    });
  }
));

...

以上、herokuはとりあえず無料で使えるのはやっぱいいっすね〜。

そんなこんなで作成したdev morningで最近一人でコツコツやっているiojsプロジェクトをherokuにデプロイしてみました。

MeetApp
http://meetapps.herokuapp.com/

スクリーンショット 2015-03-01 16.31.49

開発に興味ある方は是非ご参加をw

36th Dev Morning
http://devmorning.connpass.com/event/12525/