先日、cloudControlにPadrinoを構築してみました。
Padrino+MySQL環境をcloudControlに構築してみた - メモ的な思考的な
他にも良い環境がないかを探してみたところ、AppFogがありました。
AppFog - Platform as a Service for public clouds
PHPFogの後継のような感じなためかPHPの情報は出てくるのですが、Ruby関係の情報が少ない印象を受けました。
また、公式サイトにもRubyでSinatraやRailsの情報はあるのですが、Padrinoに関しては記載がありませんでした。
そこで、実際にRuby(Padrino + MySQL)で構築できるかどうかを試してみました。
Ruby - AppFog Documentation
開発環境
cloudControlの時と同じです。ただし、bundle package を使うようなので、ローカルにもMySQLを入れる必要があります。
参考:Ruby - bundle package のはまりどころ - Qiita
AppFogのアカウント作成
AppFogの右上の「SIGN UP」よりアカウントを作成します。
Padrinoのプロジェクト作成
adapterにmysql2を指定する以外は、cloudControlの時と同じです。
padrino g project
-a mysql2 -d activerecord -t rspec -s jquery -e haml -c sass -b
ローカルのMySQL作成
apt-getで持ってきます。ローカル開発ということもあり、パスワードは特に設定しません。
sudo apt-get install mysql-server libmysqlclient-dev libmysql-ruby
ローカルのMySQLに、databaseを作成
Padrinoから扱うためのdatabaseを作成します。database名はpadrinoで自動生成するものと合わせました。
参考:Ubuntu 12.04 LTS - MySQL - インストール : Server World
mysql -u root
create database_development default character set utf8;
念のため、作成されたことを確認し、終了します。
show databases;
quit
config/database.rb を修正
ローカルのMySQLに合わせ、内容を修正します (特に、socketの値が正しくない)。
参考:/tmp/mysql.sockなんて知らんがな - 自分の仕事を憎むには人生は余りにも短い
ActiveRecord::Base.configurations[:development] = { :adapter => 'mysql2', :encoding => 'utf8', :reconnect => true, :database => '<your app>_development', :pool => 5, :username => 'root', :password => '', :host => 'localhost', #:socket => '/tmp/mysql.sock' socket: '/var/run/mysqld/mysqld.sock' }
ローカルの管理画面を作成
padrino g admin
bundle install
padrino rake ar:migrate
padrino rake seed
念のため、起動して、「http://localhost:3000/admin」の動作を確認します。
padrino s
アプリをAppFogへデプロイ
必要なツールのインストール
af、および、caldecott (MySQLへつなぐ時に必要) をインストールしておきます。
参考:
sudo gem install af
sudo gem install caldecott
デプロイの流れ
ログインします。
af login
ランタイムを指定して、アプリをデプロイします (ランタイムを指定しない場合、Rubyの1.8.7が使われるようです。)。
参考:Ruby - AppFog Documentation
コマンド入力後にいくつか質問が出るので、順番に入力していきます (太字が入力内容)
af push
--runtime ruby193 Would you like to deploy from the current directory? [Yn]:
y
Detected a Rack Application, is this correct? [Yn]:
y
1: AWS US East - Virginia
2: AWS EU West - Ireland
3: AWS Asia SE - Singapore
4: Rackspace AZ 1 - Dallas
5: HP AZ 2 - Las Vegas
Select Infrastructure:
1
# お好みのインフラを選択すれば良いかと思います
Application Deployed URL [
.aws.af.cm]:
(Enter)
Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]:
(Enter)
# あとで変更は可能です
How many instances? [1]:
(Enter)
# 同じく、あとで変更は可能です
Create services to bind to '
'? [yN]:
y
# MySQLのサービスを使います
1: mongodb
2: mysql
3: postgresql
4: rabbitmq
5: redis
What kind of service?:
2
# 今回はMySQLを使います
Specify the name of the service [mysql-<値>]:
(Enter)
# サービス名の変更があれば、編集します
Create another? [yN]:
n
# これ以上は使用しません
Would you like to save this configuration? [yN]:
y
# 保存しておきます
# 以下が表示されればOK
Manifest written to manifest.yml.
Creating Application: OK
Creating Service [mysql-<値>]: OK
Binding Service [mysql-<値>]: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (222K): OK
Push Status: OKStaging Application '
': OK Starting Application '
': OK
AppFogのMySQLをマイグレート
ここまでではAppFog上のMySQLのDatabaseが作成されていないため、マイグレートを行います。
参考:Rails - AppFog Documentation
上記で作成したMySQLのサービスにつなぎます。
af tunnel mysql-<値>
以下のような値が表示されます。production環境のMySQL接続情報であるため、コピーしておきます。
Service connection info:
username :
password :
name :
infra : awsStarting tunnel to mysql-<値> on port 10000.
操作方法を聞かれたら、Padrinoで操作するため、1を選択します。
1: none
2: mysql
3: mysqldump
Which client would you like to start?:1
上記でコピーしておいたproduction環境の設定を行います。
config/database.rb
ActiveRecord::Base.configurations[:production] = { :adapter => 'mysql2', :encoding => 'utf8', :reconnect => true, #:database => '<your app>_production', database: '<name>', :pool => 5, #:username => 'root', username: '<username>', #:password => '', password: '<password>', #:host => 'localhost', host: '127.0.0.1', #:socket => '/tmp/mysql.sock' port: 10000 }
マイグレートします(エラーが出る場合、少し待てばできるようになるかもしれません)。
また、環境指定するため、PADRINO_ENVを使います。
参考:Padrinoで追加したRakeタスクをProduction環境として実行する - テノニッキ (@hideack 's diary)
PADRINO_ENV=production padrino rake ar:migrate
=> Executing Rake ar:migrate ...
== CreateAccounts: migrating =================================================
- create_table(:accounts)
-> 2.4502s
== CreateAccounts: migrated (2.4503s) ========================================
seedでデータを投入しておきます(エラーが出る場合、少し待てばできるようになるかもしれません)。
PADRINO_ENV=production padrino rake seed
AppFogへ反映させるため、アプリのアップデートを行います。
af update
--runtime ruby193
最後にアクセスして、動作を確認します。
http://
使ってみての感想としては、以下の通りです。
- AppFogの管理画面を見るとGUIが充実していた (cloudControlより分かりやすそう)。
- アドオンはいろいろとある。独自ドメインとかメール関連とかもあり。
- 無料枠であっても、リソースの配分が行えるのがありがたい。
- アプリのログはどこで見れば...
AppFogも個人的に使う分にはいろいろとできそうですので、引き続き触っていきたいと思います。