«У меня локально работает» лечится паритетом: те же major-версии Postgres, Redis, reverse proxy что на staging.

Состав stack
- app (backend), web (nuxt), db, redis, caddy/nginx
- Один .env в корне монорепо
Volumes
Named volume для PG data; bind mount только для hot-reload кода.
Seed data
Идемпотентные migrations + optional seed SQL для demo.

Чеклист
- docker compose up поднимает всё за 1 команду
- README с портами
- Healthchecks в compose
Паритет с prod
- Major версии Postgres/Redis совпадают со staging
- Тот же reverse proxy path (/api strip) что на Caddy
- Seed-данные покрывают happy path оплаты и auth
Onboarding за один день
README: clone → copy .env.example → docker compose up → migrate → open localhost. Скрипт `make dev` или npm script с health wait снимает большинство вопросов при первом запуске.
Типовой compose для fullstack
Сервисы: db (Postgres 16), redis, backend (Nest hot-reload), frontend (Nuxt dev), caddy с тем же path routing что prod. Переменные — один .env.example без секретов интеграций; Telegram/SMTP подставляются через admin после первого seed.
Healthcheck на db: `pg_isready`; backend ждёт db через depends_on condition. Новый разработчик: git clone, cp .env.example .env, docker compose up — через 3–5 минут localhost открыт с seed admin.
Для отладки webhook PSP используйте ngrok или cloudflared tunnel в compose override — не меняйте prod callback URL ради локальной разработки.
Чеклист «поднял за час»
- README: clone, cp .env.example, docker compose up, migrate
- Порты и URL в таблице на одной странице
- Healthcheck на db и app
- Seed покрывает login и один happy-path (оплата, форма)