1
votes

When I deploy with Capifony a Symfony2 project I get this error message in apache log when accessing a webpage:

PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Failed to write cache file "/var/deploys/acme/releases/20150219150638/app/cache/prod/classes.php"

In order to avoid this, each time I deploy I have to execute chmod 777 -R cache for fixing the permissions, which doesn't seem to me like a good solution.

The cache is set in the writable_dirs option, so I don't know exactly why it gives a permissions error:

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

I have the following deploy.rb configuration:

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,  "[email protected]: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"

UPDATE

The cache folder has the following permissions when deployed:

drwxrwxrwx 3 root root 4096 Feb 20 13:13 cache

Inside the cache folder, a prod folder is also created with these permissions:

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

UPDATE 2

I use root as user because in the server the user root has my public ssh key. If I set another user in the config, it asks me for root password when deploying. However I have set the webserver_user variable in my config above. Also the user root it's not in the group www-data, should it be?

My capifony version it's 2.8.3. Here is an example of command it executes when setting permissions if chmod_alt is selected as settings permissions method:

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

This error is also generated if I have chmod as setting permissions method.

Although the previous command gives an error, I think the command that provokes the roll back (with chmod_alt) is this one:

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

It generates the following error message (after which it makes a rollback):

cannot stat `/var/deploys/acme.devel/releases/20150226123037/app/sessions': 
No such file or directory
3
Which owner, group and permissions you have on cache directory before running chmod 777 -R cache ?Hpatoio
I've updated my question with that info.rfc1484
Don't deploy with root user!!!! Use a custom user that is in the same user group of the web server.Matteo
I'm deploying at the moment with another user that is part of the www-data group but the problem remains the same.rfc1484
Well, just to be sure. Does /app/sessions exists ? I mean, is in the repo ?Hpatoio

3 Answers

1
votes

I have set the following parameters in my deploy.rb in order to make it work:

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

And I have removed app/sessions from writable dirs option:

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

0
votes

If you are using linux you could try to configure ACL for these directories to not override them each time you deploy.

See "Setting up Permissions" Part in installation documentation

I prefer method like

$ 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
0
votes

Your system probably doesn't support chmod +a. Try using:

set :permission_method, :chmod_alt