Capistrano 3 permissions not set on correctly on cache and releases

早过忘川 提交于 2020-01-07 05:21:12

问题


I am deploying a Symfony2 web application onto Ubuntu 14.04 using Capistrano 3 with symfony gem. Permissions are not set correctly on the cache folder: Because I am using the symfony gem the permissions should get set on the cache folder and indeed I do see this in the output during deploy which is successful:

cd /var/www/releases/20151015083314 && ( SYMFONY_ENV=prod /usr/bin/env mkdir -pv app/cache 

However when I preview my web app i get the following error in my logs

PHP Warning:  mkdir(): Permission denied in /var/www/releases/20151015082855/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpCache/Store.php on line 40

PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Unable to create the cache directory (/var/www/releases/20151015082855/app/cache/staging)\n'

I also got permissions errors when removing the releases folder but this seems to have gone away now after I manually removed the oldest folder.

I am deploying with user 'ubuntu'. I have also tried to follow the permissions guide here using the second method of ACL. I set the permissions on the cache folder in /current and on the logs folder in /shared.

My capistrano scripts have the following:

# deploy.rb

set :pty, true

set :ssh_options, {
  user: 'ubuntu',
  keys: ['~/.ssh/id_rsa'],
  forward_agent: true,
  auth_methods: ["publickey"]
}

set :linked_files, fetch(:linked_files, []).push('app/config/parameters.yml', 'web/.htaccess', 'web/robots.txt')
set :linked_dirs, fetch(:linked_dirs, []).push('app/logs', 'src/Helios/CoreBundle/Resources/translations', 'app/spool')

# staging.rb

server 'ec2-00-000-000-000.eu-west-1.compute.amazonaws.com', user: 'ubuntu', roles: %w{app db web}

I am deploying with

bundle exec cap staging deploy --trace

Thanks

UPDATE

what is strange is why does the symfony2 app try and create the cache folder within /releases rather than within /current ?

I also followed this guide which worked if I set the permissions after deploy, but then I got the same cache error after a fresh deploy.

UPDATE

I have checked again on my server and it it is running as www-data. I did the following

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

echo $APACHE_USER

When I deploy with capistrano it is unable to remove the old releases folder. I get multiple lines for each file it can't remove:

rm: cannot remove ‘20151029153350/app/cache/staging/.....’: Permission denied

The user capistrano is deploying as is 'ubuntu' which is in the 'www-data' group. I have checked the permissions of the releases/20151029153350 directory and it is:

drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 30 10:13 20151029153350

回答1:


I'd suggest that you add to your linked_dirs an entry for app/cache and then create shared/app/cache and set its permissions to be accessible by the web server user. This way permissions are retained across deployments.

Alternately, you could use this plugin to set permissions on the deployed code.

Since /current is a symlink to /releases/[release_timestamp], some code will resolve the symlink and access it directly.



来源:https://stackoverflow.com/questions/33163809/capistrano-3-permissions-not-set-on-correctly-on-cache-and-releases

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!