Запускаем прод с AI | start:prod, PM2, фронт внутри бэкенда и e2e — Fullstack с AI — Часть 4
EndyKaufman
0:00 / 0:00
Запускаем прод с AI | start:prod, PM2, фронт внутри бэкенда и e2e — Fullstack с AI — Часть 4
64 просмотра · 3 дня назад
EndyKaufman
21 подписчик
64 просмотра · 3 дня назад
Продолжаем серию «Строим настоящий Fullstack-проект с AI с нуля до продакшена».
В первой части мы создали основу проекта KaufmanBot на NestJS + Angular с Prisma, PostgreSQL, Docker Compose и другими инструментами.
Во второй части перешли к тестированию: создавали E2E, Unit и API-тесты с помощью LLM, разбирали подход с HeyAPI.
В третьей части настраивали CI/CD на GitHub Actions: пайплайны для бэкенда и фронтенда, линты, билды и юнит-тесты, MCP для GitHub и скилл для онбординга коммитов.
В этой части доводим до ума запуск продакшена: разбираем по шагам скрипт start:prod, ловим «database environment is not set», выясняем, почему PM2 работал без логов, и кладём собранный фронтенд внутрь бэкенда через ServerStatic. Потом настраиваем end-to-end тесты в GitHub Actions: workflow с ручным запуском, где можно выбрать ветку бэкенда и ветку фронтенда, поднять инфраструктуру с базой и MinIO, прогнать e2e и забрать отчёты в чек.
Отдельно показываю сам процесс работы с кодом, который генерирует AI: не пытаемся сделать всё сразу, а двигаемся постепенно — упали на environment, разобрались, починили, поехали дальше. Рутину отдаю дешёвой модели, решения принимаю сам и читаю то, что она написала. Два показательных случая: тест, который прошёл, но ничего не проверил, и упавший пайплайн, в который агент сходил сам через MCP для GitHub и починил его.
Также показываю, почему дома я работаю с дешёвыми моделями, а на работе с Claude, и сколько сгенерированного кода приходится перечитывать.
В видео:
— как устроен скрипт start:prod и чем он отличается от start:dev
— падение на environment и почему Node не должна сама читать env-файл
— логи PM2 в проде: причина в кластерном режиме и IPC
— фронтенд внутрь бэкенда через ServerStatic и флаг production
— два фронтенда дают рассинхрон: в дев-режиме статику глушим
— workflow с ручным запуском: ветка бэкенда и фронтенда на одном стенде
— Playwright на фронтенде, JUnit-отчёты и разделение unit/e2e по папкам
— self-hosted раннеры и пересекающийся порт 3000
— тест-симуляция: прошёл, но ничего не проверил
— отладка упавшего пайплайна через MCP
Это четвёртая часть серии, в которой мы постепенно развиваем KaufmanBot и приближаем его к полноценному production-проекту.
🔗 Исходный код проекта:
https://github.com/kaufman-bot/kaufma...
🛠️ Используемые технологии:
Qoder IDE
AI / LLM
NestJS
Angular
TypeScript
Prisma
PostgreSQL
PM2
MinIO
Docker
GitHub Actions
CI/CD
MCP
Playwright
JUnit
NGINX
📌 Серия:
Часть 1 — создание проекта и базовая архитектура
Часть 2 — тестирование проекта с AI и HeyAPI
Часть 3 — CI/CD с AI, GitHub Actions и скилл онбординга
Часть 4 — продакшн-запуск с AI, фронтенд внутри бэкенда и e2e в CI/CD
Часть 5 — [добавим после выхода]
Если интересна разработка приложений с использованием AI — подписывайся. Проект будем постепенно развивать дальше.
Таймкоды:
00:00 — Привет и о чём выпуск
Четвёртая часть: продакшен и e2e
01:15 — Как устроен start:prod: в проде один PM2
Контейнеры, база, миграции, сборка, PM2
04:07 — database environment is not set
Первое падение при запуске прода
05:21 — dotenv или process.env: что правильнее
Одна точка истины — process.env
06:58 — E2E-тесты смотрят на локальный адрес, а не на домен
Base URL подтягивается из окружения
09:34 — Прод поднялся, а логи PM2 молчат
Спрашиваю нейронку, где логи
12:19 — Причина: кластерный режим PM2 и IPC
PM2 форкает процесс и забирает stdout
13:34 — Фронтенда в проде не видно: ServerStatic как в opwork
В дев-режиме работал прокси
22:18 — Отработало: фронт подключён как статика
Путь сборки зависит от флага production
24:22 — Два фронтенда — рассинхрон: в деве static глушим
Собранный билд и watch-сервер расходятся
30:05 — Статику должен раздавать NGINX, а не Node
Как так принято в реальном проде
34:01 — Идея: e2e поверх поднятой инфраструктуры, две ветки на стенде
Run workflow с выбором двух веток
38:57 — Что добавил агент: workflow, Playwright, JUnit
Playwright-конфиг, JUnit-отчёты, папки unit/e2e
46:22 — Self-hosted раннеры пересекаются на порту 3000
Два разработчика на одном порту
52:36 — Тест оказался симуляцией
Прошёл, но SSE-время не сравнивал
56:56 — Чем умнее модель, тем больше перечитывать
Тонны кода, и всё это надо прочитать
1:02:27 — Упало на сабмодулях: агент сам ходит в GitHub через MCP
Сам открывает чек, находит причину, правит
1:06:59 — Почему я дома беру дешёвые модели
Дешёвые дома, Claude на работе
1:13:47 — MinIO-образ не скачивается: bitnamilegacy
Официальный образ в архиве, взяли чужой
1:17:25 — Финальный прогон: всё зелёное, отчёты в чеке
Инфра поднялась, тесты зелёные
1:19:49 — Backend main + frontend part1
Стенд из двух разных веток
1:22:30 — Падение доказало: ветки подтягиваются
Фронтенд упал, бэкенд прошёл
1:26:31 — Итог и что дальше
Что настроили и следующий шаг
#CI_CD #GitHubActions #AI #Fullstack #NestJS #Angular #DevOps #PM2 #Playwright #MCP #TypeScript #WebDevelopment #Qoder