mmday-firebase/scripts/_bootstrap.ts
윤정민 90d6895de4 Pin script RTDB region and gate empty-source backfill marker
- 스크립트 부트스트랩의 databaseURL 기본값에 리전 포함 — 기존 `...firebaseio.com`은 SDK가 "Database lives in a different region" 경고만 내고 다른 리전의 없는 DB를 보게 해서, 조회가 조용히 빈 결과를 돌려주고 실행이 멈췄다. 지금까지 스크립트가 RTDB를 안 써서 드러나지 않던 문제다. FIREBASE_DATABASE_REGION으로 덮어쓸 수 있다
- 백필 스크립트가 접속한 database URL을 먼저 출력하도록 변경
- 소스가 비었을 때 완료 마커를 자동으로 남기지 않고 --mark-empty를 요구하도록 변경 — 빈 조회는 "정말 투표가 없다"와 "엉뚱한 DB에 붙었다"를 구분하지 못하는데, 후자에서 마커가 켜지면 이후 dailyArchive가 인덱스만 믿고 전 유저를 건너뛴다
2026-07-27 13:39:10 +09:00

29 lines
1.4 KiB
TypeScript

/**
* prod Firebase Admin 부트스트랩(side-effect 모듈).
*
* 반드시 src/* 모듈보다 "먼저" import해야 한다 — 그래야 src/firebase의
* initializeApp()가 재실행되지 않고 여기서 만든 앱(projectId·databaseURL 지정)을
* 재사용한다. 자격증명은 ADC(applicationDefault)를 쓴다:
* gcloud auth application-default login
* 또는 GOOGLE_APPLICATION_CREDENTIALS=<서비스계정.json>
*
* databaseURL은 반드시 **리전을 포함**해야 한다. 리전 없는 기본 호스트
* (`...firebaseio.com`)로 붙으면 SDK가 "Database lives in a different region"만
* 경고하고 다른 리전의 (존재하지 않는) DB를 보게 되어, 조회가 조용히 빈 결과를
* 돌려준다 — 그 값을 사실로 믿는 스크립트는 위험한 판단을 내릴 수 있다.
* 리전은 FIREBASE_DATABASE_REGION, 전체 URL은 FIREBASE_DATABASE_URL로 덮어쓴다.
*/
import { initializeApp, getApps } from "firebase-admin/app";
const projectId = process.env.FIREBASE_PROJECT ?? process.env.GCLOUD_PROJECT ?? "mmday-panit";
const databaseRegion = process.env.FIREBASE_DATABASE_REGION ?? "asia-southeast1";
const databaseURL =
process.env.FIREBASE_DATABASE_URL ??
`https://${projectId}-default-rtdb.${databaseRegion}.firebasedatabase.app`;
if (getApps().length === 0) {
initializeApp({ projectId, databaseURL });
}
export const BOOTSTRAP_PROJECT = projectId;