services:
  frontend:
    # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (수동 up 때만 실행)
    restart: "no"
    build:
      target: build-stage
    command: npm run dev -- --host 0.0.0.0 --port 80
    ports:
      - "${FRONTEND_PORT}:80"
    environment:
      - CHOKIDAR_USEPOLLING=true
      - WATCHPACK_POLLING=true
      # 화상회의 — 브라우저가 접속할 LiveKit URL(개발은 LiveKit Cloud 사용).
      #   런타임 env 로 주입해 이미지 재빌드 없이 .env 변경 + 컨테이너 재생성만으로 반영된다.
      - VITE_LIVEKIT_URL=${LIVEKIT_WS_URL}
    volumes:
      - ./${FRONTEND_DIR}:/app
      - /app/node_modules
    # dev에서는 리버스 프록시 미사용 — base의 networks 목록을 덮어씀
    networks: !override
      - app-network

  backend:
    # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (수동 up 때만 실행)
    restart: "no"
    build:
      target: builder
    command: npm run start:dev
    ports:
      - "${BACKEND_PORT}:${BACKEND_PORT}"
      - "${WEBSOCKET_PORT}:${WEBSOCKET_PORT}"
    environment:
      - CHOKIDAR_USEPOLLING=true
      - WATCHPACK_POLLING=true
    volumes:
      - ./${BACKEND_DIR}:/app
      - /app/node_modules
    # dev에서는 리버스 프록시 미사용 — base의 networks 목록을 덮어씀
    networks: !override
      - app-network

  # 화상회의는 개발에서 LiveKit Cloud 를 사용한다(로컬 SFU 컨테이너 없음).
  #   WSL2/Docker Desktop 의 WebRTC 네트워킹 제약을 우회하기 위함.
  #   base 의 livekit 은 운영 기본 서비스라, dev 에서는 selfhost-livekit 프로파일로 가두어
  #   기동되지 않게 한다(이 프로파일은 dev 에서 켜지 않으므로 컨테이너 미생성).
  livekit:
    profiles:
      - selfhost-livekit

  db:
    # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (base 의 always 를 덮어씀)
    restart: "no"
    ports:
      - "${DB_PORT}:5432"

  redis:
    # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (base 의 always 를 덮어씀)
    restart: "no"
    ports:
      - "${REDIS_PORT}:6379"

# base의 proxy 외부 네트워크 의존을 dev에서 제거
networks:
  proxy: !reset null