DotCloudにSinatraアプリ(Lokka)を設置してみた

最近Lokkaにはまってる


で,せっかくなのでいろんな環境でデプロイしてみたりしてるんだけど,
その中でもDotCloudでのデプロイは面倒という話

DotCloudとは

PaaSとか言われるものに分類されるっぽい
HerokuとかGAEとかと一緒にされますが,
それらよりもいろいろな言語とかデータベースとか
その他ソフトウェアに対応してる

DotCloudめんどう

DotCloudはいろいろな部分が低レベル
もともとruby専用だったHerokuと違い
使う言語やDBを指定しないと行けなかったり,
設定がruby環境変数ではなくファイルで置かれていたり,
sshで作業することが前提となっていたり(そのおかげでcronとか普通に使えるのは便利)


どちらかというとレンタルサーバで作業している気分になれる

仕様変更

ついこの間バージョンアップがあったようで使い方が変更されている
公式ドキュメント以外ほぼ情報がないところが多くて大変困る

Lokkaのデプロイ

めんどくさかったので一番楽そうな方法をまとめた

ダウンロード
git clone git://github.com/yayugu/lokka.git
git checkout dotcloud

あるいは
公式のLokkaをcloneして

diff --git a/config.yml b/config.yml
index 0dab043..98de2a4 100644
--- a/config.yml
+++ b/config.yml
@@ -1,5 +1,15 @@
+<% 
+# for dotcloud
+dotcloud = 
+  if File.exist? '/home/dotcloud/environment.json'
+    JSON.parse(File.read('/home/dotcloud/environment.json'))['DOTCLOUD_DATA_SQL_URL'].gsub('pgsql', 'postgres') + '/template1'
+  else 
+    nil
+  end
+%>
+
 production:
-  dsn: <%= ENV['DATABASE_URL'] || ENV['DUOSTACK_DB_MYSQL'] %>
+  dsn: <%= ENV['DATABASE_URL'] || ENV['DUOSTACK_DB_MYSQL'] || dotcloud %>
 development:
   dsn: sqlite3://<%= root %>/db/development.sqlite3
 test:
diff --git a/dotcloud.yml b/dotcloud.yml
new file mode 100644
index 0000000..3607612
--- /dev/null
+++ b/dotcloud.yml
@@ -0,0 +1,7 @@
+www:
+  type: ruby
+  exclude_bundler_groups:
+    - development
+    - test
+data:
+  type: postgresql

dotcloudではdbのURLとかはruby環境変数に入れてくれないので読みにいく必要がある.


それからpostgresなのはmysqlだとデフォルトデータベースがないので,dbのサーバにsshでログインして'create database lokka;'とかやる必要があるから.
postgresだとなぜかtemplate1という空のデータベースが1つつくられてあるのでそれを利用*1



デプロイ

dotcloudの各種設定をしてから

dotcloud create lokka
dotcloud push -bdotcloud lokka
dotcloud run lokka.www "cd current && rake db:setup"

dotcloudブランチをプッシュする*2


dotcloud runはsshでログインして1行実行するコマンド.wwwはrubyとかがおいてあるサーバ.dataだとmysqlのサーバになる.で,なぜかログインしたディレクトリ直下ではなく./currentにpushしたデータがあるのでcdしてrake

おしまい

自由度が高い&変な抽象化っていうのは厄介だね.
でも無料でいろいろできるしパフォーマンスもHerokuと比べて良かった気がしたので
そのへんはいいところ

特にHerokuの泣きどころの久しぶりのアクセス1回目はすごく遅いってもんだいがあんまりなさそう(な気がした)のはいいね

*1:Herokuだと基本はsharedな中にそのアプリ用のデータベースが自動でつくられる

*2:ちなみに'dotcloud push'はデフォルトではrsyncでgitかmercurialを使ってればそれでプッシュするという混乱極まりない仕様になっている