services: frontend: # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (수동 up 때만 실행) restart: "no" build: target: build-stage # 비-root 구동이라 1024 미만 포트를 쓸 수 없다 → vite 기본 포트 사용 command: npm run dev -- --host 0.0.0.0 --port 5173 ports: - "${FRONTEND_PORT}:5173" # dev 는 nginx(8080)가 아니라 vite(5173)를 띄우므로 base 의 헬스체크를 덮어쓴다 healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5173/ || exit 1"] environment: - CHOKIDAR_USEPOLLING=true - WATCHPACK_POLLING=true # vite dev 서버가 /api 요청을 백엔드 컨테이너로 프록시한다 (vite.config.ts) - VITE_DEV_API_PROXY=http://backend:${BACKEND_PORT} 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 # base 의 업로드 볼륨을 소스 바인드 마운트 위에 다시 얹는다 - ${UPLOAD_DATA_DIR:-./data/uploads}:/app/uploads # dev에서는 리버스 프록시 미사용 — base의 networks 목록을 덮어씀 networks: !override - app-network db: # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (base 의 always 를 덮어씀) restart: "no" # 로컬 DB 툴 접속용. 127.0.0.1 로 한정해 외부 네트워크에 노출되지 않게 한다 (보안 규칙) ports: - "127.0.0.1:${DB_PORT}:5432" redis: # dev에서는 Docker Desktop 시작 시 자동 실행 방지 (base 의 always 를 덮어씀) restart: "no" # 로컬 Redis CLI 접속용. 127.0.0.1 로 한정 (보안 규칙) ports: - "127.0.0.1:${REDIS_PORT}:6379" # base의 proxy 외부 네트워크 의존을 dev에서 제거 networks: proxy: !reset null