Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Рейтинг: 70.1% · 9 голосов
Курс по Laravel: маршруты, Eloquent, Blade, миграции, очереди и API. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
oleg_php
Сообщения: 25
Зарегистрирован: 14 май 2026, 08:06

Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Сообщение oleg_php »

АкадемияLaravel с нуляГлава 17 из 18
Оглавление курса (18)
  1. Знакомство с Laravel и установка окружения
  2. Маршруты и контроллеры
  3. Blade: шаблоны и вёрстка страниц
  4. Миграции и структура базы данных
  5. Eloquent ORM: модели и CRUD
  6. Связи в Eloquent: hasMany, belongsTo и другие
  7. Формы и валидация данных
  8. Аутентификация пользователей
  9. Middleware и защита маршрутов
  10. Очереди и фоновые задачи
  11. Отправка почты и уведомления
  12. Строим REST API на Laravel
  13. Авторизация: Gates и Policies
  14. Работа с файлами: загрузка, Storage, диски local и S3
  15. Тестирование: Pest и PHPUnit, фабрики, сидеры, RefreshDatabase
  16. Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
  17. Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia) (вы здесь)
  18. События и слушатели, кеширование, логирование
За шестнадцать глав мы собрали полноценное приложение: маршруты, Eloquent, очереди, тесты. Осталось последнее, вывезти его на боевой сервер и решить, чем рисовать интерфейс. Разберу классический деплой на VPS, он до сих пор закрывает большинство проектов, а потом коротко пройдемся по фронтенд-стеку 2026 года.

Подготовка сервера:

Берем VPS с Ubuntu 24.04 (хостер любой, от Selectel до Timeweb), ставим nginx, php8.4-fpm с расширениями (mbstring, pdo_mysql, intl, redis), MySQL или PostgreSQL и Redis под кеш и очереди. Именно 8.4: active support у PHP 8.3 закончился в декабре 2025, а Laravel 12 с 8.4 работает штатно, ставить на свежий сервер ветку, которая доживает на security-фиксах, смысла нет. Критично одно: корень сайта в nginx должен смотреть строго в каталог public, а не в корень проекта. Иначе .env и весь код доступны по прямому URL.

Код: Выделить всё

