Herokuのapp作成手順（buildpack-multiを使う場合も含む）

既に`Gemfile`, `Gemfile.lock`, `Procfile`があり（もちろんコードもある）、`git init`, `git add .`, `git commit`している状況とします（`git init` してない場合を追記しましたが）。
ちなみに、Papertrailでログを見る場合、ソースコードには標準出力をバッファしないよう

```
$stdout.sync = true
```
を入れておくことをオススメします。
#appの名前
appの名前を`app-test`とします（仮名です）。
（`app_test`としようかと一瞬思いましたが、herokuのapp名にアンダースコアが使えないのを思い出しました）
#app登録
```bash
$ heroku create app-test
Creating app-test... done, stack is cedar-14
http://app-test.herokuapp.com/ | git@heroku.com: app-test.git
Git remote heroku added
```
この `heroku create` コマンド（`heroku apps:create` コマンドのエイリアス）により

```bash:.git/configの一部
[remote "heroku"]
	url = git@heroku.com:app-test.git
	fetch = +refs/heads/*:refs/remotes/heroku/*
```
が設定されます。
### 複数の app を登録する場合（2015/12/11追記）
新しいリモートレポジトリ名（`heroku2`）を指定します。

```bash
$ heroku create app-test2 --remote heroku2
Creating app-test2... done, stack is cedar-14
http://app-test2.herokuapp.com/ | git@heroku.com: app-test2.git
Git remote heroku2 added
```
これにより、`git push heroku master` で app-test にプッシュし、`git push heroku2 master` で app-test2 にプッシュできます。
なお、`heroku` コマンドを使う際にはどちらのapp が対象なのか指定しないとエラーになります。なので `heroku xxx --remote heroku` または `heroku xxx --remote heroku2` のような形式で指定を行う必要があります。（もしくは、アプリ名を指定して `heroku xxx --app app-test` または `heroku xxx --app app-test2`）
もちろん `heroku` コマンドの remote デフォルト指定も出来ますので、普段扱う app を指定しておくと良いでしょう。次の git コマンドでデフォルト指定が出来ます。

```bash
$  git config heroku.remote heroku
```
なお指定するのは **app 名では無くレポジトリ名** です。
この指定により

