iykyka/docs/fcm-setup.md

4.2 KiB

FCM 설정 (N4-1 ~ N4-4 · N4-W4)

서버·클라이언트의 푸시 코드 경로는 준비됨.
새 Firebase 프로젝트는 레거시 서버 키가 비활성인 경우가 많아, HTTP v1 + 서비스 계정 JSON을 쓴다.

이미 된 것 (코드 · 프로덕션)

계층 동작
Flutter PushTokenService — Firebase 가능하면 실 FCM 토큰, 아니면 install: 플레이스홀더
Android google-services.json이 있을 때만 Google Services 플러그인 적용
Web (N4-W4) FirebaseWebConfig + 프로덕션 .env FIREBASE_*/VAPID 주입 · SW populated (:web: APP_ID)
core-backend notifyUser + POST /admin/push-testFCM HTTP v1(서비스 계정) 우선
서버 SA (N4-3) 프로덕션 secrets/firebase-service-account.json 마운트 done

Master가 할 일

N4-1 — Firebase Android 앱

  1. Firebase Console → Android 앱 추가
    package: com.ykavu.ykavu_mobile
  2. google-services.jsonAndroid 빌드 PC에만 배치 (git 금지):
cp ~/Downloads/google-services.json mobile/android/app/google-services.json

N4-3 — 서비스 계정 JSON (HTTP v1) — 프로덕션 done

레거시 서버 키가 Cloud Messaging 탭에서 사용 중지됨이면 정상이다.

프로덕션 호스트에 이미 배치됨:

# ~/project/ykavu/secrets/firebase-service-account.json
# compose: ./secrets → /secrets, FCM_SERVICE_ACCOUNT_FILE=/secrets/firebase-service-account.json

새 환경에 다시 놓을 때:

mkdir -p secrets
mv ~/Downloads/iykyka-*.json secrets/firebase-service-account.json
chmod 600 secrets/firebase-service-account.json
docker compose up -d --build core-backend

git / 채팅에 JSON 내용을 붙여넣지 않는다.

N4-2 / N4-4 — Android 실기기 스모크

cd mobile
flutter run --release --dart-define=CORE_API_BASE=https://msn.iykyka.com
# 로그: device token registered (FCM)
curl -sS -X POST https://msn.iykyka.com/admin/push-test \
  -H "Authorization: Bearer $ADMIN_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"user_id": <USER_ID>, "title":"와카뷰","body":"push smoke"}'

기대: sent >= 1.
only_placeholder_tokens → Android에 google-services.json 넣고 재설치.
fcm_not_configured → 서비스 계정 경로 확인.

Web (N4-W4)

설계·수락: web-upgrade.md §N4-W4 · 실행 표: deploy-checklist.md §N4-W.

프로덕션: Firebase Web config + VAPID + :web: APP_ID가 서버 .env에 있고 web 이미지에 빌드 주입됨.
SW(firebase-messaging-sw.js) populated. 서버 SA는 Android와 공유.

남은 accept (브라우저)

  1. https://msn.iykyka.com 하드 리프레시 (또는 사이트 데이터 삭제)
  2. 알림 허용 → 로그인
  3. device_tokens에 실 토큰(platform=web, install: 아님)
  4. /admin/push-testsent >= 1 (탭 백그라운드에서도 알림)

로컬/스테이징에서 define이 비어 있으면 웹은 install:만 등록 → only_placeholder_tokens가 정상.

새 환경에 Web 시크릿을 넣을 때

배포 호스트 ~/project/ykavu/.env(클라우드 에이전트 /workspace/.env와 별개):

FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=          # 비우면 {projectId}.firebaseapp.com
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=       # 비우면 {projectId}.appspot.com
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=               # must be 1:…:web:…  (not :android:)
FIREBASE_VAPID_KEY=
docker compose up -d --build web

로컬 Flutter web

cd mobile
flutter run -d chrome \
  --dart-define=CORE_API_BASE=http://localhost:8080 \
  --dart-define=FIREBASE_API_KEY=... \
  --dart-define=FIREBASE_APP_ID=... \
  --dart-define=FIREBASE_MESSAGING_SENDER_ID=... \
  --dart-define=FIREBASE_PROJECT_ID=... \
  --dart-define=FIREBASE_VAPID_KEY=...

구현 위치

  • mobile/lib/config/firebase_web_config.dart
  • mobile/lib/services/push_token_service.dart (_tryFirebaseWebToken)
  • mobile/web/firebase-messaging-sw.js (+ .template, scripts/docker_build_web.sh)
  • mobile/Dockerfile / docker-compose.yml build-args