FastPanel, Nginx и PHP 8.4
Для чего нужен раздел
Этот раздел предназначен для технических специалистов, которые настраивают сервер под iEXExchanger. Он нужен для вопросов про FastPanel, Nginx, PHP 8.4, базу данных, Redis, права файлов, SSL, сборку frontend, фоновые процессы и первичную проверку окружения.
Это не инструкция для конечного клиента. Если вопрос задает владелец обменника без технического опыта, AI должен объяснить общий смысл и рекомендовать передать этот раздел серверному специалисту.
Что должно быть на сервере
Linux-сервер
Основная среда работы проекта
Сервер отдельный, без случайных сайтов и лишних сервисов
Nginx
Принимает HTTP/HTTPS-запросы и отдает публичный сайт
Домен смотрит в правильный server block, SSL работает
PHP-FPM 8.4
Выполняет backend iEXExchanger
Версия PHP соответствует требованиям проекта
Composer
Устанавливает PHP-зависимости
Работает под нужным пользователем проекта
Node.js и npm
Собирают frontend-ассеты через Vite
Версия совместима с package-lock и сборкой проекта
MySQL или MariaDB
Хранит заявки, пользователей, настройки, курсы, логи
База закрыта наружу, есть пользователь с нужными правами
Redis
Очереди, Horizon, кеш, realtime/presence и быстрые фоновые данные
Redis запущен и не открыт публично без защиты
Supervisor или systemd
Держит Horizon/queue-процессы постоянно запущенными
После перезагрузки процессы стартуют сами
Cron
Запускает Laravel scheduler каждую минуту
schedule:run выполняется под пользователем проекта
SSL
Защищает сайт и админку
Сертификат действителен, редирект на HTTPS включен
Backup
Восстановление после ошибки или обновления
Есть копии файлов и базы, проверено восстановление
Базовая схема работы
FastPanel: что важно настроить
Сайт/домен
Создать сайт на нужном домене
Nginx должен вести на проект, а не на пустую страницу панели
Корневая папка
Указать корнем сайта папку public проекта
Laravel нельзя открывать из корня проекта
PHP-версия
Выбрать PHP-FPM 8.4
Проект требует PHP ^8.4
SSL
Выпустить и включить сертификат
Без HTTPS нельзя запускать обменник публично
Ограничение панели
Защитить вход в FastPanel паролем, 2FA и IP, если возможно
Панель дает доступ к файлам, базе и настройкам
База данных
Создать отдельную базу и пользователя
Не использовать root-пользователя для приложения
Redis
Убедиться, что Redis установлен и доступен локально
Очереди и Horizon рассчитаны на Redis
Cron
Добавить Laravel scheduler
Без cron не будут стабильно обновляться курсы и фоновые задачи
Процессы
Настроить Horizon/queue через Supervisor или systemd
Без воркеров письма, уведомления и часть задач зависают
Backup
Настроить резервные копии базы и файлов
Обязательно перед обновлениями и крупными изменениями
FastPanel CRON: точная команда scheduler
В FastPanel для Laravel scheduler добавляется одна cron-команда, которая запускается каждую минуту:
Где /var/www/fastpanel_user/data/www/example.com - полный путь к backend-проекту в FastPanel. Путь должен вести к папке, где лежит файл artisan, а не к папке public.
Важно:
Между /opt/php84/bin/php и путем к проекту обязательно должен быть пробел
Без пробела cron получит неправильную команду
Путь к проекту должен быть полным и точным, как в FastPanel
Относительный путь или путь к другому сайту не запустит scheduler
Используется именно /opt/php84/bin/php
Это PHP 8.4 FastPanel, а не системный /usr/bin/php
В конце пути должен быть /artisan schedule:run
Scheduler запускается через artisan backend-проекта
Не добавляйте несколько одинаковых cron
Дубли могут запускать фоновые задачи параллельно
Не используйте такой вариант как основной для FastPanel:
Он может сработать на ручном сервере, но в FastPanel есть риск, что php возьмется из /usr/bin/php или другой версии. Для этой установки нужен явный PHP 8.4: /opt/php84/bin/php.
Nginx: базовая backend-логика server block
В Nginx корнем должен быть public каталог проекта. Все запросы, которые не являются существующими файлами, должны попадать в index.php.
Примерная схема:
Значения домена, пути и сокета PHP-FPM должны соответствовать реальному серверу. В FastPanel часть этих директив может генерироваться автоматически, а дополнительные правила добавляются через настройки сайта.
Что обязательно закрыть в Nginx
Доступ к .env
Там находятся секреты проекта
Доступ к корню проекта выше public
Клиенту нужны только публичные файлы
Доступ к служебным dotfiles
Это системные файлы
Публичный доступ к базе и Redis
Это риск взлома и потери данных
Слишком маленький client_max_body_size
Загрузки документов, логотипов или файлов могут падать с 413
PHP 8.4 и расширения
PHP-FPM 8.4 выбран для сайта
Проект требует PHP ^8.4
CLI PHP тоже 8.4
Команды artisan, cron и composer должны работать той же версией
Расширения для базы, Redis, XML, mbstring, curl, zip, intl, gd/imagick
Нужны для Laravel, HTTP-запросов, файлов, изображений, локалей и экспорта
memory_limit достаточно для сборок и задач
Низкий лимит может ломать тяжелые команды
upload_max_filesize и post_max_size подходят для документов и изображений
Иначе загрузки будут падать до Laravel
max_execution_time не слишком мал
Долгие операции обновления или импорта могут обрываться
База данных
Отдельная база
Для каждого проекта отдельная база
Отдельный пользователь
Не использовать root в .env приложения
Доступ только локально или из доверенной сети
Не открывать базу в интернет
Кодировка utf8mb4
Нужна для разных языков и символов
Регулярный backup
Бэкап базы важнее всего, потому что там заявки и настройки
Проверка восстановления
Backup без теста восстановления не считается надежным
Redis, очереди и Horizon
Проект использует Laravel Horizon и Redis. В Horizon настроены очереди mail-high, high, default, media, mail-low, low, order-recount-scan, order-recount, presence и отдельная очередь analytics.
Horizon или queue worker
Выполняет фоновые задания
Письма, уведомления, медиа, аналитика и часть операций будут задерживаться
Redis
Хранит очереди и быстрые данные
Horizon и многие фоновые задачи не смогут работать нормально
Scheduler
Ставит задачи по расписанию
Курсы, выплаты, очистки, мониторинг и архивы перестанут обновляться
Для production обычно настраивают отдельный процесс:
Этот процесс не должен запускаться вручную в открытой SSH-сессии как единственный способ работы. Его должен держать Supervisor или systemd.
Nginx для Angular SSR frontend и backend API
Если используется отдельный Angular SSR frontend-домен и отдельный backend/admin-домен, схема отличается от обычного Laravel-only сайта:
Ключевые правила:
Angular SSR upstream
127.0.0.1:4000 или другой фактический порт SSR
Node/SSR не должен торчать наружу без нужды
Browser API path
/backend-api/* на основном frontend-домене
Браузер ходит same-origin, без CORS-проблем
Backend upstream
backend-домен или origin IP с правильным Host/SNI
Laravel должен понимать, что запрос пришел на backend
Старый /apis
Только временный compatibility alias
Новая схема должна идти через /backend-api
Backend static
/images, /storage, /static, /dist, /exports через alias на backend public
Иконки, темы, файлы и экспорты должны открываться с frontend-домена
/ng-custom/
Отдельный location с Cache-Control: no-store
Клиентские вставки должны обновляться без долгого кеша
client_max_body_size
Обычно не меньше 64m
Документы, логотипы и файлы не должны падать с 413
Для production .env Angular SSR обычно важно:
API_URL в root .env SSR должен указывать на backend-origin, например https://app.example.com. Не ставьте туда /backend-api: это browser/edge путь, а не backend-origin для серверного рендера.
Проверки после настройки:
Ожидаемо: /backend-api/... отвечает backend-ответом, а не HTML от Angular; в браузере нет запросов напрямую на https://app.example.com/client-api/...; статические файлы не получают лишний Set-Cookie.
Cron для Laravel scheduler
На сервере должен быть cron под пользователем проекта. Для FastPanel используйте явный PHP 8.4:
Важно:
Команда запускается каждую минуту
Laravel сам решает, какие задачи пора выполнять
Запуск под пользователем проекта
Чтобы были правильные права на storage, cache и логи
Используется /opt/php84/bin/php
Это PHP 8.4 FastPanel, а не случайный системный PHP
Между PHP и путем есть пробел
Иначе команда будет неверной
Путь полный и точный
Cron не знает текущую папку проекта
Нет дублей cron
Дубли могут запускать задачи параллельно
Какие фоновые задачи есть в проекте
Scheduler проекта запускает не только курсы. В него входят:
Курсы
Основные курсы, BestChange, файловые курсы, история и свечи курсов
Заявки
Пересчет заявок, автоархив, неоплаченные заявки, экспорт заявок
Платежи
Webhook мерчантов, очередь автовыплат, запуск автовыплат, ожидающие выплаты
Резервы
Обновление резервов из файла, дневная витрина резервов
Уведомления и мониторинг
Telegram-статистика, monitoring hourly/daily, диагностика логов
Аналитика
Пересчет аналитики, daily rollups, health-проверки
Очистки
Логи, временные экспорты, media trash, старые presence-события
Безопасность
Синхронизация банов, истечение ролей, trusted proxies reload
Если пользователь говорит "не запускается процесс", AI должен уточнить, какой именно процесс: курсы, очередь, выплаты, уведомления, архив, аналитика или очистка.
Права файлов
storage
Запись для PHP-FPM и CLI-пользователя
bootstrap/cache
Запись для кеша Laravel
public
Чтение Nginx, запись только там, где проект сохраняет публичные файлы
Загруженные файлы
Нельзя делать доступ шире, чем нужно
Если сайт открывается, но загрузки, кеш или логи не работают, часто причина в правах пользователя PHP-FPM, CLI и Nginx.
Сборка frontend
Проект использует Vue 3 и Vite. После установки зависимостей frontend нужно собрать production-ассеты:
Если после обновления админка показывает пустой экран, не загружаются стили или кнопки не работают, технический специалист должен проверить, что frontend собран, файлы доступны из public/build, а кеш браузера и Laravel очищены по регламенту.
Команды первичной проверки
Эти команды должен выполнять специалист на сервере. Не просите обычного клиента присылать вывод с секретами.
Дополнительно проверяют:
Названия сервисов могут отличаться на конкретном сервере или в FastPanel.
Проверка после установки
Домен открывается по HTTPS
Нет предупреждения браузера
Админка открывается
Владелец может войти
storage и кеш доступны
Нет ошибок записи
Миграции применены
База в актуальном состоянии
Scheduler работает
В админке и логах видны свежие фоновые запуски
Horizon/queue работает
Очереди не растут бесконечно
Email-тест проходит
Письма уходят
Telegram-тест проходит
Канал или бот получает сообщение
Тестовая заявка создается
Оператор видит заявку в админке
Типовые ошибки сервера
403 Forbidden
Неверный root, права файлов, запрет Nginx
Root должен быть public, права чтения корректные
404 на всех страницах
Неверный try_files или server block
Запросы должны попадать в index.php
500 ошибка
PHP/Laravel ошибка, .env, права, кеш
Лог Laravel и PHP-FPM без публикации секретов
502 Bad Gateway
PHP-FPM не запущен или неверный socket
Статус php-fpm и fastcgi_pass
413 Request Entity Too Large
Малый client_max_body_size
Увеличить лимит загрузки в Nginx
Письма не уходят
Очередь, SMTP/Resend, DNS почты
Email-настройки, очередь, журнал
Курсы не обновляются
Нет cron, очередь остановлена, источник недоступен
Scheduler, настройки CRON, журнал курсов
Автовыплаты зависли
Очередь или провайдер
Horizon, платежные журналы, статус заявки
Админка белая после обновления
Не собран frontend или старый кеш
npm run laravel-build, кеш, публичные ассеты
Что AI должен говорить клиенту
"Как настроить Nginx?"
"Для backend корень сайта должен вести в public, PHP должен идти через PHP-FPM 8.4, а Laravel fallback попадать в index.php. Для Angular SSR frontend-домена отдельно настраивается proxy на 127.0.0.1:4000 и /backend-api в backend-домен."
"Что нужно для FastPanel?"
"Нужно создать сайт, выбрать PHP-FPM 8.4, настроить SSL, базу, Redis, cron, Horizon/queue и backup. Панель обязательно защитить паролем, IP-ограничением и временными доступами."
"Какой cron добавить в FastPanel?"
"Добавьте каждую минуту: /opt/php84/bin/php полный_путь_к_проекту/artisan schedule:run >/dev/null 2>&1. Между /opt/php84/bin/php и путем обязательно пробел, путь полный как в FastPanel, /usr/bin/php не использовать."
"Почему процессы не запускаются?"
"Проверьте cron /opt/php84/bin/php полный_путь/artisan schedule:run, Horizon/queue, Redis и логи. Если в админке всё включено, но запусков нет, проблема на серверной стороне."
"Можно ли просто загрузить файлы и открыть сайт?"
"Нет. Кроме файлов нужны база, .env, миграции, PHP-FPM, Nginx, Redis, cron, queue/Horizon, сборка frontend и проверка тестовой заявки."
Связанные разделы
Последнее обновление
Это было полезно?