Ошибка разрешений кэша при развертывании с Capifony

При развертывании с Capifony проекта Symfony2 я получаю это сообщение об ошибке в журнале apache при доступе к веб-странице:

Неустранимая ошибка PHP: необработанное исключение "RuntimeException" с сообщением "Не удалось записать файл кэша"/var/deploys/acme/releases/20150219150638/app/cache/prod/classes.php"

Чтобы этого избежать, каждый раз при развертывании приходится выполнять chmod 777 -R cache для исправления разрешений, что не кажется мне хорошим решением.

Кеш установлен в writable_dirs вариант, поэтому я не знаю точно, почему он дает ошибку разрешений:

set :writable_dirs, ["app/cache", "app/logs", "app/sessions"]

У меня есть следующая конфигурация deploy.rb:

set :stages,        %w(production staging)
set :default_stage, "staging"
set :stage_dir,     "app/config"
require 'capistrano/ext/multistage'

set :application, "Api"
set :domain,      "<my_domain>"
set :deploy_to,   "/var/deploys/acme.com"
set :app_path,    "app"

set :repository,  "git@bitbucket.org:acme/api.git"
set :scm,         :git

set :model_manager, "doctrine"
# Or: `propel`

role :web,        domain
role :app,        domain, :primary => true

set  :keep_releases,  3

# Be more verbose by uncommenting the following line
logger.level = Logger::MAX_LEVEL

# Other options
set :user, "root"
set :use_sudo, false

# Symfony2 specific configuration
set :shared_files, ["app/config/parameters.yml"]
set :shared_children, [app_path + "/logs", web_path + "/uploads", "vendor"]
set :use_composer, true
set :update_vendors, true 
set :writable_dirs, ["app/cache", "app/logs", "app/sessions"]
set :webserver_user, "www-data"
set :permission_method, :chown
set :use_set_permissions, true
set :assets_install, true
set :dump_assetic_assets, true

task :upload_parameters do
  origin_file = "app/config/parameters.yml"
  destination_file = shared_path + "/app/config/parameters.yml"

  try_sudo "mkdir -p #{File.dirname(destination_file)}"
  top.upload(origin_file, destination_file)
end

after "deploy:setup", "upload_parameters"

ОБНОВИТЬ

Папка кэша имеет следующие разрешения при развертывании:

drwxrwxrwx 3 root root 4096 Feb 20 13:13 cache

Внутри папки кеша также создается папка prod со следующими разрешениями:

drwxrwxr-x 7 root root 4096 Feb 20 13:13 prod

ОБНОВЛЕНИЕ 2

Я использую root как пользователь, потому что на сервере пользователь root имеет мой открытый ключ ssh. Если я устанавливаю другого пользователя в конфигурации, он запрашивает у меня пароль root при развертывании. Однако я установил webserver_user переменная в моем конфиге выше. Также пользователь root его нет в группе www-dataдолжно ли это быть?

Моя версия capifony это 2.8.3. Вот пример команды, которую она выполняет при установке разрешений, если chmod_alt выбран способ настройки прав доступа:

getfacl --absolute-names --tabular ...

Эта ошибка также генерируется, если у меня есть chmod как метод установки прав.

Хотя предыдущая команда выдает ошибку, я думаю, что команда, которая вызывает откат (с chmod_alt) это:

`echo stat /var/deploys/acme.devel/releases/20150226123037/app/sessions -c %U`

Он генерирует следующее сообщение об ошибке (после чего выполняет откат):

cannot stat `/var/deploys/acme.devel/releases/20150226123037/app/sessions': 
No such file or directory

3 ответа

Решение

Я установил следующие параметры в моем deploy.rb для того, чтобы он работал:

set: use_sudo, true
default_run_options [: pty] = true

И я удалил app/sessions из записываемых папок вариант:

set: writable_dirs, ["app / cache", "app / logs"]

Если вы используете Linux, вы можете попытаться настроить ACL для этих каталогов, чтобы они не переопределялись при каждом развертывании.

См. Раздел "Настройка разрешений" в документации по установке.

Я предпочитаю метод как

$ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs
$ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs

Ваша система, вероятно, не поддерживает chmod +a, Попробуйте использовать:

set :permission_method, :chmod_alt

Другие вопросы по тегам