server {
    listen 80;
    server_name app.example.ru;
    root /var/www/app/public;
    index index.php;

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

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
listen 80 здесь только заготовка, прод в 2026 без HTTPS не живет. Сразу после первого поднятия сайта ставим certbot и получаем бесплатный сертификат Let's Encrypt:

Код: Выделить всё

apt install certbot python3-certbot-nginx
certbot --nginx -d app.example.ru
Certbot сам допишет в конфиг listen 443 ssl, пути к сертификату и редирект с 80 на 443, а продление повесит на systemd-таймер, руками ничего обновлять не придется.

Строка с $realpath_root вместо $document_root нужна при деплое через симлинки, без нее OPcache цепляется за старые пути. Раз уж зашла речь про OPcache: на проде стоит выставить opcache.validate_timestamps=0, тогда PHP перестает проверять файлы на изменения на каждый запрос, это заметный выигрыш. Цена: после каждого деплоя кеш надо сбрасывать самому, проще всего добавить systemctl reload php8.4-fpm в конец деплой-скрипта. Без такого сброса не включайте, иначе сервер продолжит исполнять старый код.

Шаги деплоя:

В .env на сервере выставляем APP_ENV=production и APP_DEBUG=false, генерируем APP_KEY один раз через php artisan key:generate и больше не трогаем (смена ключа сломает шифрованные данные и сессии). Сам деплой сводится к скрипту:

Код: Выделить всё

#!/usr/bin/env bash
set -e

cd /var/www/app
php artisan down
git pull origin main
composer install --no-dev --optimize-autoloader
npm ci && npm run build
php artisan migrate --force
php artisan storage:link
php artisan optimize
php artisan queue:restart
php artisan up
set -e в начале обязателен: без него упавший composer install или migrate не остановит скрипт, и php artisan up поднимет сломанный релиз. С set -e при ошибке сайт останется в режиме обслуживания, это неприятно, но честнее, чем 500 у всех пользователей на половине выкатанного кода.

Флаг --force у migrate тоже не для галочки. В production artisan как раз задает вопрос подтверждения перед миграцией, это защита от случайного запуска на боевой базе. В неинтерактивном скрипте отвечать на вопрос некому, и без флага миграция просто не выполнится. --force это подтверждение подавляет.

Команда optimize с Laravel 11 кеширует сразу конфиг, маршруты, события и шаблоны. После кеширования конфига функция env() работает только внутри файлов config/, в остальном коде она вернет null. Если у вас где-то env('SOMETHING') в контроллере, переносите значение в конфиг и читайте через config().

Последним шагом полезно дернуть health-check. С Laravel 11 маршрут /up регистрируется в bootstrap/app.php (параметр health у withRouting в свежем скелетоне включен по умолчанию) и отдает 200, если приложение поднялось. На него же удобно повесить внешний мониторинг или проверку балансировщика.

Очереди и планировщик:

queue:work должен жить под супервизором, иначе после первого падения воркера письма и джобы из главы 10 молча встанут. Планировщику хватает одной строки в cron.

Код: Выделить всё

; /etc/supervisor/conf.d/app-worker.conf
[program:app-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
numprocs=2
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log
stopwaitsecs=3600

# crontab -e под тем же пользователем
* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1
Два неочевидных места в конфиге. process_name с %(process_num) обязателен, когда numprocs больше единицы: без этой строки supervisord вообще откажется грузить секцию и выдаст ошибку, что process_num должен присутствовать в process_name. А redirect_stderr с stdout_logfile спасают от ситуации, когда воркеры падают молча и вы узнаете об этом по зависшей очереди: весь вывод вместе с трейсами пойдет в worker.log.

queue:restart в деплой-скрипте тоже не для красоты: воркер держит код в памяти, без рестарта он будет выполнять джобы старой версией приложения.

Весь этот блок (nginx, certbot, supervisor, cron) в 2026 необязательно собирать руками. Laravel Forge настраивает и обслуживает VPS у любого хостера кнопками, Envoyer поверх него дает zero-downtime деплой через симлинки, а Laravel Cloud (запустился в начале 2025) это полностью управляемая платформа от самой команды Laravel, где сервер вы не видите вообще. Для учебного и пет-проекта ручной VPS дешевле и полезнее для понимания, для коммерческой работы посчитайте стоимость своего времени.

Фронтенд: Vite, Livewire, Inertia:

Vite в Laravel отвечает за сборку ассетов. Локально npm run dev поднимает дев-сервер с горячей перезагрузкой, на проде npm run build собирает минифицированные файлы с хешами в именах и manifest.json. В шаблоне все подключается одной директивой:

Код: Выделить всё

<head>
    @vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
Дальше развилка. Livewire 4 (стабилен с 14 января 2026) позволяет писать реактивные интерфейсы на чистом PHP: дефолтный формат теперь single-file компоненты, PHP-логика и Blade-разметка живут в одном файле, а wire:model и wire:click сами гоняют состояние между браузером и сервером. Привычный по третьей версии формат, отдельный класс плюс Blade-шаблон, по-прежнему поддерживается, так что старые туториалы не бесполезны, но новый код пишут уже в single-file стиле. Из крупного в v4 еще islands: изолированные куски страницы, которые рендерятся и обновляются независимо, не перерисовывая весь компонент. Для команды без сильных JS-разработчиков это самый быстрый путь, мелкую интерактивность добирают Alpine.js. Inertia 3 (стабильная версия вышла 26 марта 2026) устроена иначе: маршруты и контроллеры остаются на Laravel, но страницы рендерятся компонентами Vue или React, причем без отдельного REST API. В третьей версии Inertia выкинула axios в пользу собственного XHR-клиента, добавила optimistic updates из коробки, а SSR в dev-режиме больше не требует отдельного Node-процесса. Стартер-киты laravel new включают оба варианта, выбирайте по составу команды, а не по моде. Отдельный SPA с API из главы 12 остается третьим путем, но для типичной админки или SaaS он избыточен.

Типичные грабли:

APP_DEBUG=true в проде, и страница ошибки показывает пользователям переменные окружения и куски кода. Забытый npm run build, и Vite кидает исключение про отсутствующий манифест. Права на запись: каталоги storage и bootstrap/cache должны принадлежать пользователю php-fpm, обычно www-data. Забытый storage:link, и загруженные файлы из главы 14 отдают 404. И если приложение живет за прокси или Cloudflare, настройте trustProxies в bootstrap/app.php, иначе Laravel будет генерировать http-ссылки вместо https.

Итог:

Деплой Laravel это не магия: правильный docroot, HTTPS через certbot, composer без dev-зависимостей, migrate --force, optimize, супервизор для очередей и cron для планировщика. На этом курс закончен. Дальше смотрите Laravel Octane для высоких нагрузок, Horizon для мониторинга очередей и Deployer для деплоя без даунтайма. База у вас уже есть.
👍1 ❤️2 🔥1 😄 🤔1
✔ Лучший ответ сформирован автоматически — kubefan
oleg_php писал(а):После кеширования конфига функция env() работает только внутри файлов config/, в остальном коде она вернет null. вот этим я убил часа три на проде. локально все работало, после config:cache бот в телеграм молча перестал слать уведомления, потому что env('TELEGRAM_TOKEN') висел прямо в джобе. перенес в config/services.php и ожило. жаль эта глава не вышла раньше хах
Перейти к ответу →
Аватара пользователя
kubefan
Сообщения: 1
Зарегистрирован: 12 май 2026, 08:01

Re: Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Сообщение kubefan »

✔ Лучший ответ — сформирован автоматически
oleg_php писал(а):После кеширования конфига функция env() работает только внутри файлов config/, в остальном коде она вернет null.
вот этим я убил часа три на проде. локально все работало, после config:cache бот в телеграм молча перестал слать уведомления, потому что env('TELEGRAM_TOKEN') висел прямо в джобе. перенес в config/services.php и ожило. жаль эта глава не вышла раньше хах
👍 ❤️1 🔥2 😄 🤔1
Аватара пользователя
zfswhale
Сообщения: 1
Зарегистрирован: 09 июн 2026, 13:05

Re: Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Сообщение zfswhale »

а зачем supervisor, когда есть systemd? юнит с Restart=always делает то же самое, и одной зависимостью на сервере меньше. supervisor тащат по привычке из гайдов десятилетней давности, имхо
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
eoffnet1
Сообщения: 1
Зарегистрирован: 27 май 2026, 21:01

Re: Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Сообщение eoffnet1 »

oleg_php писал(а):Для команды без сильных JS-разработчиков это самый быстрый путь
подтверждаю. переписал админку с самописного vue на livewire, кода стало раза в два меньше и наконец перестал держать в голове два стейта. но на публичных страницах с тяжелым интерфейсом все равно взял бы inertia, у livewire каждый чих это запрос на сервер, на плохом мобильном интернете заметно
👍 ❤️ 🔥1 😄 🤔
Аватара пользователя
rdery
Сообщения: 1
Зарегистрирован: 15 май 2026, 17:36

Re: Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)

Сообщение rdery »

прошел весь курс от установки до этой главы, спасибо. вопрос: на шаред-хостинге без ssh и supervisor это все вообще реально? у клиента самый дешевый тариф и переезжать он не хочет
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
Следующая глава →
События и слушатели, кеширование, логирование

Все главы курса «Laravel с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Laravel с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость