e7c00e6f65
security.md 가 금지한다고 적어둔 것을 실제 설정이 어기고 있었다. - 프론트엔드 운영 컨테이너가 root 로 nginx 를 실행하고 있었다. nginx-unprivileged 로 전환하고 포트를 8080 으로 맞춤(비-root 는 1024 미만 바인드 불가). - dev 오버라이드가 사용하는 빌드 스테이지에도 USER node 적용. 익명 볼륨이 node 소유로 생성되도록 chown 을 USER 전환 앞에 둔다 (그렇지 않으면 vite 가 node_modules/.vite 캐시를 쓰지 못한다). - dev 의 DB/Redis 포트가 0.0.0.0 에 바인딩되어 같은 LAN 에 노출돼 있었다 → 127.0.0.1 로 한정. - CSP 헤더 추가. 대신 현대 브라우저에서 권장되지 않는 X-XSS-Protection 은 제거. - CORS 차단 시 Error 를 던져 500(SYS_001)이 되던 것을 헤더 미부여 방식으로 변경. - 헬스체크가 localhost 를 ::1 로 해석해 항상 실패하던 문제 수정(127.0.0.1 명시). - graceful shutdown 을 위해 init(tini)과 stop_grace_period 적용. - *.example 의 실제같은 비밀번호를 placeholder 로 교체하고, 비어 있던 서비스 env 예시에 안내를 채움. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
59 lines
2.0 KiB
YAML
59 lines
2.0 KiB
YAML
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
|
|
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
|
|
|
|
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 |