I choose appfog for Octopress blogging. So how can I setup?
前回のエントリー で、appfogをOctopressのホスティング先に採用したと書いた。今回は実際の設置方法について。
Create new app!
appfogにサインアップした後に、webの管理コンソールを見ると「Create App」というリンクがあるので、ここから新しいアプリを作成することができる。
管理コンソール
step1
ってやると確かに作れるんだけど、やらない。このまま作成するとruntimeがruby1.9.2になってしまうので。appfogは1.9.3に対応しているので、runtimeを指定してアプリを作成する。これは、webからできなさそうなので、appfog CLIツールを使って実施する。
af the CLI tool
AppFog Documentation のGetting Started > Overview に書いてある通りにやると、afコマンドをインストールできるので、手順通り実施する。rbenvを使っている場合はrbenv rehashを忘れずに。
install af
作成前に、.afignoreファイルを作っておく。これは、.gitignoreと同じようなファイルで、デプロイ時にアップロードを除外するファイルやディレクトリを指定しておくもの。Getting Started > AF CLI Tool > .afignore に説明が書いてある。
af push to create new app
Octopressディレクトリでaf pushを実行すると、アプリが作成できる。が、最初にやった時はエラーが出て失敗したwwww
このエラーはよく出るので、こんなところでめげてはいけない。このエラー、次の期末試験にも出ますからね。
create new app $ af push --runtime ruby193
Would you like to deploy from the current directory? [ Yn] : Y
Detected a Rack Application, is this correct? [ Yn] : n
Select Application Type: 7
Selected Sinatra Application
1: AWS US East - Virginia
3: AWS Asia SE - Singapore
4: Rackspace AZ 1 - Dallas
Application Deployed URL [ blog-satooshi-jp.ap01.aws.af.cm] :
Memory reservation ( 128M, 256M, 512M, 1G, 2G) [ 128M] : 512M
How many instances? [ 1] : 1
Create services to bind to 'blog-satooshi-jp' ? [ yN] : N
Would you like to save this configuration? [ yN] : Y
Manifest written to manifest.yml.
Checking for available resources: OK
Staging Application 'blog-satooshi-jp' : ..........................................…
HTTP exception: RestClient::ServerBrokeConnection:Server broke connection:
もしこのエラーが出ても、アプリの作成は出来ているはずなので、webの管理コンソールからアプリを起動させてやればいい。このコマンドが完了すると、manifest.ymlというファイルが出来上がっているはずだ。説明はGetting Started > AF CLI Tool > Manifests にある通り。今回は特に必要ないが、構成を使い回す時に便利らしい。
manifest.yml description : Sinatra Application
url : ${name}.${target-base}
Oops! Octopress can't work!
herokuで動かしていたのは、Octopressをgit cloneしたものそのままのコードだった。しかし、appfogではそのままではエラーが発生し、アプリが起動しなかった。rubyはよく分かってないが、appfogにアプリを作成した直後のapp.rbには、こんなコードがあった。
app.rb set :protection , except : :ip_spoofing
どうやらこのファイルにルーティングするコードを書いておけばいいらしい。git clone直後のOctopressのconfig.ruはこうなっている。
config.ru # The project root directory
$root = :: File . dirname ( __FILE__ )
class SinatraStaticServer < Sinatra :: Base
send_sinatra_file ( request . path ) { 404 }
send_sinatra_file ( '404.html' ) { "Sorry, I cannot find #{ request . path } " }
def send_sinatra_file ( path , & missing_file_block )
file_path = File . join ( File . dirname ( __FILE__ ), 'public' , path )
file_path = File . join ( file_path , 'index.html' ) unless file_path =~ /\.[a-z]+$/i
File . exist? ( file_path ) ? send_file ( file_path ) : missing_file_block . call
OctopressのコードではSinatraを継承してルーティングをしていたようだ。なので、このSinatraStaticServerクラスの中身をapp.rbに直接書くと、無事にアプリが起動するようになった。
app.rb # The project root directory
$root = :: File . dirname ( __FILE__ )
send_sinatra_file ( request . path ) { 404 }
send_sinatra_file ( '404.html' ) { "Sorry, I cannot find #{ request . path } " }
def send_sinatra_file ( path , & missing_file_block )
file_path = File . join ( File . dirname ( __FILE__ ), 'public' , path )
file_path = File . join ( file_path , 'index.html' ) unless file_path =~ /\.[a-z]+$/i
File . exist? ( file_path ) ? send_file ( file_path ) : missing_file_block . call
Great! now I can setup Octopress on appfog. What's the next?
ここまでの手順で、アプリの設定が完了した。編集後のデプロイはaf updateコマンドで実行できる。
af update $ rake new_post[ 'setup-octopress-on-appfog' ]
Creating new post: source /_posts/2013-02-22-setup-octopress-on-appfog.markdown
# commit to git repository
$ git commit -m "add new post"
Updating application 'blog-satooshi-jp' ...
Checking for available resources: OK
Stopping Application 'blog-satooshi-jp' : OK
Staging Application 'blog-satooshi-jp' : OK
Starting Application 'blog-satooshi-jp' : OK
Conclusion: appfog is faster than heroku for Japanese blogger, right?
前回のエントリーにも書いたが、appfogの方が日本に近いシンガポールリージョンを選択できるため、herokuよりもレスポンスが速い。しかし、今回のセットアップ中に何度もエラーが発生していたのが若干気がかりだ。何度かデプロイしてみると、エラーの発生が収まっていった。ちなみに、デプロイはherokuの方が速く終わる。appfogはgitを使わないため、githubなりbitbucketでバージョン管理が必要である。