2011SinatraとDataMapperで作ったWebアプリをHerokuに移行した時のメモ。この記事では以下のような作業について書いています。小規模であれば無料で使えて、かつロックインされないからです。Engineの料金体系が変更された際に終了に追い込まれてしまったサービスが幾つかありましたが、Herokuでは同じようなことがあっても他の環境に逃げればいいだけなので安心です。gemの管理はBundlerで行います。デプロイはgitで行うので、アプリケーションのファイルはgitで管理しておく必要があります。アプリケーションの作成Herokuの操作はほぼすべてgemをインストールしてherokuコマンドで行います。createコマンドでアプリケーションを作成します。初回はメールアドレスとパスワードの入力、および公開鍵の送信を行いますが、指示に従って進めればOKです。この時、ローカルのgitリポジトリのremoteにherokuが追加されます。myappデプロイデプロイはリモートのリポジトリにpushするだけです。push後に自動的に依存関係の解決が行われ、アプリケーションが動作するようになります。masterデータベースの移行Herokuでは無料の範囲だとRDBMSにPostgreSQLを使うことになります。私はこれまでSQLiteを利用していましたが、RDBMSの違いはDataMapperが吸収してくれるので接続先のURLを変更するだけで移行できました。Herokuでの接続先はDATABASE_URLという環境変数で渡されます。以下のようにすると、Heroku上ではPostgreSQL、ローカルではこれまでどおりSQLiteで作業できます。'sqlite3://db/database.sqlite3'データベースのマイグレーション・アップグレードはrakeで行います。利用している場合は問題ありませんが、そうでなければGemfileにrakeを追加し、Rakefileを作成する必要があります。rakeコマンドで実行します。db:migrateデータの移行これまでのデータを移行するにはtapsというgemを利用します。db:pushコマンドでデータを送信します。元のデータベースは、SQLiteであれば”sqlite://データベースへの相対パス”、PostgreSQLであれば”postgres://user:password@host:port/database_name”のように指定してください。pushで行うため、リポジトリにないファイルをリモートに置くことができません。そこで、Herokuでは設定のやり取りに環境変数を利用します。以下のコマンドで設定を行うことができます。設定を追加するとアプリケーションは自動的に再起動して設定が反映されます。...接続先のときと同様に、Ruby側ではENVで参照できます。ENV['SESSION_COOKIE_SECRET']endキャッシュの利用Herokuではデフォルトの構成ですでにVarnishが挟まっていて、Cache-Controlヘッダを設定するだけで適切にキャッシュしてくれます。...end独自ドメインの利用custom_domainsというアドオンの追加とDNSの設定が必要です。www.example.comDNSの設定では、以下の3つのIPアドレスのaレコードを追加します。75.101.163.4475.101.145.87174.129.212.2以下はバリュードメインでの設定例。174.129.212.2問題点Herokuはgitのsubmoduleに対応していません。根本的な解決方法はないので、おとなしくファイルを自分のリポジトリに追加しましょう。おわりにいくつか作業は必要でしたが、割とあっさりRackアプリが動いてしまったのは驚きでした。他の環境で動作する状態が崩れていないのがすばらしいですね。GAEのイメージでこの手のサービスは独自のルールがあって面倒なのではないかと思っていたのですが、Herokuではそんなことはまったくなく、もっと早く手を出していればよかった、というのが率直な感想です。