Herokuのプランが変わったのでRailsアプリケーションをさくらに移行した。
ここ最近Herokuの料金体系が変わってFree Dynoは18時間までしか動かせないようになったらしい。それにともなってこんなHackをする人まで出てきているようで、Freeでとりあえず動かしたいという人たちに与える影響はそれなりにあるように思える。
http://ssig33.com/text/%E6%9C%80%E6%82%AA%EF%BC%81%E6%84%8F%E5%9C%B0%E3%81%A7%E3%82%82%20Heroku%20%E3%82%92%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%86
そういう僕も家族用に自分で作ったウェブアプリケーションを運用していたんだけど、料金体系が変わる前から自分のさくらVPSに移行したいと思っていたところにこのプラン変更が来たのでこれを機にと思い移行してみることにした。
ちなみに移行したアプリケーションは、
- 普通のRailsアプリケーション
- PostgresqlがあればOK
というシンプルなものだった。Herokuで色々なアドオンを使いまくってるぜというわけではなかったのでそんなには手間ではなかったと思う。
移行先は色々な用途のために元々使っていたさくらVPSの1Gプラン。月額900円。
- CentOS 6.4
- 2 core
- 1GBメモリ
Postgresqlのインストール
別のRailsアプリケーションも動かしていたけれどそちらはMySQLを使っていたので、移行先のサーバーにはPostgresqlが入っていなかった。
インストールして初期設定を済ます。
$ wget http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
$ sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm
$ sudo yum install -y postgresql94-server postgresql94-devel postgresql94-contrib
$ sudo /etc/rc.d/init.d/postgresql-9.4 initdb
$ sudo /etc/rc.d/init.d/postgresql-9.4 start
$ sudo chkconfig postgresql-9.4 on
$ sudo su - postgres
$ createuser -s hiromasa
rbenv
対象のアプリケーションが2.0.0-p598
で動いていたので、対象のマシンのrbenvにもそのバージョンを入れ、bundlerのインストールも済ませておく。bundlerはよく忘れる。
$ rbenv install 2.0.0-p598
$ rbenv local 2.0.0-p598
$ gem i bundler
Passenger
これまで動かしていたRailsアプリケーションは全部Ruby1.9.3系で動いていたが、今回Ruby2系も導入したことにより、Passengerも使い分けなければいけないことになった。
幸い、それを指南してくれる記事があったのでまんまこれと同じようにやったら使い分けることができた。よかった。
http://y-ken.hatenablog.com/entry/how-to-use-multiple-ruby-version-in-one-apache-passenger
本当に助かりました。ありがたい。
ここまででサーバー側は大体OKになったと思う。
デプロイ
Herokuの恩恵の1つにデプロイの簡単さがあげられる。しばらく自前でのデプロイをしてこなかったため、いざ自分でやろうとするとものすごく面倒だということを思い出した。
Capistrano
2年前にちょちょっと使っていたCapistranoは3系になって色々進化していた。一応3系がベータのときに使っていたことがあり、そのときのデプロイスクリプトも残っていたので、今回のデプロイもそれを参考にすれば楽勝だろうとタカをくくっていたが、変なところで動かなくてハマった。
エラーの内容を残しておくのを忘れたのでうろ覚えでどんな現象だったのかを書いておくと、デプロイ途中で何かをcp
するコマンドがあるんだけど、本来は
cp a b c destination/
という風になっていてほしいところを、
cp a
b
c
destination/
と改行が入った状態でコマンドが実行されるようで、b
とかc
みたいなコマンドはありません、というエラーで終了してしまっていた。
調べても全然わからないので別のデプロイツールを探すことに。
Mina
Capistranoが嫌になったのでRuby Toolboxで他のデプロイツールを探したら、Minaってのを見つけました。
今回やりたかったデプロイプロセスはすごく単純で、
- ソース持ってくる
- bundleする
- db:migrateする
- asset:precompileする
- Apacheを再起動する
っていうだけだったので設定はほとんどいらなかった。サーバーの情報やソース管理のURLぐらいかな。
Minaの使い方はREADMEにある通りで、まず、
$ mina init
して設定ファイルを生成し、次にその設定ファイルの一部をこんな風に書き換え、
require 'mina/rbenv' # コメントを外す
set :user, 'hiromasa'
set :domain, 'vps' # ~/.ssh/configのHostを使うと便利
set :deploy_to, "/home/hiromasa/apps/myappname"
set :repository, 'https://user:password@bitbucket.org/hiromasa/myapp.git'
task :environment do
invoke :'rbenv:load' # コメントを外す
end
次にセットアップコマンドを叩く。
$ mina setup
これをやるとティレクトリ等が生成され、database.yml
やsecrets.yml
が用意される。データベースのパスワードなどはここに書けばいいのでソース管理に含める必要はないということになる。
最後にデプロイコマンドを叩く。
$ mina deploy
capistranoに比べてシンプルに書けた気がする。少なくともcp
で変なエラーは起きなかったし。
databaseの移行
Herokuからデータを移行する。
$ heroku pg:backups capture -a myapp
$ curl -o latest.dump `heroku pg:backups public-url -a myapp`
これでPostgresqlのdumpが手に入るので、さくらVPSのデータベースにインポートしてあげれば良い。
# ローカル
$ scp latest.dump vps:~/
# リモート
pg_restore --verbose --clean --no-acl --no-owner -U hiromasa -d mydatabse latest.dump
これで無事動くようになりました。
これで18時間で止まることもなくなったし、日本のサーバーになったのでレスポンスが速くなり快適に使えるようになった。おしまい。