Mac で Heroku+node.js の環境を作る

# Mac で Heroku+node.js の環境を作る

手元のMacを使って、習学目的で [Heroku](http://www.heroku.com) で node.js のアプリを動かしてみようと思う。

（参考資料）
[Herokuの新料金はお得なのか](http://blog.flect.co.jp/labo/2015/05/free-dyno-fae3.html) - [フレクトのHeroku lab](http://blog.flect.co.jp/labo/)
[Macにnodebrew（node.js, npm）をインストールする手順](http://qiita.com/oreo3@github/items/622fd6a09d5c1593fee4) - Qiita
[nodebrew で Mac の Node.js 環境をスッキリさせた](http://akiyoko.hatenablog.jp/entry/2015/06/20/132239) - [akiyoko blog](http://akiyoko.hatenablog.jp/)
[Node.jsのデーモン化ツールpm2をインストール](http://qiita.com/abgata20000/items/4720a88060c43a2cd2ee) - Qiita

## Heroku の登録とログイン

Heroku では、Free アカウントは日に18時間までの利用が可能とのこと。30分アクセスがなければ自動的にsleepし、また18時間以上利用すると6時間sleepでお寝んねとのこと。

基本的には Heroku の Introduction に従って、指示されたことをしてみると良い。基本的な理解はここで全てできる。ここに書くのもその補足などである。

### 登録

さて。Heroku 利用は初めてなのでアカウント作成から。
登録に関しては特に問題なく終了できたので、詳細は割愛。

### Heroku サービスへのログイン

Heroku の Web に作成したアカウントでログインすると Dashboard がお目にかかる。Dashboard から Node.js の Get Started を選び、Introduction へ進む。この Introduction では、Mac のターミナルで実行するプログラム *Heroku Toolbelt* のインストールから、Node.js の基本的な構成（設定ファイル）などを教示してくれる。特に後者は、ポイントを押さえてくれていて、分かりやすくありがたい（英語ですがね）。

### サンプルプログラムのデプロイ

1. Introduction に従って、*Heroku Toolbelt* をDLして、pkg ファイルをインストールする（GUI上は変化はないよ。ターミナルで `heroku` コマンドが使えるようになる）。
2. ターミナルでサンプルプログラムを Git から手に入れ、Heroku へデプロイする。
3. コードを編集し、Heroku アプリ側の領域に作った Repository に `git push` する。

だいたいこんな流れ。
AWS などのインスタンスだと ssh などを使って当該マシンにログインしたりするが、Heroku の場合はローカル環境から自分の Heroku アプリをコントロールするようだ。そういった総合的な操作のコマンドの名前も `heroku` である。

```
$ # Mac の GUI から heroku-toolbelt.pkg をインストール後
$ heroku
Installing Heroku Toolbelt v4... done.
For more information on Toolbelt v4: https://github.com/heroku/heroku-cli
Setting up node-v4.2.1... done
Installing core plugins heroku-cli-addons, heroku-apps, heroku-fork, heroku-git, heroku-local, heroku-run, heroku-status... done
(...snipped...)

$ heroku login
(...snipped...)
$ # 適当な作業ディレクトリを作る
$ mkdir -p ~/devel/heroku/sample
$ cd ~/devel/heroku/sample

$ # サンプルプログラム
$ git clone https://github.com/heroku/node-js-getting-started.git 
$ cd node-js-getting-started

$ # アプリの作成
$ heroku create

$ # アプリのデプロイ
$ git push heroku master
Counting objects: 430, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (335/335), done.
Writing objects: 100% (430/430), 221.59 KiB | 0 bytes/s, done.
Total 430 (delta 62), reused 430 (delta 62)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Node.js app detected
(...snipped...)
remote:        https://hogehoge-fugafuga-5963.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.

$ # ランダムのサブドメインでWebアプリ https://hogehoge-fugafuga-5963.herokuapp.com/ が作られた
$ # 稼働状況を確認
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free.
$ # ブラウザで確認。↓ブラウザを開いてくれるショートカット。
$ heroku open
Opening hogehoge-fugafuga-5963... done
```

## ローカル環境（Mac）に Node.js の開発環境を整える

ローカルの Mac に Node.js をインストールすれば、ローカルで動作内容などを確認しながら開発しつつ、完成版を Heroku にデプロイする、という流れを作れる。

### nodebrew のインストール

冒頭の参考ページを参照しながら、nodebrew をインストールする。

```
$ cd
$ curl https://raw.githubusercontent.com/hokaccha/nodebrew/master/nodebrew | perl - setup

# カレントのパスを通す
$ export PATH=$HOME/.nodebrew/current/bin:$PATH

# .bash_profile にも記述しておく
$ vi .bash_profile

(... snipped ...)
export PATH=$HOME/.nodebrew/current/bin:$PATH

# nodebrew を最新版に
$ nodebrew selfupdate
```

### node.js と rpm のインストール

同じ記事を参考に Node.js の最新版をインストールする。
なお、サンプルプログラムが、`v0.12.7` を使っていたので、それに合わせた。
が、`libgcc_s.so` のバージョン違いで、コンパイルの際、リンクで失敗する。

```
$ # インストール失敗
$ nodebrew install latest
(...snipped...)
ld: library not found for -lgcc_s.10.5
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [/Users/onodera_takahiro/.nodebrew/src/v0.12.7/node-v0.12.7/out/Release/openssl-cli] Error 1
make: *** [node] Error 2
```

`libgss_s.so` の当該バージョンをソースからコンパイルするのもちょっと手間かもなので、別なページを参考に、バイナリインストールをしてみる。

```
$ nodebrew ls-remote
$ nodebrew install-binary v0.12.7
Installed successfully
$ nodebrew ls
v0.12.7
current: none
$ nodebrew use v0.12.7
use v0.12.7
$ node -v
v0.12.7
```

`npm` も最新版に更新しておく。なお、npm は Node.js のパッケージ管理ツールである。

```
$ npm install -g npm
```

### ローカルの Mac でサンプルページを動かす

ローカルで開発できるようにするために、localhost でアプリを実行させるようにする。
サンプルプログラムのディレクトリで、`npm` を実行して、モジュールの依存関係を解決する。ま、要はローカルで必要なモジュールをインストールするってことね。

```
$ # サンプルをインストールした場所
$ cd ~/devel/heroku/sample/node-js-getting-started
$ npm install
```

コマンド `heloku` で、アプリを起動する。5000番ポートで受け付けるアプリが立ち上がるはずだ。

```
$ heloku local web
```

ブラウザを使って、`http://localhost:5000/` にアクセスして、サンプルアプリのページが開けばOK。

## （補足）pm2 を使って動かしてみる

コマンド`heloku`を使ってもいいが、この場合、Daemon化していないので当然ながらプロンプトは返ってこない。なので適当なDaemon化ツールをインストールしてみる。
`forever` とか有名っぽいけど、多機能・高性能な `pm2` を、後学のためにもインストールしてみた。
インストールの仕方とかは、[こことか](http://qiita.com/abgata20000/items/4720a88060c43a2cd2ee)たくさんあるので、詳しい話は割愛。

```
$ # pm2 をグローバルインストールする
$ npm install -g pm2

$ # サンプルディレクトリに
$ cd ~/devel/heroku/sample/node-js-getting-started
$ pm2 start index.js
$ pm2 list
$ pm2 stop index.js
```

(EOF)