忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【Heroku】チュートリアル(Node.js)メモ

環境

前提

  • Heroku Toolbeltがインストールされていること
  • node.jsがインストールされていること

デプロイまで

#公式サンプルプロジェクトを利用
$ git clone https://github.com/heroku/node-js-getting-started.git
Cloning into 'node-js-getting-started'...
remote: Counting objects: 442, done.
remote: Total 442 (delta 0), reused 0 (delta 0), pack-reused 442
Receiving objects: 100% (442/442), 224.68 KiB | 119.00 KiB/s, done.
Resolving deltas: 100% (65/65), done.
Checking connectivity... done.
$ cd node-js-getting-started/
#リモートリポジトリの確認
$ git remote
origin #この時点でリモートリポジトリはoriginのみ
$ 
$ 
#「heroku create」でheroku上にアプリを作成する
#createの後(例だと’test-heroku-app’)はアプリ名で省略可能
#省略した場合、自動でランダムな名称が付けられる
$ heroku create test-heroku-app 
Creating test-heroku-app... !!!
 ▸    Name is already taken
#既に使われてる名前でした。。。
$ 
#リトライ
$ heroku create mktktmr-test-heroku-app
Creating mktktmr-test-heroku-app... done, stack is cedar-14
https://mktktmr-test-heroku-app.herokuapp.com/ | https://git.heroku.com/mktktmr-test-heroku-app.git
#リモートリポジトリ確認
$ git remote
heroku #「heroku create」をするとリモートリポジトリにherokuが追加される
origin

Herokuダッシュボード(heroku create後) f:id:mktktmr:20160130072527p:plain

App管理画面 f:id:mktktmr:20160130072626p:plain

push

#herokuリポジトリにPushすることでデプロイ完了
$ git push heroku master
Counting objects: 433, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (337/337), done.
Writing objects: 100% (433/433), 222.43 KiB | 0 bytes/s, done.
Total 433 (delta 63), reused 433 (delta 63)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Node.js app detected
remote: 
remote: -----> Creating runtime environment
remote:        
remote:        NPM_CONFIG_LOGLEVEL=error
remote:        NPM_CONFIG_PRODUCTION=true
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote: 
remote: -----> Installing binaries
remote:        engines.node (package.json):  0.12.7
remote:        engines.npm (package.json):   unspecified (use default)
remote:        
remote:        Downloading and installing node 0.12.7...
remote:        Using default npm version: 2.11.3
remote: 
remote: -----> Restoring cache
remote:        Skipping cache restore (new runtime signature)
remote: 
remote: -----> Building dependencies
remote:        Pruning any extraneous modules
remote:        Installing node modules (package.json)
remote:        ejs@2.3.3 node_modules/ejs
remote:        
remote:        express@4.13.3 node_modules/express
remote:        ├── escape-html@1.0.2
remote:        ├── merge-descriptors@1.0.0
remote:        ├── array-flatten@1.1.1
remote:        ├── cookie@0.1.3
remote:        ├── utils-merge@1.0.0
remote:        ├── cookie-signature@1.0.6
remote:        ├── fresh@0.3.0
remote:        ├── methods@1.1.2
remote:        ├── range-parser@1.0.3
remote:        ├── vary@1.0.1
remote:        ├── path-to-regexp@0.1.7
remote:        ├── parseurl@1.3.1
remote:        ├── content-type@1.0.1
remote:        ├── etag@1.7.0
remote:        ├── content-disposition@0.5.0
remote:        ├── depd@1.0.1
remote:        ├── qs@4.0.0
remote:        ├── on-finished@2.3.0 (ee-first@1.1.1)
remote:        ├── finalhandler@0.4.0 (unpipe@1.0.0)
remote:        ├── debug@2.2.0 (ms@0.7.1)
remote:        ├── proxy-addr@1.0.10 (forwarded@0.1.0, ipaddr.js@1.0.5)
remote:        ├── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)
remote:        ├── serve-static@1.10.2 (escape-html@1.0.3, send@0.13.1)
remote:        ├── type-is@1.6.10 (media-typer@0.3.0, mime-types@2.1.9)
remote:        └── accepts@1.2.13 (negotiator@0.5.3, mime-types@2.1.9)
remote: 
remote: -----> Caching build
remote:        Clearing previous node cache
remote:        Saving 2 cacheDirectories (default):
remote:        - node_modules
remote:        - bower_components (nothing to cache)
remote: 
remote: -----> Build succeeded!
remote:        ├── ejs@2.3.3
remote:        └── express@4.13.3
remote:        
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 10.2M
remote: -----> Launching...
remote:        Released v3
remote:        https://mktktmr-test-heroku-app.herokuapp.com/ deployed to Herok
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/mktktmr-test-heroku-app.git
 * [new branch]      master -> master

App管理画面(push後)

f:id:mktktmr:20160130074217p:plain

アプリにアクセスしてみる

アプリケーションを開く(Webブラウザが起動し、アプリのURLが開かれる)
$ heroku open
Opening mktktmr-test-heroku-app... done
$

f:id:mktktmr:20160130073517p:plain

その他

ロギング

Logging | Heroku Dev Center

「heroku logs --tail」を利用することでリモートでログ監視ができる

