strong-pmを稼働させてloopbackアプリをデプロイする

http://docs.strongloop.com/display/SLC/Setting+up+a+production+host を参照してloopbackで作ったアプリケーションのデプロイを行ってみました。

いままでREMPチームで作っているプロダクトはminaを利用して、PadrinoやRendrアプリをデプロイしていましたが loopbackにはデプロイ機構やデプロイしたアプリケーションのプロセスの管理まで用意されているので今回はこの手順で進めてみました。

loopbackアプリのデプロイ及び、アプリケーションのプロセス管理をざっくり整理すると以下の様な図になります。

strong-pm - Process Managerというloopbackを開発しているStrongloopが公開しているNode.jsアプリケーション向けの プロセスマネージャーをプロダクションのホストに導入することでデプロイの制御や複数アプリケーションを立ち上げた際のプロセス管理まで一元的に行うことができます。

ドキュメントを読みながら色々試行錯誤しながら進めたので、その際の手順をメモしておきます。

手順

アプリケーションを運用するProductionなホストにstrong-pmを導入します。

まずはプロダクション用のサーバ上でnpm install

[production]$ sudo npm install -g strong-pm
(snip)

続いてサービスとして起動できる様にするために以下のコマンドを実行します。

[production]$ sudo sl-pm-install
Service strong-pm installed (/etc/init/strong-pm.conf)

で、サービスを起動します。

[production]$ sudo /sbin/initctl start strong-pm
strong-pm start/running, process 5796

これでproductionを運用するホストにloopbackで作成したアプリケーションがデプロイできる様な状態になりました。

実際にこのproductionのホストに向けてデプロイしてみます。

ビルドサーバでまずビルドします。gitにdeployブランチが作成されます。

[build]$ slc build
Running `git log -1 --pretty=format:"%t" HEAD`
  => 670faf6
Running `git commit-tree -p "refs/heads/deploy" -p "refs/heads/master" -m "Commit tree of
'refs/heads/master' onto 'deploy'" 670faf6`
  => f32106f847861e2f4e008064fa25445cc02ad5f8
Running `git update-ref "refs/heads/deploy" f32106f847861e2f4e008064fa25445cc02ad5f8`
Merged source tree of `refs/heads/master` onto `deploy`
Running `npm install --ignore-scripts`
Running `npm prune --production`
Running `git add --force --all .`
Running `git write-tree`
  => f38b2795a54b584d091dff0d8a61fa7b518fc4b4
Running `git commit-tree -p "refs/heads/deploy" -m "Commit build products" f38b2795a54b584
d091dff0d8a61fa7b518fc4b4`
Running `git update-ref "refs/heads/deploy" e03a0ec552504f3db1744e8add99e03f0a296f67`
Committed build products onto `deploy`

引き続きデプロイ。ビルド時に作成したdeployブランチがプロダクションサーバーにデプロイされます。

[build]$ slc deploy http://10.0.3.xxx:8701
Counting objects: 24, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (24/24), 2.81 KiB | 0 bytes/s, done.
Total 24 (delta 12), reused 0 (delta 0)
To http://10.0.3.xxx:8701/api/services/3/deploy/default
   acc8711..e03a0ec  deploy -> deploy
Deployed `deploy` as `remp-api` to `http://10.0.3.xxx:8701`

このメッセージでデプロイ完了となります。 実際にデプロイされている先は、productionホストの /var/lib/strong-pm/svc にあって構造は以下の様になります。

[production]$ pwd
/var/lib/strong-pm/svc

[production]$ tree -L 3
.
└── 3
    ├── repo
    │   └── 3
    └── work
        ├── current -> e03a0ec552504f3db1744e8add99e03f0a296f67.1432980055653
        └── e03a0ec552504f3db1744e8add99e03f0a296f67.1432980055653

実際に稼働しているかはslcコマンドで確認できます。プロダクションサーバに対して以下のコマンドを実行することで、 稼働させているアプリケーションに設定している環境変数クラスタのサイズ、開けているポート番号等を確認できます。

[build]$ slc ctl -C http://10.0.3.xxx:8701
Service ID: 3
Service Name: remp-api
Environment variables:
    Name                Value
    NODE_ENV            production
    REMP_MONGO_DB_PW    *************
    REMP_MONGO_DB_HOST  10.0.3.***
    REMP_MONGO_DB_USER  *******
Instances:
    Version  Agent version  Cluster size
     4.1.1       1.5.1            2
Processes:
        ID      PID   WID  Listening Ports  Tracking objects?  CPU profiling?
    3.1.22350  22350   0
    3.1.22352  22352   1     0.0.0.0:3003
    3.1.22354  22354   2     0.0.0.0:3003

これでアプリケーションを稼働させることができる様になりました。今回は3番目に稼働させたアプリケーションなのでService IDとして 3 が振られているので、 該当のアプリケーションは3003番が振られます。*1

この段階でnginx等のリバースプロキシから該当のポートにプロキシしてやることでアプリケーションを公開できる様になります。

メモ

  • strong-pm自体のログは /var/log/upstart/strong-pm.log に保管されます

*1:strong-pmではService ID + 3000がデフォルトのポート番号