```bash:.git/configの一部
[heroku]
	remote = heroku
```
が登録され、`heroku xxx` だけであれば app-test app を、`heroku xxx --remote heroku2` と指定すると app-test2 app を対象として `heroku` コマンドが実行されます。
参考：[Managing Multiple Environments for an App | Heroku Dev Center](https://devcenter.heroku.com/articles/multiple-environments)
（2015/12/11追記ここまで）
### app 登録のときに buildpack-multi を設定（2015/11/30追記）
一気に設定出来るようです（当方未確認）。

```bash
$ heroku create app-test --buildpack https://github.com/heroku/heroku-buildpack-multi.git
```
参考：[Using a custom buildpack | Third-Party Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/third-party-buildpacks#using-a-custom-buildpack)
（2015/11/30追記ここまで）
###`git init` し忘れていた場合
```bash
$ heroku create app-test
Creating app-test... done, stack is cedar-14
WARNING: Incomplete credentials detected, git may not work with Heroku. Run `heroku login` to update your credentials. See documentation for details: https://devcenter.heroku.com/articles/http-git#authentication
```
Heroku から app を作ったけど git がないよと注意してきます。
ですので `git init` してから ~~`git remote add heroku git@heroku.com:app-test.git`~~ `heroku git:remote -a app-test` しましょう。これにより Heroku へプッシュする際に `git push heroku master` のように引数を `heroku` で済ませることができるようになります。
#herokuのタイムゾーンを日本に設定
```bash
$ heroku config:set TZ=Asia/Tokyo
Setting config vars and restarting app-test... done, v3
TZ: Asia/Tokyo
```
参考：[Herokuのタイムゾーンを日本時間に設定する - アインシュタインの電話番号](http://blog.ruedap.com/2011/02/10/heroku-timezone-japan-jst)

その他のタイムゾーンにしたい場合にはこちらを参照ください。

* [List of tz database time zones - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)

#Papertrailアドオン登録
ログを見るためにPapertrailアドオンを早めに登録。
もちろん無料版で。

```bash
$ heroku addons:create papertrail
Adding papertrail on app-test... done, v4 (free)
Welcome to Papertrail. Questions and ideas are welcome (support@papertrailapp.com). Happy logging!
Use `heroku addons:docs papertrail` to view documentation.
```
以前は `heroku addons:add papertrail` でしたが deprecated になったようです（'15/9/1現在）。
#Papertrailのタイムゾーンも日本に設定
heroku dashboardで作成したappページ
（ https://dashboard.heroku.com/apps/app-test/resources （←うそページです）)

からPapertrailアドオンへのリンクをクリックしてPapertrail Eventsページへ。
右上の **Settings** をクリックして Settings ページへ移り、さらに左の縦並びから Profile を選択します。

[Profile — Papertrail](https://papertrailapp.com/account/profile)
に **Time zone** があるので、Osaka / Sapporo / Tokyo のいずれかを選択し **Update Preferences** で更新します（なんで札幌があるんだろう）。
#Ruby以外の言語を一緒に使う場合はherokuへのdeploy前にheroku-buildpack-multiを登録
複数のbuildpackを同時に使うbuildpackである heroku-buildpack-multi

* [heroku/heroku-buildpack-multi](https://github.com/heroku/heroku-buildpack-multi)

を使います。（'14/11/26に Heroku 公式になりました。）

ではheroku-buildpack-multiの使い方を簡単に記載しておきます。
##`.buildpacks`ファイル作成
まずは`.buildpacks`ファイルを作り、使いたい言語に対応するbuildpackを登録します。
例えば Ruby と PhantomJS (バージョン ~~1.9.8~~ 2.1.1[^1] ) とを使う場合は

```:.buildpacks
https://github.com/stomita/heroku-buildpack-phantomjs.git
https://github.com/heroku/heroku-buildpack-ruby.git
```
とします。
[^1]: 2016/2/3に2.1.1へ更新されました

もちろんその後に`git commit -a`として`.buildpacks`をGit管理下に置きます。

当然ですが、PhantomJS以外の言語も使えます。herokuで利用可能なbuildpackは

* [Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/buildpacks)
* [Third-Party Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/third-party-buildpacks)

を見てください。
###
<!--
###2015/11/28追記：PhantomJS 2.0.0を使う場合
別の `.buildpacks` ファイル、そして `Aptfile` が必要になります。

```:.buildpacks
https://github.com/ddollar/heroku-buildpack-apt
https://github.com/srbartlett/heroku-buildpack-phantomjs-2.0.git
https://github.com/heroku/heroku-buildpack-ruby.git
```
```:Aptfile
libicu52
libjpeg8
libfontconfig
libwebp5
```
このときのデプロイログは下のリンク先（gist）のようになります（いろんなファイルをfetchしていきます）。

- [heroku-buildpack-phantomjs-2.0 deploy log](https://gist.github.com/riocampos/e9282b5b2ba559400933)

参考リンク：[srbartlett/heroku-buildpack-phantomjs-2.0](https://github.com/srbartlett/heroku-buildpack-phantomjs-2.0)
（2015/11/28追記 ここまで）
-->
##herokuのCedar stackにheroku-buildpack-multiを使うように登録
（2015/11/30変更）

```bash
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
Buildpack set. Next release on app-test will use https://github.com/heroku/heroku-buildpack-multi.git.
Run git push heroku master to create a new release using this buildpack.
```
以前は `heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git` で設定していたのですが、どうやら環境変数を設定しても buildpacks が使われないようになったようです。
（2015/11/30変更ここまで）

（2017年追記）
なお、以前の古い `ddollar/heroku-buildpack-multi` を使う設定のまま2017/1/1以降に `git push heroku master` すると

```
remote: WARNING: This buildpack is no longer maintained.
remote: 
remote: Please choose a different buildpack or go to https://github.com/ddollar/heroku-buildpack-multi
remote: and fork it to your own account.
remote: 
remote: This buildpack will cease to function at the stroke of midnight on January 1, 2017.
```
「古いんじゃボケ」と怒られます。このようなときには、いま設定されているビルドパックを削除したあとに新しい `heroku/heroku-buildpack-multi` を設定してやります。

```
$ heroku buildpacks:clear
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
```
そして `git push heroku master` とすれば OK です。
（2017年追記ここまで）

<!--

```bash
$ heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git
Setting config vars and restarting app-test... done, v5
BUILDPACK_URL: https://github.com/heroku/heroku-buildpack-multi.git
```
参考：[橋本商会 » HerokuでSinatra+PhantomJS](http://shokai.org/blog/archives/7101) （ただしこちらだと`heroku create`からの手順になっているので、上記までで登録したappに関係ない別appを作ってしまいます。ご注意ください。）
-->
##herokuの環境関数を設定
### ~~Ruby 1.9.3の場合~~ RubyとPhantomJSの場合
~~参考：[橋本商会 » HerokuでSinatra+PhantomJS](http://shokai.org/blog/archives/7101)~~
以下を実行して環境関数を設定し ~~ます。~~ **なくても良くなりました**。
（'15/9/1追記）以前は `heroku config:add` で PATH と LD_LIBRARY_PATH を指定しないとダメだったのですが、最近は `heroku-buildpack-ruby.git` 及び `heroku-buildpack-phantomjs.git` を指定することにより、 Ruby インタプリタ及び PhantomJS への PATH が追加されるのだと思われます（推測）。デプロイした状況で PATH などを確認すると以下のようになります。

```bash
$ heroku run bash
Running `bash` attached to terminal... up, run.7411
~ $ echo $PATH
/app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.1.0/bin:/usr/local/bin:/usr/bin:/bin:vendor/phantomjs/bin
~ $ echo $LD_LIBRARY_PATH
:vendor/phantomjs/lib
```
（'15/9/1追記ここまで）
### ~~Ruby 2.0.0の場合~~
~~なぜか上記の1.9.3の`PATH`でもいけました。（理由不明。使ったコードが1.9.3でも2.0.0でもいけるものだったから、かもしれません。）~~

###環境変数設定など
それぞれのbuildpackのGithubに載っている、と思います。
~~PhantomJSでの`PATH`及び`LD_LIBRARY_PATH`に関してはこのように載っていました。~~ （いまは載ってないので '15/9/1削除）
>##Note
If you're using heroku-buildpack-multi to include other buildpacks, you should set environment variable by your own to include following paths.

>```
PATH="/usr/local/bin:/usr/bin:/bin:/app/vendor/phantomjs/bin"
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/lib:/app/vendor/phantomjs/lib"
```
[stomita/heroku-buildpack-phantomjs](https://github.com/stomita/heroku-buildpack-phantomjs)

###~~環境変数を設定していないと~~
~~herokuがPhantomJSの場所が分からず`Unable to find phantomjs executable. `エラーになりました。~~

今は不要です。（'15/9/1現在）
#herokuにdeployする
heroku-buildpack-multiを使ったときのログを載せておきます。

###いまのもの（'15/9/1現在）
```bash
$ git push heroku master
　　：
　（中略）
　　：
remote: -----> Fetching custom git buildpack... done
remote: -----> Multipack app detected
remote: =====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
remote: =====> Detected Framework: PhantomJS
remote: -----> Extracting PhantomJS 1.9.8 binaries to /tmp/build_46007cdcc7dec8b50724e146966fb879/vendor/phantomjs
remote: -----> exporting PATH and LIBRARY_PATH
remote: =====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
remote: =====> Detected Framework: Ruby
remote: -----> Compiling Ruby
remote: -----> Using Ruby version: ruby-2.1.7
remote: -----> Installing dependencies using bundler 1.9.7
　　：
　（後略）
　　：
```
PhantomJS の Buildpack で `exporting PATH and LIBRARY_PATH` と表示されています。
###古いもの
```bash
$ git push heroku master
　　：
　（中略）
　　：
-----> Fetching custom git buildpack... done
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
=====> Detected Framework: PhantomJS
-----> Extracting PhantomJS 1.9.7 binaries to /tmp/build_fc8597ea-9758-4e68-wxyz-df31f9c72752/vendor/phantomjs
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
=====> Detected Framework: Ruby
-----> Compiling Ruby
-----> Using Ruby version: ruby-1.9.3
　　：
　（後略）
　　：
```
#app起動
deployを終えてもappはherokuに載っただけでまだ起動していません（process type が `web` の場合だけは勝手に起動しますw）。
`heroku ps:scale`で起動させます。
このコマンドはProcfileの冒頭のprocess typeを引数に取ります。
例えば

```ruby:Procfile
cron: bundle exec ruby apptest.rb
```
である場合は、process type `cron` を用いて `cron=1` とします。

```bash
$ heroku ps:scale cron=1
Scaling dynos... done, now running cron at 1:1X.
```

#余談：process type名
ちなみに、process type には任意の名前が使えます。
ただし `web` だけは特別で、HTTP トラフィックのルーティングを受ける名前になっています（そして、ルータアクセスを受けないまま30分間ほど経過すると SIGTERM が送られてプロセスが落とされますorz

>The web process type is special as it’s the only process type that will receive HTTP traffic from Heroku’s routers. Other process types can be named arbitrarily.
[Process Types and the Procfile | Heroku Dev Center](https://devcenter.heroku.com/articles/procfile#declaring-process-types)

個人的には、Twitter の bot には `bot`、定期稼働する app には `cron` などと名付けたりしていますw

# おまけ：`https://github.com/ddollar/heroku-buildpack-multi` を使っていて放置していた場合
怒られます。

>```ruby
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Multipack app detected
remote: WARNING: This buildpack is no longer maintained.
remote: 
remote: Please choose a different buildpack or go to https://github.com/ddollar/heroku-buildpack-multi
remote: and fork it to your own account.
remote: 
remote: This buildpack will cease to function at the stroke of midnight on January 1, 2017.
remote:  !     Push rejected, failed to compile Multipack app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to app-test.
remote: 
```

ので、怒られないように更新します。
## buildpack の削除
```sh
$ heroku buildpacks:clear 
Buildpacks cleared.
 ▸    The BUILDPACK_URL config var is still set and will be used for the next release
```
## buildpack の登録
```sh
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
Buildpack set. Next release on app-test will use https://github.com/heroku/heroku-buildpack-multi.git.
Run git push heroku master to create a new release using this buildpack.
```
## push
```sh
$ git push heroku master
　：
remote: -----> Multipack app detected
remote: =====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
　：
remote: Verifying deploy... done.
To git@heroku.com:app-test.git
   4d25f4e..8ac7e86  master -> master
```