ADZ 學習筆記

Ruby/Rails, Startup, Life

rails 筆記 - capistrano deploy multiple stacks 心得

| Comments

今天要試著 deploy 專案到 multiple stacks 上,分成了 web, app, db 三檯機器,在 deploy 時發現了一些問題,記錄一下。

nginx 負責 web proxy 再由 upstream 透過 private networking 到一或多個 app server 很好理解、感覺應該很快就能搞定,但是在 deploy 時,一直卡在 deploy:assets:update_asset_mtimes 這個 task 找不到 database configuration file。

deploy:assets:update_asset_mtimes

找了很久後發現,原來 deploy:assets:update_asset_mtimes 這支預設是 run 在 web role 上:

https://github.com/capistrano/capistrano/blob/legacy-v2/lib/capistrano/recipes/deploy/assets.rb#L8

所以其實可以透過 deploy.rb 指定 assets_role 的方式選擇由哪些角色來做 assets compile,原本想說配置是 web 專心跑 web 該做的事情,不做其他事情,於是一開始先把 assets_role 設定成 app role 來負責。

這樣設定運作的很順利,不過睡覺前突然想到:web 上的 nginx root 指向的位置是沒有 compile 完的 assets,只是因為我有用 CDN 存放 assets file 才沒有出錯,而不一定所有人都會把 assets 放到其他 CDN 下,想一想後發現拿 web 來 compile assets 也滿合理的。

現在的問題是 deploy:assets:update_asset_mtimes 在 web 上沒有 database.yml 會錯,經過測試後發現,其實不需要正確的 database configuration,只需要有這個檔案,和 format 即可。

所以改了 deploy task 後順利解決這個問題了。

Assets manifest

解決完以上問題,打開網站發現,所有 css, js 都不見了,發現除了沒有用 CDN web 需要 compile 一次 assets,app 角色也需要,因為所有 compile 完的 assets filename 後面都會被帶上一些碼來避免 browser cache 問題,而 application server 需要 compile 完的 manifest 擋,最後在 deploy.rb 加上以下這行,讓 web & app 都 compile assets 就解決問題了:

set :assets_role, [:web, :app]

總結

mutiple stack with CDN

set :assets_role , [:app]

mutiple stack without CDN

set :assets_role , [:web, :app]

Comments

comments powered by Disqus