このエントリーをはてなブックマークに追加

既存のHubotアプリケーションをOpenShiftで動かすまで

はじめに

HerokuでHubotを動かしていましたが、新しい料金プランの通知が来たので、他のクラウドサービスでも動かせるように出来ないかと思い、OpenShiftでやってみることにしました。

ただ、OpenShiftもDockerとKubernetesに対応したものに変わるということもあるので、それまでの経過措置です。

小さいインスタンスを24時間起動してても無料なサービスというのは、やはり儲からないのでしょうね。

参考にしたのは、Hitchhiker’s Guide to Tweetbots: Hosting a Hubot on OpenShift です。

OpenShiftへの登録

以下のサイトに登録の方法があるので、参考にしてください。

一旦、webの画面でサンプルアプリケーションとかを作って動かしておくと、今後の操作とかで省略出来る箇所もあるので、試しておくのをお勧めします。

rhcのインストール

登録が済んだら、コマンドラインツールが提供されているので、インストールします。

次にアカウントの情報を登録します。

公開鍵とドメインの設定をする必要がありますが、こちらもWebの画面でやっておくことをお勧めします。

Hubotアプリケーションの修正

参考にするのは、こちらです。

修正とは言っても、以下の2点です。

  • プロジェクトに .openshift/markers/use_npm という空のファイルを作る。
  • package.jsonに以下のようなHubot起動用のコマンドを追加する。
"scripts": {
"start": "PORT=$OPENSHIFT_NODEJS_PORT BIND_ADDRESS=$OPENSHIFT_NODEJS_IP HEROKU_URL=$OPENSHIFT_APP_DNS REDIS_URL=redis://:$REDIS_PASSWORD@$OPENSHIFT_REDIS_HOST:$OPENSHIFT_REDIS_PORT bin/hubot -n Hubot -a shell"
}

以下の3つの変数については、OpenShiftから提供されます。

  • OPENSHIFT_NODEJS_PORT
  • OPENSHIFT_NODEJS_IP
  • OPENSHIFT_APP_DNS

詳細は、Informational Environment Variables を参考にしてください。

redisに関しては、上記のサイトで利用しているcartridgeを使う場合と、https://marketplace.openshift.com/home で提供されているredis cloudを使う場合があります。

私の場合、redis cloudを使う選択をしたので、設定する必要があります。 アプリケーションに変数を設定するには先程インストールしたコマンドラインツールを利用します。

$ rhc env set OPENSHIFT_REDIS_HOST=<redisホスト名>
$ rhc env set OPENSHIFT_REDIS_PORT=<ポート>
$ rhc env set REDIS_PASSWORD=<パスワード>

hubot brainを使っていなかったので、データを移行する必要がありませんでした。 必要であれば、上記のサイトを参考に移行してください。

Hubotとslackと連携している場合は、以下の様に変数を設定してください。

$ rhc env set HUBOT_SLACK_TOKEN=<トークン>

Travis CIでデプロイ

OpenShiftはtravis CIでデプロイ出来るので、以下の様に設定します。

language: node_js
node_js:
  - "0.10"
deploy:
  provider: openshift
  user: $OPENSHIFT_USERNAME
  password: $OPENSHIFT_PASSWORD
  app: $OPENSHIFT_APP_NAME
  domain: $OPENSHIFT_APP_NAMESPACE

ユーザ名とパスワードをtravisに設定するところが気になるところですが、OpenShiftにデプロイ用のトークン機能が無いので仕方ありません。

設定方法は、Using Settings を参考にしてください。

上記の OPENSHIFT_APP_NAMESPACE ですが、ドメイン名を設定します。

最後に

単純な移行だけなら、上記の設定をしてgit pushのremoteを変更するだけでなんとかなります。

もしHubotでスケジューリングしている様な場合は、単純に移行してしまうとタイムゾーンの関係でズレてしまうと思います。

私自身、OpenShift上のNode.jsアプリケーションでタイムゾーンを変更する方法が分からないので、変更する方法を知っている方がいらっしゃったら、教えて頂けると助かります。

本格的にHeroku上でHubotを使っている場合、素直にHobbyプランまたはそれ以上に移行するのがいいと思います。

追記 2015-05-11

OpenShiftも48時間でアイドリングするので、@bouzuya さんの解決策を採用させていただくことにしました。

追記 2015-05-17

OpenShiftでのタイムゾーンの変更ですが、@nekop さんに教えて頂きました。ありがとうございます。

プロジェクトに .openshift/action_hooks/pre_start_nodejs を作ります。

内容は、以下の通りで変えることが出来ました。

#!/bin/bash

echo "Execute pre_restart nodejs hook"

export TZ='Asia/Tokyo'

echo "$TZ"
echo `date`
このエントリーをはてなブックマークに追加