8d00d71072
카카오톡처럼 PC에 OS 토스트가 뜨도록 Web Notifications(Level1) +
Web Push/서비스워커(Level2)를 기존 인앱·SSE 알림 위에 얹는다.
중복 방지: 페이지가 열려 있으면 SSE 로컬 알림(포커스면 인앱만),
닫혀 있으면 서비스워커 푸시가 담당한다.
- 백엔드: push_subscriptions 엔티티 + WebPushService(VAPID 설정·
type→{title,body,url} 포매터·만료 구독 정리), notify()가 SSE와
함께 푸시 발송, push/subscribe·unsubscribe 엔드포인트, 마이그레이션,
web-push 의존성
- 프론트: public/sw.js(push/클릭), usePush 컴포저블(권한·구독, 결과
안내), notification.store 로컬 토스트, AppShell 'PC 알림 켜기' 버튼
- env/compose: VAPID 키 주입(공개키→프론트, 비밀키→백엔드)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
66 lines
2.3 KiB
YAML
66 lines
2.3 KiB
YAML
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 |