$ heroku logs --tail
2016-01-29T21:22:05.932126+00:00 heroku[api]: Enable Logplex by hoge@fuga.com
2016-01-29T21:22:05.932126+00:00 heroku[api]: Release v2 created by hoge@fuga.com
2016-01-29T21:26:17.536538+00:00 heroku[api]: Scale to web=1 by hoge@fuga.com
2016-01-29T21:26:17.607423+00:00 heroku[api]: Deploy 5e531fb by hoge@fuga.com
2016-01-29T21:26:17.607423+00:00 heroku[api]: Release v3 created by hoge@fuga.com
2016-01-29T21:26:17.921584+00:00 heroku[slug-compiler]: Slug compilation started
2016-01-29T21:26:17.921589+00:00 heroku[slug-compiler]: Slug compilation finished
2016-01-29T21:26:18.689167+00:00 heroku[web.1]: Starting process with command `node index.js`
2016-01-29T21:26:20.729829+00:00 app[web.1]: Node app is running on port 10971
2016-01-29T21:26:22.256715+00:00 heroku[web.1]: State changed from starting to up
2016-01-29T21:47:19.821604+00:00 heroku[router]: at=info method=GET path="/" host=mktktmr-test-heroku-app.herokuapp.com request_id=5c1440f8-8a27-4cfe-9b01-f9da5cbabbef fwd="106.161.123.219" dyno=web.1 connect=1ms service=36ms status=200 bytes=6119

Procfile

Process Types and the Procfile | Heroku Dev Center

アプリケーションが起動した時にすべきコマンドが定義されているファイル

$ ls -l
total 40
-rw-r--r--  1 makoto  staff    19  1 30 06:18 Procfile #こいつ
-rw-r--r--  1 makoto  staff  1371  1 30 06:18 README.md
-rw-r--r--  1 makoto  staff   300  1 30 06:18 app.json
-rw-r--r--  1 makoto  staff   460  1 30 06:18 index.js
-rw-r--r--  1 makoto  staff   486  1 30 06:18 package.json
drwxr-xr-x  5 makoto  staff   170  1 30 06:18 public
drwxr-xr-x  4 makoto  staff   136  1 30 06:18 views
$ 
#中身の確認
$ cat Procfile 
web: node index.js

スケーリング

「heroku ps」でアプリがいくつのdynosで動いているか確認できる

$ heroku ps
=== web (Free): node index.js
web.1: up 2016/01/30 08:19:41 +0900 (~ 3m ago)

「heroku ps:scale」でスケーリング出来る

$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free.
$
#無料アカウントではスケールアップはできないけどもね
$ heroku ps:scale web=2
Scaling dynos... failed
 !    Cannot update to more than 1 Free size dynos per process type.

依存性の定義(Node.jsの場合)

  • 依存性はpackage.jsonに定義する
  • プロジェクトのルートディレクトリにpackage.jsonがあるとHerokuはそのプロジェクトがNode.jsプロジェクトだと認識する
  • ローカルでアプリを実行したい場合、「npm install」で依存ライブラリをインストールする必要がある
$ heroku local web
forego | starting web.1 on port 5000
web.1  | module.js:327
web.1  |     at require (internal/module.js:12:17)

npm install実行

$ npm install
node-js-getting-started@0.1.5 ~/node-js-getting-started
├── ejs@2.3.3 
└─┬ express@4.13.3 
  ├─┬ accepts@1.2.13 
  │ ├─┬ mime-types@2.1.9 
  │ │ └── mime-db@1.21.0 
  │ └── negotiator@0.5.3 
  ├── array-flatten@1.1.1 
  ├── content-disposition@0.5.0 
  ├── content-type@1.0.1 
  ├── cookie@0.1.3 
  ├── cookie-signature@1.0.6 
  ├─┬ debug@2.2.0 
  │ └── ms@0.7.1 
  ├── depd@1.0.1 
  ├── escape-html@1.0.2 
  ├── etag@1.7.0 
  ├─┬ finalhandler@0.4.0 
  │ └── unpipe@1.0.0 
  ├── fresh@0.3.0 
  ├── merge-descriptors@1.0.0 
  ├── methods@1.1.2 
  ├─┬ on-finished@2.3.0 
  │ └── ee-first@1.1.1 
  ├── parseurl@1.3.1 
  ├── path-to-regexp@0.1.7 
  ├─┬ proxy-addr@1.0.10 
  │ ├── forwarded@0.1.0 
  │ └── ipaddr.js@1.0.5 
  ├── qs@4.0.0 
  ├── range-parser@1.0.3 
  ├─┬ send@0.13.0 
  │ ├── destroy@1.0.3 
  │ ├─┬ http-errors@1.3.1 
  │ │ └── inherits@2.0.1 
  │ ├── mime@1.3.4 
  │ └── statuses@1.2.1 
  ├─┬ serve-static@1.10.2 
  │ ├── escape-html@1.0.3 
  │ └─┬ send@0.13.1 
  │   ├── depd@1.1.0 
  │   └── destroy@1.0.4 
  ├─┬ type-is@1.6.10 
  │ └── media-typer@0.3.0 
  ├── utils-merge@1.0.0 
  └── vary@1.0.1

npm install後

$ heroku local web
forego | starting web.1 on port 5000
web.1  | Node app is running on port 5000