ジンジャー研究室

長めのつぶやき。難しいことは書きません。

Herokuと同程度に簡単なOpenShift使用メモ(on Windows)

Heroku有料化に伴いOpenShiftを試した。その時のメモ。

以下、簡単と言いながら色々躓いているがドキュメントは凄く親切なので、基本的にはこれで足りる。

developers.openshift.com

アカウントを作る

Webページから(省略)。

コマンドラインツールのインストール

コマンドラインツールrhcがgemで提供されているので、まずはRuby1系の最新をインストール。 2系だとエラー。

gem install rhc

依存関係で怒られた。

ERROR:  While executing gem ... (Gem::DependencyError)
    Unable to resolve dependencies: rhc requires highline (~> 1.6.11); commander requires highline (~> 1.7.1)

~> 1.6.11という指定は1.6.Xまでしか受け付けないようだ。

gem install highline -v 1.6.11

再度。

gem install rhc

また怒られた。

ERROR:  While executing gem ... (Gem::DependencyError)
    Unable to resolve dependencies: commander requires highline (~> 1.7.1)

gem install rhc failed. Gem::DependencyError · Issue #678 · openshift/rhc · GitHub gemをアップデートしろと。

gem install rubygems-update
update_rubygems
gem install rhc

また怒られた。今度はgemのエラーっぽい。

ERROR:  While executing gem ... (ArgumentError)
    invalid byte sequence in UTF-8

Windows固有の問題らしいので以下を参考に修正。 会社の PC で 2 時間ほど悶々と悩んでたこと。 - msfukuiの日記

win32/registry.rb

#FormatMessageA = Kernel32.extern "int FormatMessageA(int, void *, int, int, void *, int, void *)", :stdcall
FormatMessageW = Kernel32.extern "int FormatMessageW(int, void *, int, int, void *, int, void *)", :stdcall
def initialize(code)
  @code = code
  #msg = "\0".force_encoding(Encoding::ASCII_8BIT) * 1024
  msg = "\0\0".force_encoding(Encoding::UTF_16LE) * 1024
  #len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0)
  len = FormatMessageW.call(0x1200, 0, code, 0, msg, msg.size, 0)
  #msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap))
  msg = msg[0, len].encode(Encoding.find(Encoding.locale_charmap))
  #super msg.tr("\r", '').chomp
  super msg.tr("\r".encode(msg.encoding), '').chomp
end

再度。

gem install rhc

出来た。

コマンドラインツールのセットアップ

rhc setup

色々訊かれるので、問題なければデフォルト値とyesをひたすら選択。 途中、さっき作ったアカウントでログイン。 SSH鍵の作成から公開鍵を登録するところまでやってくれる(秘密鍵は手動で読み取り専用にしろと書いてある)。

Node.jsアプリケーションの作成

多分Node.js以外も同じようなプロセスになるとは思う。 URLはhttp://アプリ名-ドメイン名.rhcloud.com/になるので慎重につける。(後からでも変更できるけど面倒)

アプリケーション作成Webからでも出来るが、ここではコマンドで作成。 Node.jsの場合はカートリッジ名をnodejs-0.10とする。

rhc create-app home nodejs-0.10

最初のアプリケーションを作る場合はここで名前空間ドメイン)を訊かれるので入力。

怒られた。

The authenticity of host 'home-jinjor.rhcloud.com (54.166.221.17)' can't be established.
RSA key fingerprint is 
Are you sure you want to continue connecting (yes/no)?

ここに至る前に仮に作ったドメインが気に入らなくて消したりしたせいかも。 もう一度セットアップ。

rhc setup

Web画面からアプリを消して再度作成する。

rhc create-app home nodejs-0.10

今度は通った。IPアドレスやら何やらが付与される。

この時点で、http://home-jinjor.rhcloud.com/に既にデフォルトアプリが立ち上がっているので見に行く。

開発を進める

先ほど作ったアプリのルートに移動して、Gitのリモートリポジトリを一応確認しておく。

git remote -v

何故か.gitignoreが無かったので追加。

echo node_modules > .gitignore

後はいつものようにNode.jsアプリを起動。

npm install
node server

http://localhost:8080/にアクセスして確認。

ソースも確認。

self.ipaddress = process.env.OPENSHIFT_NODEJS_IP;
self.port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

Herokuと同じく、主要な情報を環境変数から取得しているのが分かる。 Herokuと同じなら、DB等のアドオンの情報も環境変数から取得できるはず。

修正したらプッシュ。

git push origin master

自動的に再デプロイされる。

感想

Herokuと同じ。