WEB公開用のパス(/var/www/html) の所有者は nginxやapacheで
デプロイ用のユーザは deployuser だったりすると、cap deploy
で permission deniedが発生する。
mkdir: ディレクトリ `/var/www/html/shared' を作成できません: 許可がありません
mkdir: ディレクトリ `/var/www/html/releases' を作成できません: 許可がありません
mkdir を実行するときに sudoでなく普通に実行してるのが原因の模様。
下に対策を上げてみたけど、俺は対策2を採用してみた。
対策1. ルートディレクトリのパーミッションを変えちゃう
$ chown -R deployuser:deployuser /var/www/html
これでデプロイは動く様になる。その代わりnginxとかapacheの実行ユーザも変えなきゃいけないので面倒くさい。
VirtualHostで運用してるともう本当に面倒くさい
対策2. デプロイ中だけファイルのパーミッションを変えちゃう
capistrano に初期処理/事後処理としてパーミッションを変更させる。
とりあえず普通に動く。余計なファイルまで chownしないように deploy_toの管理に注意
deploy.rb
namespace :deploy do
task :init_permission do
on release_roles :all do
execute :sudo, :chown, '-R', "#{fetch(:user)}:#{fetch(:group)}", deploy_to
end
end
task :reset_permission do
on release_roles :all do
execute :sudo, :chown, '-R', "nginx:nginx", deploy_to
end
end
before :starting, :init_permission
after :finished, :reset_permission
end
対策3. mkdirのオーバーライド
mkdirを実行するタスクをオーバーライドして sudo実行にする。
capのバージョンによってtaskが増えてるかも。
deploy.rb
namespace :deploy do
Rake::Task["deploy:check:directories"].clear
Rake::Task["deploy:check:linked_dirs"].clear
namespace :check do
desc '(overwrite) Check shared and release directories exist'
task :directories do
on release_roles :all do
execute :sudo, :mkdir, '-pv', shared_path, releases_path
end
end
task :linked_dirs do
next unless any? :linked_dirs
on release_roles :all do
execute :sudo, :mkdir, '-pv', linked_dirs(shared_path)
end
end
end
end
【参考】
http://qiita.com/paty-fakename/items/a1d4034d97ef9d36ec3e