Вы должны изучить https://deployer.org для развертывания craftcms поверх git, вот как я это делаю, исправляет все проблемы с разрешениями. Конфигурация развертывания может выглядеть следующим образом:
<?php
namespace Deployer;
require 'recipe/common.php';
// Project name
set('application', 'my_project');
// Project repository
set('repository', 'git@gitlab.com/website.git');
// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true);
// Shared files/dirs between deploys
set('shared_files', ['.env','config/license.key']);
set('shared_dirs', ['web/uploads', 'storage/logs', 'storage/backups']);
// Writable dirs by web server
set('writable_dirs', ['web/uploads', 'storage/runtime', 'storage/logs', 'storage/backups', 'storage/runtime', 'web/cpresources']);
set('allow_anonymous_stats', false);
// releases
set('keep_releases', 3);
// Hosts
host('staging')
->hostname('example.com')
->port(22)
->user('root')
->set('deploy_path', '/var/www/staging');
host('production')
->hostname('example.com')
->port(22)
->user('root')
->set('deploy_path', '/var/www/html');
// Tasks
desc('Deploy your project');
task('deploy', [
'deploy:info',
'deploy:prepare',
'deploy:lock',
'deploy:release',
'deploy:update_code',
'deploy:shared',
'deploy:writable',
'deploy:vendors',
'deploy:clear_paths',
'deploy:symlink',
'deploy:unlock',
'cleanup',
'success'
]);
after('deploy:failed', 'deploy:unlock');