PIYO - Tech & Life -

RailsアプリをHeroku→さくらVPSに移行

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.ymlsecrets.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時間で止まることもなくなったし、日本のサーバーになったのでレスポンスが速くなり快適に使えるようになった。おしまい。