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가 인덱스만 믿고 전 유저를 건너뛴다
This commit is contained in:
윤정민 2026-07-27 13:39:10 +09:00
parent d2df63e63c
commit 90d6895de4
2 changed files with 27 additions and 6 deletions

View File

@ -7,14 +7,19 @@
* gcloud auth application-default login * gcloud auth application-default login
* GOOGLE_APPLICATION_CREDENTIALS=<서비스계정.json> * GOOGLE_APPLICATION_CREDENTIALS=<서비스계정.json>
* *
* RTDB를 src/firebase가 getDatabase() * databaseURL은 ** ** .
* databaseURL이 import throw한다 URL을 . * (`...firebaseio.com`) SDK가 "Database lives in a different region"
* ( ) DB를 ,
* 믿 .
* FIREBASE_DATABASE_REGION, URL은 FIREBASE_DATABASE_URL로 .
*/ */
import { initializeApp, getApps } from "firebase-admin/app"; import { initializeApp, getApps } from "firebase-admin/app";
const projectId = process.env.FIREBASE_PROJECT ?? process.env.GCLOUD_PROJECT ?? "mmday-panit"; const projectId = process.env.FIREBASE_PROJECT ?? process.env.GCLOUD_PROJECT ?? "mmday-panit";
const databaseRegion = process.env.FIREBASE_DATABASE_REGION ?? "asia-southeast1";
const databaseURL = const databaseURL =
process.env.FIREBASE_DATABASE_URL ?? `https://${projectId}-default-rtdb.firebaseio.com`; process.env.FIREBASE_DATABASE_URL ??
`https://${projectId}-default-rtdb.${databaseRegion}.firebasedatabase.app`;
if (getApps().length === 0) { if (getApps().length === 0) {
initializeApp({ projectId, databaseURL }); initializeApp({ projectId, databaseURL });

View File

@ -8,8 +8,14 @@
* . * .
* *
* : * :
* npx tsx scripts/backfill-user-votes-by-date.ts # * npx tsx scripts/backfill-user-votes-by-date.ts #
* npx tsx scripts/backfill-user-votes-by-date.ts --apply # * npx tsx scripts/backfill-user-votes-by-date.ts --apply #
* npx tsx scripts/backfill-user-votes-by-date.ts --apply --mark-empty #
*
* (/userVotes) .
* "정말 투표가 없다" "엉뚱한 DB에 붙었다" ,
* 믿 .
* --mark-empty로 .
*/ */
import "./_bootstrap"; import "./_bootstrap";
import { rtdb } from "../src/firebase"; import { rtdb } from "../src/firebase";
@ -22,11 +28,21 @@ const CHUNK = 500;
async function main(): Promise<void> { async function main(): Promise<void> {
const apply = process.argv.includes("--apply"); const apply = process.argv.includes("--apply");
const markEmpty = process.argv.includes("--mark-empty");
console.log(`database: ${rtdb.app.options.databaseURL}`);
const snap = await rtdb.ref("/userVotes").get(); const snap = await rtdb.ref("/userVotes").get();
if (!snap.exists()) { if (!snap.exists()) {
console.log("no /userVotes data — nothing to backfill"); console.log("no /userVotes data — nothing to backfill");
if (apply) await markBackfilled(); if (!apply) return;
if (!markEmpty) {
console.log(
"마커를 남기지 않았다. 위 database URL이 맞고 정말 투표가 없다면 --mark-empty를 붙여 다시 실행할 것."
);
return;
}
await markBackfilled();
return; return;
} }