Разворот boilerplate и маршрут курса
Перед началом: ничего (стартовый модуль). Инструменты: Docker, Go 1.27+, Node 22+,
make,psql. Трудоёмкость: ~3 ч.
🔥 Инцидент: «у меня не запускается»
Первое занятие любого курса по бэкенду умирает на одном и том же месте:
пять человек пишут «не работает». У одного JWT_SECRET не задан, у второго
порт 5432 занят чужим Postgres, у третьего фронт ходит в :8080, где сидит
совсем другое приложение. Никто ещё не написал ни строчки логики — а
половина группы уже застряла. В этом модуле мы разворачиваем стек так,
чтобы эти грабли были исключены конструкцией, и фиксируем маршрут курса.
📖 Теория
1.1 Что такое boilerplate
Это монорепозиторий из двух частей:
boilerplate/
├── api/openapi.yaml # контракт: auth, chat, реакции, стикеры, ws
├── backend/ # Go: chi + pgx + JWT + WS + outbox
├── frontend/ # React: Vite + FSD + effector + WS-клиент
├── docker-compose.yml # postgres (:5433) + redis (:6380)
└── Makefile # docker-up, migrate-up, seed, serve, test, validate-api
Бэкенд собран по канону production-сервиса: cmd/ (точки входа),
internal/ (config, models, security, events, usecase, repository,
handlers), миграции SQL, спецификация OpenAPI с тестом «каждый роут
задокументирован, каждый путь реализован». Фронтенд — слои FSD
(app → pages → widgets → features → entities → shared), модели effector,
WS-клиент с переподключением.
Изучите структуру до того, как запускать: где хендлеры, где юзкейсы, где SQL, как связаны слои. Курс будет постоянно дописывать эти места.
1.2 Что умеет версия 1
| Есть | Будет в курсе |
|---|---|
| Регистрация и вход (bcrypt + JWT) | Диалоги вместо общей комнаты |
| Одна общая комната, сообщения | Личные диалоги (P2P) |
| WebSocket на комнату | Группы: роли, участники, приглашения |
| Transactional Outbox → in-memory брокер | Строгий порядок (seq) и catch-up после реконнекта |
| Rest-история сообщений | Read-receipts, typing, presence |
| Health/ready, request-id, логи | Web Push, метрики, нагрузочный тест |
| Локальный docker compose | Выкат на VM: реестр, релизы, health-гейт, откат |
Сверх минимума в версии 1 уже реализованы реакции и стикеры —
это рабочий образец того, как фича живёт поверх сообщений, не ломая
порядок и непрочитанные: реакция не создаёт сообщение и не двигает seq,
а изменение уходит лёгким событием message_reaction_changed через тот же
outbox. Разберите их до начала практики: internal/repository/reactions.go
и stickers.go на бэке, features/reactions и features/sticker-picker
на фронте, миграции 000002–000003. Дальше в курсе мы будем опираться
на этот образец (например, системные сообщения в группах — та же идея:
данные поверх messages, событие через outbox).
Версия 1 — это «стадия 1» (модульный монолит): auth + чат + WS-хаб в одном процессе. В этом курсе мы остаёмся в стадии 1 и доводим её до продакшена; микросервисная эволюция (вынос ws-gateway, Redis Streams между репликами) — следующий курс трека.
1.3 Почему порты 5433 и 6380
Compose бойлерплейта намеренно не занимает дефолтные порты: локальный
Postgres на 5432 и Redis на 6379 почти наверняка уже кем-то заняты
(другой проект, дев-стенд). На первом занятии это выглядит как «докер
сломался», хотя докер просто честно не смог забиндиться. Если открываете
свои БД — используйте эти же порты или переопределите DATABASE_URL.
💻 Практика
- Разверните инфраструктуру и накатите схему:
bashmake docker-up # postgres:16 → :5433, redis:7 → :6380 make migrate-up # users, rooms, messages, reactions, stickers, outbox make seed # alice@example.dev / bob@example.dev, пароль secret123
- Поднимите бэкенд (терминал 1):
bashcp .env.example .env # JWT_SECRET — обязателен make serve # API + WS на :8080
- Поднимите фронтенд (терминал 2) и войдите как
alice@example.dev:
bashcd frontend && npm install && npm run dev
- Прогоните API-сценарий руками (вместо «поверю, что работает»):
bashTOKEN=$(curl -s -X POST localhost:8080/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"alice@example.dev","password":"secret123"}' | jq -r .token) curl -s localhost:8080/api/v1/chat/rooms -H "Authorization: Bearer $TOKEN" | jq
- Проверьте контракт и тесты — это ваш «зелёный свет» на весь курс:
bashmake test # go test ./... make validate-api # спека валидна + роуты chi совпадают со спецификацией
- Откройте второй браузерный профиль (или инкогнито), войдите как
bob, отправьте сообщения с обеих сторон — убедитесь, что доставка по WS работает и лента дедуплицируется.
Чек-лист модуля: /health и /ready отвечают ok; make test и
make validate-api зелёные; два пользователя видят сообщения друг друга;
вы можете нарисовать по памяти путь сообщения: REST → транзакция с outbox
→ воркер → брокер → WS-клиенты.
🧩 Quiz
JWT_SECRET?make seed?✅ Итоги модуля
- Развёрнут стек: Postgres, Redis, бэкенд, фронтенд, сид-данные.
- Зелёные
make testиmake validate-api— контракт и код синхронны. - Понятна структура
backend/(по канонуcmd+internal) и фронт-слоёв FSD. - Зафиксирован маршрут: v1 — одна общая комната; v2 — диалоги, группы, sync, продакшен.
- Известны грабли первого запуска: порты,
JWT_SECRET, прокси фронта.
🔗 Мостик к Модулю 2
Комната в v1 — одна на всех. Настоящий мессенджер начинается с диалогов:
у каждой переписки — свой маленький мир с участниками и своей лентой.
В следующем модуле проектируем единую модель conversations для личных
диалогов и групп — и идемпотентное создание P2P-переписки, которое не
боится гонок.