dokku がいつの間にか deis がスポンサーになって開発が活発になって 0.3 系がリリースされていたので、 0.3.17 に Ruby on Rails アプリをデプロイしてみました。

対象バージョン

  • dokku 0.3.17
  • docker 1.5.0, 1.6.0

前準備

何度か繰り返す予定ならあらかじめ、 次の初回起動の手順の vagrant up の前に、 Makefile の PREBUILT_STACK_URL を Vagrantfile の PREBUILT_STACK_URL で チェックしている場所にダウンロードしておくと ダウンロード時間を短縮できます。

curl -L -o stack.tgz https://github.com/progrium/buildstep/releases/download/2014-12-16/2014-12-16_42bd9f4aab.tar.gz

初回起動

Vagrant 環境で試しました。

git clone https://github.com/progrium/dokku
cd dokku
vagrant up

vagrant の中では /vagrant の他に /root/dokkudokku ディレクトリがマウントされています。

初期設定

Vagrant でポートフォワーディングされている http://localhost:8080/ か ホストオンリーアダプタで接続されている http://10.0.0.2/ を開きます。 Dokku Setup が表示されるので、そこで初期設定をします。

Public Key に自分の ~/.ssh/id_rsa.pub が入っているのを確認します。 必要なら他の公開鍵に変更します。

Hostname Configuration の方は Hostname に自分がインターネットに接続しているグローバル IP アドレスが表示されているので、 dokku.me に変更して、 Use virtualhost naming for apps にチェックを入れます。 dokku.me は dokku の作者が運用していると思われる、すべてのサブドメインで 127.0.0.1 を返してくれるサービスです。 (2016-04-20 追記: 現在は 127.0.0.1 ではなく 10.0.0.2 に変わっています。)

Finish Setup を押すと初期設定は終了して http://progrium.viewdocs.io/dokku/application-deployment に飛ばされます。

ちなみに、初期設定用のサーバーの実体は contrib/dokku-installer.rb にあるようです。

ssh の設定

ssh dokkussh dokku.me で接続できるように ~/.ssh/config に以下のような設定を追加しました。 User, Hostname, Port, RequestTTY 以外の設定はお好みで良いと思います。

Host dokku dokku.me
    User dokku
    HostName 10.0.0.2
    Port 22
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    LogLevel FATAL
    RequestTTY yes
    Ciphers arcfour128,arcfour256

サンプルアプリをデプロイ

http://progrium.viewdocs.io/dokku/application-deployment に書いてある node.js のサンプルアプリをデプロイします。

git clone https://github.com/heroku/node-js-sample
cd node-js-sample
git remote add dokku dokku@dokku.me:node-js-app
git push dokku master

http://node-js-app.dokku.me:8080/ を開いて「Hello World!」が見えれば成功です。

PostgreSQL プラグインをインストール

今回は Plugins で「Compatible with 0.3.16」と書いてある PostgreSQL (single container) を使いました。

vagrant ssh で入って以下を実行しました。

sudo git clone https://github.com/Flink/dokku-psql-single-container /var/lib/dokku/plugins/psql-sc
sudo dokku plugins-install

postgres:9.3 のイメージをダウンロードするので、しばらく時間がかかりました。

Rails のサンプルをデプロイ

試行錯誤の結果、シンプルな手順は以下のようになりました。

ssh dokku apps:create ruby-rails-app
ssh dokku psql:create ruby-rails-app
git clone https://github.com/heroku/ruby-rails-sample
cd ruby-rails-sample
git remote add dokku dokku@dokku.me:ruby-rails-app
git push dokku master

http://ruby-rails-app.dokku.me:8080/ を開いて Hello World と現在時刻が表示されれば成功です。

今回利用したプラグインでは psql:create だけで、別途 link という手順は不要でした。

データベースの migration の実行

このサンプルアプリではデータベースに接続するだけで使っていないので、 必須ではないのですが rake db:migrate も実行しました。

ssh dokku run ruby-rails-app rake db:migrate

タイムゾーン設定

現在時刻が UTC で表示されていたので、 JST に変更しました。

ssh dokku config:set ruby-rails-app TZ=Asia/Tokyo

設定変更後に自動で再起動されるので、 http://ruby-rails-app.dokku.me:8080/ を開いて、 現在時刻が日本時間で表示されれば成功です。

CHECKS 作成

デフォルトだと Zero downtime deploy の簡易チェックで 35 秒待つようになっているので、 CHECKS ファイルを作成して待ち時間を短くして、 正常なときだけデプロイできるようにしてみました。

vi CHECKS
git add CHECKS
git commit
git push dokku master

CHECKS ファイルの内容は以下の通りです。

/	RubyRailsSample

左側がチェックする URL で右側がその URL を表示したときに含まれる文字列です。 ここではタイトルの文字列を指定してみました。

アプリケーションの削除

apps:destroy で削除できます。 確認のため、もう一度アプリ名を入力する必要があります。

% ssh dokku apps:destroy node-js-app
 !    WARNING: Potentially Destructive Action
 !    This command will destroy node-js-app (including all add-ons).
 !    To proceed, type "node-js-app"

> node-js-app
Destroying node-js-app (including all add-ons)
No database configured for node-js-app
Connection to 10.0.0.2 closed.

ruby-rails-app の削除も試してみたところ、 データベースも一緒に削除されるので、 別途 psql:delete を実行する必要はありませんでした。

デプロイ時に ruby のダウンロードでタイムアウトする場合

20150101勉強会 dokku alt の16ページの手順5を参考にしてタイムアウトをのばすと良いようです。

ssh dokku config:set ruby-rails-app CURL_TIMEOUT=120
Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published