Avatar ·

Как правильно настроить права доступа к файлам и папкам в Laravel?

Всем привет! Я новичок в Laravel и PHP, и у меня возникла проблема с правами доступа к файлам. Развернул проект на локальном сервере (OpenServer с Apache и PHP 8.1). Всё установил, сайт открывается, но когда пытаюсь загрузить изображение через форму или выполнить artisan команду типа `php artisan cache:clear`, появляются ошибки: - "The stream or file "/var/www/project/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied" - "file_put_contents(/var/www/project/storage/framework/cache/data/...): failed to open stream: Permission denied" Я уже пробовал ставить `chmod 777` на папки `storage` и `bootstrap/cache`, но это не помогло — ошибки всё равно появляются. На продакшене на хостинге тоже такая же история. Понимаю, что 777 — это плохая практика, но что тогда делать? Вот структура моего проекта (Laravel 11): ``` project/ ├── storage/ │ ├── app/ │ ├── framework/ │ │ ├── cache/ │ │ ├── sessions/ │ │ ├── views/ │ │ └── testing/ │ └── logs/ └── bootstrap/ └── cache/ ``` Подскажите, как правильно настроить права, чтобы и локально работало, и на сервере было безопасно? Заранее спасибо! <<>>

Правильная настройка прав доступа в 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), обычно достаточно:

  1. Установить владельца файлов — вашего FTP-пользователя.
  2. Установить права 755 на папки и 644 на файлы.
  3. Папки storage и bootstrap/cache — 775.

Многие хостинги автоматически дают права группе apache или nobody, поэтому дополнительных действий не требуется.

Проверка текущих прав

getfacl storage/  # показывает ACL для папки
ls -la storage/   # показывает стандартные права

ACL предпочтительнее для продакшена, так как не меняет владельца файлов и позволяет гибко управлять доступом для нескольких пользователей (например, для CI/CD системы).