Перейти к содержанию

Инфраструктура и деплой

Без секретов

В этой документации намеренно нет паролей, ключей и токенов. Боевые учётные данные хранятся в .env на сервере и в защищённых файлах /root/.*_pw. За доступом — к администратору проекта.

Сервер

Параметр Значение
ОС Ubuntu 24.04 LTS
Хост test142.ru (РФ-хостинг, ISPmanager)
Веб-стек nginx (фронт) → Apache 2.4 + PHP-FPM (бэк)
PHP 8.3 (+ bcmath, intl, redis, sqlite3)
Node 20.x / npm 10.x
БД MySQL 8.0 (taomaster)
Кэш/очереди Redis
Демоны Supervisor (Horizon, Reverb)

Размещение кода («код вне вебрута»)

Что Путь
Код приложения /var/www/www-root/data/taomaster/
Вебрут основного сайта /var/www/www-root/data/www/test142.ru/
Вебрут документации /var/www/www-root/data/www/docs.test142.ru/
Логи /var/www/httpd-logs/
SSL-сертификаты /var/www/httpd-cert/www-root/

Вебрут содержит контент public/ + кастомный index.php, который грузит автозагрузчик и bootstrap/app.php из каталога кода и вызывает $app->usePublicPath(__DIR__). Vite собирает ассеты прямо в вебрут (build/).

Демоны (Supervisor)

Программа Назначение Порт
taomaster-horizon Воркеры очередей (Redis, queue=default)
taomaster-reverb WebSocket-сервер 8090 (8080 занят Apache)

WebSocket-проксирование nginx: location /app127.0.0.1:8090Upgrade-заголовками). Конфиг лежит в /etc/nginx/users-resources/www-root/ — он переживает регенерацию ISPmanager и включается во все server-блоки www-root.

Планировщик (cron)

/etc/cron.d/taomaster-schedulerschedule:run каждую минуту. Расписание (routes/console.php):

Команда Периодичность Назначение
rates:fetch-cbr ежечасно Курс ЦБ РФ (CNY и USD)
bestchange:fetch каждые 15 мин Курсы обменников bestchange
crm:renew-tariffs ежедневно 03:00 Авто-продление СРМ-тарифов
shipments:auto-accept ежедневно 03:30 Авто-приёмка отгрузок старше 30 дней

Деплой-процесс

PHP локально (на машине разработки, Windows) нет. Канонический код — на сервере.

flowchart LR
    A[Правка локально] -->|scp| B[Сервер: код]
    B --> C[chown -R 1010:1010]
    C --> D[artisan / npm на сервере]
    D --> E[optimize:clear → правки → optimize]
  1. Файлы пишутся локально (зеркало структуры Laravel), затем scp на сервер.
  2. На сервере: chown -R 1010:1010 на файлы.
  3. Артефакты (make:*, filament:install, миграции) генерируются/прогоняются на сервере.
  4. Сборка фронта от пользователя www-root (с заданными HOME/npm_config_cache/XDG_*).

Операционные грабли

  • HOME=/var/www/www-root принадлежит root — для npm/composer нужны заранее созданные (1010:1010) подпапки .npm, .config, .cache, и запуск с экспортом соответствующих переменных.
  • Прод-кэш. После любых правок кода/.env: php artisan optimize:clear && php artisan optimize. Horizon после изменений: supervisorctl restart taomaster-horizon.
  • Тесты только при очищенном кэше — иначе закэшированный mysql-конфиг ломает тестовое окружение. После тестов восстановить optimize + rates:fetch-cbr (кэш курсов стирается при cache:clear).
  • Filament-ассеты после обновления Filament: php artisan filament:assets + копирование в вебрут (css/, js/), иначе админка без стилей.
  • opcache-лаг. После деплоя .php подхватывается через revalidate_freq (секунды–минута); reload php-fpm на shared-хосте запрещён — просто подождать.
  • SSH иногда троттлится при частых подключениях (fail2ban/MaxStartups) — делать паузы.

Окружение (.env, без значений)

APP_ENV=production, APP_DEBUG=false, APP_URL=https://test142.ru, SESSION_DOMAIN=.test142.ru, SESSION_SECURE_COOKIE=true. БД → taomaster, cache=redis, queue=redis, session=database. Reverb на порту 8090. Секреты ботов (Telegram/MAX), прокси Telegram, ключи bestchange и Google Translate — в .env.

Поддомен документации (docs.test142.ru)

  • Отдельный nginx-vhost, docroot /var/www/www-root/data/www/docs.test142.ru/, SSL Let's Encrypt.
  • Это статический сайт (сборка MkDocs) — PHP не задействован.
  • Исходники и сборка MkDocs: каталог taomaster-docs рядом с кодом приложения; собирается в docroot командой mkdocs build.
  • Доступ закрыт HTTP Basic Auth на уровне nginx (docs-only, не затрагивает основной сайт).

Маркетинговый лендинг (demo.test142.ru)

  • Отдельный статический nginx-vhost, docroot /var/www/www-root/data/www/demo.test142.ru/, один index.html.
  • Публичный (без auth), HTTP → 301 → HTTPS.
  • SSL — wildcard-сертификат *.test142.ru (тот же, что у docs; отдельный LE-сертификат не выпускался).
  • Точное имя demo.test142.ru в server_name побеждает wildcard главного приложения (*.test142.ru).

Поддомены проекта

test142.ru (+ *.test142.ru поддомены посредников) → Laravel-приложение; docs.test142.ru → документация (MkDocs, Basic Auth); demo.test142.ru → маркетинговый лендинг. Поддомены docs/demo — отдельные статические vhost'ы с точным server_name.