Ошибки «Не удалось создать каталог», «Невозможно записать файл на диск» или просьба WordPress ввести данные FTP при обновлении плагина почти всегда означают, что сбились права на файлы. Обычно это случается после загрузки файлов по SFTP от root, распаковки архива или ручного копирования.
Как устроены права в WordOps
В WordOps сайт лежит в /var/www/example.ru/htdocs, а PHP-FPM и Nginx работают от пользователя www-data. Значит, этот пользователь должен быть владельцем файлов сайта. Правильные режимы:
- 755 для каталогов: владелец может всё, остальные читать и заходить;
- 644 для файлов: владелец читает и пишет, остальные только читают;
- 600 или 640 для wp-config.php: файл с паролями от базы не должен читать кто попало.
Подробнее о числовых правах рассказано в статье о chmod.
Восстанавливаем
cd /var/www/example.ru
sudo chown -R www-data:www-data htdocs
sudo find htdocs -type d -exec chmod 755 {} +
sudo find htdocs -type f -exec chmod 644 {} +
В WordOps файл wp-config.php лежит уровнем выше htdocs. Защитим его отдельно:
sudo chown www-data:www-data wp-config.php sudo chmod 640 wp-config.php
Вариант {} + передаёт файлы пачками и работает заметно быстрее, чем {} \; на больших сайтах.
Проверяем
sudo -u www-data touch htdocs/wp-content/uploads/test && sudo rm htdocs/wp-content/uploads/test
Если команда прошла без ошибок, WordPress может писать в каталог загрузок. Затем попробуйте загрузить картинку и обновить плагин из админки.
Чтобы не повторялось
- Загружайте файлы по SFTP не от root, а от пользователя из группы
www-data, или меняйте владельца после загрузки. - Не ставьте 777: это даёт право записи всем и упрощает жизнь вредоносным скриптам.
- Если на сервере включён SELinux (на RHEL-подобных системах), кроме прав нужны правильные контексты, об этом статья о SELinux для WordPress.
Тот же подход работает и для Laravel-проектов на WordOps, которые я разбирал в статье о Laravel на WordOps.