概要
herokuへのデプロイ中、アプリのslugsizeが前見た時の倍(100MB)になっていて
コーヒーこぼしかけた。
最大サイズギリギリちゃうんかい!とおもったら最大は300Mらしく一安心したけど、
とりあえず調査。
めも
$ heroku run bash --app アプリ名
heroku~ $ du -m -s *
31 app
9 bin
1 config
1 config.ru
2 db
2 doc
1 Gemfile
1 Gemfile.lock
1 lib
1 log
1 Procfile
59 public
1 Rakefile
1 README.md
1 script
1 spec
1 ssl
27 tmp
180 vendor
heroku~/vendor $ du -m -s *
1 assets
144 bundle
1 heroku
1 plugins
36 ruby-1.9.3
/vendor/bundle/ruby/1.9.1 $ du -m -s *
1 bin
1 build_info
2 bundler
1 bundler-1.3.2.gem
1 doc
142 gems
1 specifications
gemがほとんどなんだなーっと。でも最近gem入れてねーっすよ??
ってことは。。。
~/public $ du -m -s *
1 404.html
1 422.html
1 500.html
58 assets
1 favicon.ico
1 mentenance.html
1 robots.txt
。。。assetsの中も圧縮されたデータがハッシュ付きで入ってるしなー。
いままでassets:precompileをdeploy時にやっていたので、これを機にローカルでやるように切り替えよう。
ローカルプリコンパイルを有効にして
heroku labs:enable user-env-compile -a myapp
プリコンパイルして
RAILS_ENV=production bundle exec rake assets:precompile
デプロイ!
Asset precompilation completed (162.43s)
これが
Detected manifest.yml, assuming assets were compiled locally
こうなる。yay!
でも、slugsizeは変わりません。。。。
調査の結果、次のようなやり方で解決しました。
asset_sync使ってprecompileしたassetsgがs3にあげてあるのに、
herokuのpublic/assetsにあげられていることが原因だった。
というわけで、ローカルでプリコンパイルの設定を修正しました。
1. gitignoreの見直し
下の二行を追加した。
manifest.ymlにdigest付きの最新ファイルが記述してあり、
herokuではそれをベースにassetの参照先urlを生成しているので、そ
れ以外のassetsファイルをgit管理対象外とする。
public/assets/*
!public/assets/manifest.yml
2. プリコンパイル
rake assets:precompile
一度ステージングのs3を削除しておいたので、全件アップ。
めっちゃ時間かかった。。。
3. herokuにpush
git push heroku master
-----> Preparing app for Rails asset pipeline
Detected manifest.yml, assuming assets were compiled locally
-----> Discovering process types
Procfile declares types -> web, worker
Default types for Ruby/Rails -> console, rake
-----> Compiled slug size: 59.8MB
-----> Launching... done, v134
100M --> 59M
めっちゃへった。ok。
いろいろ試行錯誤してやったので、asset_pipelineのいい勉強になりました。
herokuはslugサイズ10Mを推奨しているらしい。今は69M弱。根本的に減らさないとまずいな。。。