В Dockerfile этап сборки ассетов (node:22-alpine) копировал
vite.config.js, но не postcss.config.js и tailwind.config.js — без них
PostCSS внутри контейнера вообще не запускался, и Vite отдавал
собранный CSS как сырой непроцессенный исходник ("@tailwind base;
@tailwind components; @tailwind utilities;", 57 байт вместо ~30-50 КБ).
Все страницы рендерились полностью без стилей — баг был с самого
Stage 2 (Blade+Alpine), просто не всплывал при проверках через
get_page_text, а не через реальный скриншот.
Локальный `npm run build` (вне Docker) всегда работал корректно —
проблема была только в наборе файлов, копируемых в Docker build context.
Laravel 13 в laravel-app/, Breeze (Blade) для сессионного логина + Sanctum
для API-токенов (задел под Vue/Flutter на этапе 3). Схема Postgres
перенесена из сырого SQL в Laravel-миграции (владелец схемы теперь Laravel,
Go-сервисы как читали/писали эти таблицы, так и продолжают). Роли/категории/
операторы условий — закрытые PHP-enum'ы (UserRole, DeviceCategory,
ConditionOperator); action_type правил намеренно остаётся строкой — открытый,
управляемый данными список, а не код. Сидер device_types с growbox-типами
как пример данных, не бизнес-логика.
Docker: один контейнер (php-fpm + nginx через supervisord, multi-stage
сборка vendor/assets). Образ пока не --no-dev — сидер использует fake()
для демо-аккаунта.
Проверено: миграции применяются на реальном Postgres (в докере и локально),
дефолтные тесты Breeze проходят (25/25), Breeze-логин подтверждён вживую
через браузер, Sanctum корректно отдаёт 401 на защищённый /api/user без
токена.