For the complete documentation index, see llms.txt. This page is also available as Markdown.

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 и проверка тестовой заявки."

Связанные разделы

Последнее обновление

Это было полезно?