Deployment: настраиваем пользователей
Проблема
Под root-пользователем работать небезопасно, равно как и делать весь проект доступным www-data.
Кроме того, во многих веб-приложениях пользователи имеют возможность загружать свои файлы. И очень часто с такими файлами возникают конфликты, так как пишутся они под www-data:www-data, а деплоим под другим пользователем. Даже если деплоить под root, то скорее всего права на папку перепишутся и www-data потеряет доступ к нужным файлам.
Решение
Создать нового пользователя deploy с правами на коннект к серверу по ssh, доступом только к папке с проектом и возможностью изменять файлы в ./public/uploads и ./var.
Создаём на сервере пользователя deploy из-под root:
ssh root@вашсервер
useradd --create-home -s /bin/bash deploy
Настроим доступ по ssh через ключи
mkdir /home/deploy/.ssh
touch /home/deploy/.ssh/authorized_keys
Вставьте содержимое одного из публичного ключа своего локального пользователя в файл authorized_keys и сохраните. Вывести публичный ключ локально можно командой: cat ~/.ssh/id_rsa.pub (название ключа id_rsa.pub у вас может отличаться).
vim /home/deploy/.ssh/authorized_keys
Меняем права на более строгие
chown -R deploy:deploy /home/deploy
chmod 600 /home/deploy/.ssh/authorized_keys
Определим пользователя нашего веб-сервера (в примере ниже это www-data)
ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1
> www-data
Добавляем пользователя deploy в группу www-data (группа веб-сервера)
usermod -a -G www-data deploy
Выставляем права на папку проекта
chown -R deploy:deploy /var/www/project
chmod -R 0775 /var/www/project
Проверим, есть ли setfacl в системе setfacl -h и установим, если его нет. Команда для Ubuntu:
sudo apt-get install acl
Выдадим права на папки с кэшем, логами и загруженными пользовательскими файлами
sudo setfacl -dR -m u:www-data:rwX -m u:deploy:rwX /var/www/project/var /var/www/project/public/uploads
sudo setfacl -R -m u:www-data:rwX -m u:deploy:rwX /var/www/project/var /var/www/project/public/uploads
Готово.
Для самого деплоймента я обычно использую Deployer c параметром writable_mode=acl.