LoginSignup
12
7

More than 5 years have passed since last update.

【対策】Capistrano3 mkdir で permission denied

Posted at

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

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7