DokkuプライベートなHerokuを作ってRailsアプリケーションをデプロイ[Digital Ocean]

HerokuライクなプライベートなPaaSを作るためのOSS『dokku/dokku - GitHub』の紹介です。
このDokkuの環境は、「Digital Ocean」だと画面から数クリックで作成できるので、
今回は、Digital Oceanとセットで手順を紹介します。

Dukkuを使うメリットは次のとおりです。

  • HerokuライクにGitにpushしたら、BuildPack的なものを使ってRailsやNode.js, Pythonなどのアプリケーションを展開できる
  • Dokkuは、PosgreSQLやRedis、ElasticSearchなどのプラグインを数コマンドで使える

まだ簡単なアプリケーションをBuildしただけですが、特にハマる伴く安定して使えています!


🗽 Dokkuを使うモチベーション

今回Dokkuを使おうと思ったモチベーションはこちら。

- 趣味アプリでは、できるだけアプリだけに集中したい
- PosgreSQLやRedis、ElasticSearchなどのプラグインを数コマンドで使えるようになる
- Herokuの無料版の制約を気にせずにアプリ開発したい
  - 1時間以上アクセスしないとスリープになる
  - 6時間/1日はスリープ状態にしないといけない
  - 一定時間以上連続するプロセスがkillされる(はず)
- VPSやクラウドだとミドルウェアの環境構築や、デプロイのセッティングに時間がかかる

Herokuはただ乗りフリーライダーの理論ですので、基本ごめんなさいですm( )m
一方で個人の趣味開発は、限られた時間との勝負なのでより効率的な開発手法を模索していて今回
dokku/dokku - GitHub』を使った方法をトライすることにしました!

🐮 画面からDokkuのDropletを作成

Digital Ocean」にログインして、Dropletを作成します。
「One-click App」=>「Dokku v0.4.10 on 14.04」を選んでDropletを作成してください。

🗻 ドメインの設定です

自分のDropletを作成して、IP(例 123.123.123.123) にブラウザでアクセス。

$ open 123.123.123.123

以下を登録してください

- 自分のSSHキー
- Custom Domain
- アプリごとのVirtual Host名の利用(onにしていいかも)

スクリーンショット 2016-01-08 22.43.36

Custom Domainを登録したら、自分のdomain側の設定を修正して、123.123.123.123 を見に行くようにしてください。

apps.yourdomain.com A 123.123.123.123
*.apps.yourdomain.com A 123.123.123.123

🍮 サーバに入ってpostgresqlのプラグインをインストール

公式チュートリアルにしたがって、『dokku/dokku-postgres - GitHub』をインストールします。

# ssh でサーバにログイン
$ ssh root@123.123.123.123
# dokku の postgresql プラグインをインストール
$ dokku plugin:install https://github.com/dokku/dokku-postgres.git
# PostgreSQL の 今回のアプリ用のDB を作成
$ dokku postgres:create dokku_sample_db
# dokkuのアプリケーションを作成
$ dokku apps:create dokku_sample_app
# DBをアプリケーションとをひも付け
$ dokku postgres:link dokku_sample_db dokku_sample_app

ちなみに、Dokkuで使えるPluginの一覧はこちら『dokku/plugins.md - Dokku』。

🐞 日本語環境の設定

language-pack-jaをインストールして日本語パッケージを入れましょう。

# ssh でサーバにログイン
$ ssh root@123.123.123.123
# apt-get を最新の状態にして language-pack-ja をインストール
$ sudo apt-get update && sudo apt-get install language-pack-ja

😼 日本時間の設定

$ mv /etc/localtime /etc/localtime.bak
$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

👽 改行文字の変換ツールdos2unix

改行文字でよくハマるので、入れておくことをお勧めします。 dos2unix FILE_PATH とかで改行文字をよしなにしてくれます。

apt-get install dos2unix

🐡 スワップ領域の設定

安定動作のためにスワップ領域を設定しましょう。
設定のしかたは、拙著『Ubuntu/CentOS サーバのスワップ領域の割り当て』がお勧めです。

🎂 Railsアプリケーションを作成

ローカルに戻ってサンプルのRailsアプリケーションを作成します。

