Как правильно настроить права доступа к файлам и папкам в Laravel?
Правильная настройка прав доступа в Laravel: пошаговое руководство
Проблема с правами доступа — одна из самых частых у начинающих Laravel-разработчиков. Давайте разберемся, как её решить раз и навсегда, без использования опасного chmod 777.
Почему возникает ошибка?
Веб-сервер (Apache/Nginx) и пользователь, который запускает PHP (обычно www-data на Linux или nobody на некоторых хостингах), должны иметь право писать в папки storage и bootstrap/cache. Если владелец файлов — ваш системный пользователь, а сервер работает от другого пользователя — возникает ошибка.
Решение: правильный владелец и права
Шаг 1. Определите пользователя веб-сервера
Выполните в терминале:
ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | awk '{print $1}'
Обычно это www-data (Debian/Ubuntu) или apache (CentOS/RHEL).
Шаг 2. Установите правильного владельца
Зайдите в корневую папку проекта и выполните:
sudo chown -R $USER:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
Где $USER — ваш системный пользователь, а www-data — пользователь веб-сервера. Мы даём полный доступ владельцу и группе, а остальным — только чтение и выполнение.
Шаг 3. Настройка umask (рекомендуется для продакшена)
В файле bootstrap/app.php (Laravel 11) или в AppServiceProvider.php добавьте:
// bootstrap/app.php (Laravel 11)
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
// ...
)
->withMiddleware(function (Middleware $middleware) {
// Устанавливаем umask для создания файлов с правильными правами
umask(0002);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Шаг 4. Для локальной разработки (если используете artisan serve)
Если вы запускаете php artisan serve, то PHP работает от вашего имени, и права должны быть:
chmod -R 755 storage bootstrap/cache
chown -R $USER:$USER storage bootstrap/cache
Шаг 5. Автоматизация через скрипт
Создайте в корне проекта файл fix-permissions.sh:
#!/bin/bash
# Определяем пользователя веб-сервера
HTTPDUSER=$(ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | awk '{print $1}')
# Устанавливаем права
sudo chown -R $(whoami):$HTTPDUSER storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
sudo chmod -R 775 public/uploads # если есть папка для загрузок
echo "Права доступа установлены!"
Сделайте его исполняемым: chmod +x fix-permissions.sh. Теперь одним запуском решаете проблему.
Проверка
После всех настроек проверьте:
touch storage/test.txt && rm storage/test.txt
php artisan cache:clear
php artisan config:clear
php artisan view:clear
Важные замечания
- Никогда не используйте chmod 777 — это дыра в безопасности. Максимум 775 для папок и 664 для файлов.
- На продакшене рекомендуется установить ACL (Access Control Lists) для более тонкой настройки. Пример:
setfacl -d -m g:www-data:rwx storage. - Если используете Git, добавьте
storage/*иbootstrap/cache/*в.gitignore, чтобы не коммитить временные файлы.
Почему это работает?
Пользователь веб-сервера (www-data) входит в группу вашего проекта. Права 775 означают: владелец (вы) — всё можно, группа (www-data) — всё можно, остальные — только читать и выполнять. Так безопасно и функционально.
Альтернативный подход: использование ACL и настройка через хостинг
Если вы на хостинге, где нет доступа к sudo, или хотите более гибкое управление, используйте ACL (Access Control Lists).
Установка ACL на сервере
sudo apt install acl # Debian/Ubuntu
sudo yum install acl # CentOS/RHEL
Настройка прав для папок storage и bootstrap/cache
# Даём пользователю www-data полный доступ к storage
sudo setfacl -R -m u:www-data:rwx storage bootstrap/cache
# Делаем так, чтобы новые файлы наследовали права
sudo setfacl -d -m u:www-data:rwx storage bootstrap/cache
# Даём права вашему пользователю (если нужно)
sudo setfacl -R -m u:$USER:rwx storage bootstrap/cache
Для хостинга (без shell-доступа)
Если у вас обычный shared-хостинг с панелью управления (cPanel, ISPmanager), обычно достаточно:
- Установить владельца файлов — вашего FTP-пользователя.
- Установить права 755 на папки и 644 на файлы.
- Папки
storageиbootstrap/cache— 775.
Многие хостинги автоматически дают права группе apache или nobody, поэтому дополнительных действий не требуется.
Проверка текущих прав
getfacl storage/ # показывает ACL для папки
ls -la storage/ # показывает стандартные права
ACL предпочтительнее для продакшена, так как не меняет владельца файлов и позволяет гибко управлять доступом для нескольких пользователей (например, для CI/CD системы).