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/dokku
に dokku
ディレクトリがマウントされています。
初期設定
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 dokku
や ssh 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