Урок 19: Деплоймент в Laravel. VPS, Nginx, SSL, Sentry, Supervisor

В 19-ом уроке переходим к этапам разработки, это деплойменту приложения. Если до этого мы работали в локальной среде, то теперь научимся переносить проект на реальный сервер, оптимизировать его для продакшена и настраивать мониторинг. Готовьтесь к практике, будем работать с VPS, Nginx, SSL и инструментами для отслеживания ошибок.

Подготовка проекта к продакшену

Перед деплоем важно убедиться, что приложение готово к работе в production-режиме.

1. Установка зависимостей без dev-пакетов

В продакшене нам не нужны пакеты для разработки (например, barryvdh/laravel-debugbar).
Запустите команду:

bash
composer install --optimize-autoloader --no-dev

Флаг --no-dev удалит dev-зависимости, а --optimize-autoloader ускорит загрузку классов.

2. Настройка .env

Обновите файл .env:

env
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:... # Если ключа нет, выполните php artisan key:generate

Никогда не оставляйте APP_DEBUG=true на продакшене! Это угроза безопасности.

3. Права на файлы и папки

Laravel требует доступ на запись в storage и bootstrap/cache:

bash
chmod -R 775 storage
chmod -R 775 bootstrap/cache

Оптимизация кода

Laravel предлагает встроенные инструменты для ускорения работы приложения.

1. Кэширование конфигурации

Соберите все конфиги в один файл:

bash
php artisan config:cache

После этого изменения в файлах конфигурации (config/*.php) не будут применяться без повторного кэширования.

2. Кэширование маршрутов

Если в ваших роутах не используются замыкания (closures), выполните:

bash
php artisan route:cache

Совет: Используйте контроллеры вместо замыканий в web.php/api.php, чтобы избежать ошибок.

3. Оптимизация автозагрузки

bash
composer dump-autoload -o

Деплой на VPS: Nginx, SSL, Supervisor

Теперь развернем приложение на VPS (Ubuntu 22.04).

1. Настройка сервера

  • Обновите пакеты:
    bash
    sudo apt update && sudo apt upgrade -y
  • Установите PHP, Nginx, MySQL:
    bash
    sudo apt install nginx mysql-server php8.1-fpm php8.1-mysql php8.1-mbstring

2. Развертывание проекта

  • Склонируйте репозиторий в /var/www/laravel:
    bash
    sudo git clone https://github.com/ваш-репозиторий.git /var/www/laravel
  • Установите права:
    bash
    sudo chown -R www-data:www-data /var/www/laravel
    sudo chmod -R 775 /var/www/laravel/storage

3. Конфиг Nginx

Создайте файл /etc/nginx/sites-available/laravel:

nginx
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/laravel/public;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }
}

Активируйте конфиг:

bash
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo systemctl reload nginx

4. SSL через Let’s Encrypt

Установите Certbot:

bash
sudo apt install certbot python3-certbot-nginx

Получите сертификат:

bash
sudo certbot --nginx -d your-domain.com

5. Настройка Supervisor для очередей

Создайте файл /etc/supervisor/conf.d/laravel-worker.conf:

ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel/storage/logs/worker.log

Обновите Supervisor:

bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Мониторинг ошибок

Даже на продакшене могут возникать ошибки. Научимся их отслеживать.

1. Sentry

Установите пакет:

bash
composer require sentry/sentry-laravel

Добавьте в .env:

env
SENTRY_LARAVEL_DSN=https://ваш-ключ@sentry.io/ваш-проект

Sentry будет автоматически перехватывать исключения и отправлять уведомления.

2. Laravel Telescope

Telescope отличный инструмент для отладки, но на продакшене его доступ нужно ограничить.
Установите пакет:

bash
composer require laravel/telescope

Запустите установку:

bash
php artisan telescope:install
php artisan migrate

В файле config/telescope.php ограничьте доступ:

php
'gate' => [
    'enabled' => env('APP_ENV') === 'production',
    'email' => 'ваш-email@example.com', // Только вы сможете зайти в Telescope
],

Практические задачи

  1. Оптимизация проекта
    • Запустите config:cache и route:cache. Проверьте, как изменилась скорость загрузки страниц.
  2. Деплой на тестовый VPS
    • Создайте сервер на DigitalOcean/Vultr.
    • Разверните проект, используя инструкции выше.
  3. Интеграция Sentry
    • Зарегистрируйтесь на sentry.io.
    • Добавьте DSN в проект и спровоцируйте ошибку (например, вызов несуществующего метода). Убедитесь, что ошибка появилась в Sentry.
  4. Настройка Supervisor
    • Создайте задачу в очереди (например, отправку письма).
    • Убедитесь, что Supervisor обрабатывает ее.

Итоги 19-го урока

Мы прошли весь путь от подготовки проекта до его запуска на реальном сервере.
Теперь вы умеете:

  • Оптимизировать Laravel-приложение.
  • Работать с Nginx и SSL.
  • Настраивать мониторинг ошибок.

Не останавливайтесь, впереди финальный урок. Полный курс с уроками для начинающих