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} # 웹 푸시(VAPID) 공개키 — dev 는 Vite dev 서버 런타임 env 로 주입 - VITE_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY} 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