# Trade-In MVP — production overlay для деплоя ВНУТРИ gendesign-стека. # # Запускается из /opt/gendesign/tradein-mvp/ на bot-server: # docker compose -p gendesign \ # -f docker-compose.yml -f docker-compose.prod.yml up -d # # Особенности vs локального docker-compose.yml: # - НЕТ своего Caddy и postgres-данных в bind mount # (postgres контейнер один на всю машину, но изолированная БД tradein_mvp) # - Образы тянутся из GHCR (build делает GitHub Actions) # - Backend/frontend подключены к network gendesign_shared чтобы основной # Caddy мог проксировать /trade-in/* → tradein-frontend # - Frontend строится с basePath=/trade-in (см. next.config.ts) services: postgres: image: postgis/postgis:16-3.4 container_name: tradein-postgres environment: POSTGRES_DB: tradein POSTGRES_USER: ${TRADEIN_POSTGRES_USER:-tradein} POSTGRES_PASSWORD: ${TRADEIN_POSTGRES_PASSWORD:?required} volumes: - tradein-postgres-data:/var/lib/postgresql/data - ./backend/data/sql:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${TRADEIN_POSTGRES_USER:-tradein}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - tradein-net - gendesign_shared backend: image: ghcr.io/lekss361/gendesign-tradein-backend:${IMAGE_TAG:-latest} container_name: tradein-backend environment: DATABASE_URL: "postgresql+psycopg://${TRADEIN_POSTGRES_USER:-tradein}:${TRADEIN_POSTGRES_PASSWORD}@postgres:5432/tradein" PUBLIC_URL: "https://gendsgn.ru/trade-in" CORS_ORIGINS: '["https://gendsgn.ru"]' ENVIRONMENT: "production" CONTACT_EMAIL: "${TRADEIN_CONTACT_EMAIL:-tradein@gendsgn.ru}" YANDEX_GEOCODER_KEY: "${YANDEX_GEOCODER_KEY:-}" # Защита /api/v1/admin/* — задаётся в .env.runtime. Пусто = открыто (dev). ADMIN_TOKEN: "${ADMIN_TOKEN:-}" # GlitchTip DSN — мониторинг ошибок (#396). Пусто = выключено. GLITCHTIP_DSN: "${GLITCHTIP_DSN:-}" GENDESIGN_FDW_PASSWORD: "${GENDESIGN_FDW_PASSWORD:-}" # Encryption key for Cian session cookies (pgp_sym_encrypt). Required for # Valuation Calculator (Stage 9). Empty = Calculator scraper disabled + # cookies upload endpoint returns 503. Generate with `openssl rand -hex 32`. COOKIE_ENCRYPTION_KEY: "${COOKIE_ENCRYPTION_KEY:-}" depends_on: postgres: condition: service_healthy restart: unless-stopped networks: - tradein-net - gendesign_shared # чтобы Caddy gendesign-стека достучался frontend: image: ghcr.io/lekss361/gendesign-tradein-frontend:${IMAGE_TAG:-latest} container_name: tradein-frontend environment: NODE_ENV: production # Next.js standalone server.js читает HOSTNAME для bind-адреса. # Docker по умолчанию ставит HOSTNAME= → сервер слушает # только свой hostname-интерфейс и недоступен как tradein-frontend:3000. # Принудительно 0.0.0.0 чтобы Caddy достучался. HOSTNAME: "0.0.0.0" BACKEND_URL: "http://backend:8000" # internal SSR depends_on: [backend] restart: unless-stopped networks: - tradein-net - gendesign_shared volumes: tradein-postgres-data: name: tradein-postgres-data networks: tradein-net: name: tradein-net gendesign_shared: external: true