# Railsアプリの作成
$ rails new dokku_sample_app --database=postgresql --skip-test-unit --skip-bundle -m https://raw.github.com/morizyun/rails4_template/master/app_template.rb
# アプリのフォルダに移動
$ cd dokku_sample_app
# Bookでscaffold
$ rails g scaffold book title:string auther:string price:float

Rubyのバージョンを指定します。2016/2/25時点では 2.2.3 まで対応しているようです。

# Gemfile
ruby '2.2.3'
# .ruby-version
2.2.3

routesにrootを追加します。

# config/routes.rb
Rails.application.routes.draw do
# ↓ を追加
root 'books#index'
end

.gitignore から config/secrets.yml を削除。そして、Gitにコミット。

# gitに登録
$ git add . -A && git commit -m 'first commit'
# git のremote サーバを追加
$ git remote add dokku dokku@yourdomain.com:dokku_sample_app

🎉 ローカルからの実行系

ローカルでのコマンド入力を簡単にしてくれる
SebastianSzturo/dokku-cli
を使5つデプロイします!

# gitの情報を読んで、herokutoolbelt
$ gem install dokku-cli
# secret keyをセット
$ bundle exec rake secret
$ dokku config:set SECRET_KEY_BASE="上で生成された文字列"
# サーバにdeploy
$ git push dokku master
# ブラウザで表示
$ dokku open

Railsで作成した画面が表示されれば成功です!

スクリーンショット 2016-01-08 22.52.38

🚕 dokku-cliのコマンド

以下のようなことができます。

# アプリ配下でコマンドを実行
dokku run <cmd> # Run a one-off command in the environment of the app
# よく使いそうなコマンド
dokku ssh # Start an SSH session as root user
dokku logs [-t] # Display logs for the app (-t follows)
dokku help [COMMAND] # Describe available commands or one specific command
# 設定変更系のコマンド
dokku config # Display the app's environment variables
dokku config:get KEY # Display an environment variable value
dokku config:set KEY1=VALUE1 [KEY2=VALUE2 ...] # Set one or more environment variables
dokku config:set:file <path/to/file> # Set one or more environment variables from file
dokku config:unset KEY1 [KEY2 ...] # Unset one or more environment variables
# プロセス/コンテナ系のコマンド
dokku ps # List processes running in app container(s)
dokku ps:rebuild # Rebuild the app
dokku ps:restart # Restart the app container
dokku ps:start # Start the app container
# その他便利コマンド
dokku nginx:build # (Re)builds nginx config for the app
dokku open # Open the app in your default browser
dokku url # Show the first URL for the app
dokku urls # Show all URLs for the app

🍣 DokkuのミドルウェアPlugin

PostgreSQLだけでなく、RedisやElasticsearch等のPluginも数コマンドで使うことができます。
公式サポートされているものだけでも次のようなものがあります。

CouchDB (beta)
Elasticsearch (beta)
MariaDB (beta)
Memcached (beta)
Mongo (beta)
MySQL (beta)
Nats (beta)
Postgres (beta)
RabbitMQ (beta)
Redis (beta)
RethinkDB (beta)
Copy Files to Image
HTTP Auth (beta)
Let's Encrypt (beta)
Maintenance mode (beta)
Redirect (beta)

また公式サポートされているPlugin以外にもコミュニティや個人がさまざまなPluginを提供しています。
詳しくは、『dokku/plugins.md - GitHub**』を見てみてください。

🚌 Redisのインストール

Dokku PluginとしてRedisを入れてみました!

# ssh でサーバにログイン
$ ssh root@123.123.123.123
# redis plugin をインストール
$ dokku plugin:install https://github.com/dokku/dokku-redis.git redis
# 新しいRedisのサービスを立ち上げ
$ dokku redis:create dokku_sample_redis
# Dokku => Redis をひも付け
$ dokku redis:link dokku_sample_redis dokku_sample_app

これで、アプリケーション側のconfigに以下が設定されます。

REDIS_URL: redis://dokku-redis-dokku_sample_redis:6379/0

上記のサービスを使えば、RailsのアプリケーションからRedisが使えます!

😀 感想

まだ、簡単なアプリケーションをデプロイしただけですので、もう少しいろいろ試した上ですが、今のところの感触はかなりありな気がします^^

🐹 Special Thank

🐰 変更来歴

(2016/01/24 19:30) Redisの設定方法を追記
(2016/05/01 13:25) 日本時間の設定方法

📚 おすすめの書籍