Инфраструктура и деплой¶
Без секретов
В этой документации намеренно нет паролей, ключей и токенов. Боевые учётные данные хранятся в .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 /app → 127.0.0.1:8090 (с Upgrade-заголовками). Конфиг лежит в /etc/nginx/users-resources/www-root/ — он переживает регенерацию ISPmanager и включается во все server-блоки www-root.
Планировщик (cron)¶
/etc/cron.d/taomaster-scheduler → schedule: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]
- Файлы пишутся локально (зеркало структуры Laravel), затем scp на сервер.
- На сервере:
chown -R 1010:1010на файлы. - Артефакты (
make:*,filament:install, миграции) генерируются/прогоняются на сервере. - Сборка фронта от пользователя
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.