はじめてのHeroku(node.js)

Herokuを使ってみたくなったので環境を構築してみたのですよ。
環境:MacOS 10.7.3 / nodebrew 0.5.0 / node 0.6.13 / npm 1.1.9

herokuコマンドのインストール

The Heroku CLI | Heroku Dev Centerから、インストーラをダウンロードしてきます。
Linuxとか書かないでDebian/Ubuntuって書いてるってことは、RHEL系は別の方法でインストールするのかな?


今回の環境はMacOSXなので、heroku-toolbelt.pkgをダウンロード、実行してウィザードを進めて行きます。
特に失敗することなく正常にインストールされるかと。


インストールされたか確認するため、コマンドを実行してみます。

$ which heroku
/usr/bin/heroku
$ heroku --version
2.25.0

ちゃんとインストールされてるみたい。

公開鍵認証用の鍵を作る

公開鍵認証に必要な鍵を生成します。

$ ssh-keygen -t rsa -C "Heroku"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sasaplus1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

生成時にいろいろ入力を促されますが、

Enter file in which to save the key どういうファイル名で保存するか
Enter passphrase (empty for no passphrase) パスフレーズの入力(空の場合はパスフレーズなし)

~/.ssh以下に既に他の鍵が存在する場合は最初のやつに気をつけて入力(/Users/(username)/.ssh/heroku_id_rsaとか)して、後は空でも良いかと。

公開鍵認証の設定ファイルを編集する

~/.ssh/configを編集します。githubなんかを使っている場合は既に何かしら書いているのではないでしょうか。

Host heroku.com
  User git
  Port 22
  Hostname heroku.com
  IdentityFile ~/.ssh/(秘密鍵のファイル)
  TCPKeepAlive yes
  IdentitiesOnly yes

鍵を生成するとid_rsaとid_rsa.pubというファイルが生成されますが、秘密鍵は前者の方です。
ファイル名を指定して生成した場合はそのファイル名そのものの方になります。ファイル名の最後に.pubのない方です。

ログイン

事前に登録しておいたアカウントと、先ほど生成した鍵を使って、ログインします。
この作業は最初の一度だけで良いみたい。

$ heroku login
Enter your Heroku credentials.
Email: {email address}
Password (typing will be hidden):
Found the following SSH public keys:
1) xxx_id_rsa.pub
2) zzz_id_rsa.pub
3) heroku_id_rsa.pub
Which would you like to use with your Heroku account? 3
Uploading SSH public key /Users/sasaplus1/.ssh/heroku_id_rsa.pub
Authentication successful.

鍵が複数存在する場合、どの鍵を使用するか聞いてくるので先ほど生成した鍵の番号を選びます。
鍵が一つしか無い場合は……それが使用されるのかな、どうなのかな。

アプリケーションを作る

とりあえず簡易なアプリケーションを作ります。
bitbucket*1にheroku-helloworldという名前でgitリポジトリを作りました。
Mercurialでもデプロイできればなあ…… 一応hg-gitを使うと出来ないことも無いみたいですが。

$ git clone git@bitbucket.org:sasaplus1/heroku-helloworld.git
$ cd heroku-helloworld/

HelloWorldを表示させたいだけなので、とりあえずexpressを入れます。

$ npm install express

続いてweb.jsを書きます。

var express = require('express'),
    app = express.createServer();

app.get('/', function (req, res) {
  res.send('Hello, World!');
});

app.listen(process.env.PORT || 3000);

続いてpackage.jsonを書きます。

{
  "name": "heroku-helloworld",
  "version": "0.0.1",
  "dependencies": {
    "express": "2.5.9"
  },
  "engines": {
    "node": "0.6.13",
    "npm": "1.1.9"
  }
}

Herokuで使用できるnode.jsとnpmのバージョンは
http://heroku-buildpack-nodejs.s3.amazonaws.com/manifest.nodejs
http://heroku-buildpack-nodejs.s3.amazonaws.com/manifest.npm
みたいです。


expressのバージョン番号は

$ npm ls
(path)/heroku-helloworld
└─┬ express@2.5.9
  ├─┬ connect@1.8.7
  │ └── formidable@1.0.9
  ├── mime@1.2.4
  ├── mkdirp@0.3.0
  └── qs@0.4.2

で確認します。モジュール名@バージョン番号なので今回インストールされたバージョンは2.5.9ですね。
あとはProcfileと.gitignoreを作成して終わりです。

$ echo 'web: node web.js' > Procfile
$ echo 'node_modules/' > .gitignore

リポジトリへコミット

作成したファイルをリポジトリへコミットします。ついでにプッシュも。

$ git add .
$ git commit -m "initial commit"
$ git push origin master

Heroku上にアプリケーションを作成

以下のコマンドでアプリケーションを作成します。

$ heroku create --stack cedar --buildpack http://github.com/hakobera/heroku-buildpack-nodejs.git

buildpackのあたりは……package.jsonで指定したnode.jsとnpmのバージョンを使う場合に必要なものだったかな……?

デプロイ

Herokuにリポジトリをプッシュして、デプロイします。

$ git push heroku master

と普通は実行するみたいですが

$ git push git@heroku.com:(heroku appsで表示されるやつ).git master

と実行しました。git remote addとかよくわからないので。
多分どちらでも動くんじゃないでしょうか。多分。
昔の記事を参考にすると、このあとプロセスを起動させないといけないみたいなのですが、コンソールにはLaunching... done, v4とか表示されてるので勝手に起動してくれてるみたいですね。

*1:プライベートリポジトリ作り放題なのでgithubではリポジトリを作りませんでした