4. 인프라 & 환경
시스템이 실제로 어디서, 어떤 구성으로 돌아가는지 정리합니다.
4.1 환경 맵
| 환경 | PROJECT_ID | Cloud Run URL | Region |
|---|---|---|---|
| dev | spective-dev | https://spective-web-xf3kugqnca-du.a.run.app | asia-northeast3 |
| prod | spective-prod | https://spective-web-771785464554.asia-northeast3.run.app | asia-northeast3 |
- 서비스명:
spective-web/ Artifact Registry repo:spective(asia-northeast3) - Cloud Run 스펙: dev
cpu=2, mem=4Gi, min=0, max=3/ prodcpu=2, mem=4Gi, min=1, max=10 - 출처:
docs/infra/cloud-scheduler.md,.github/workflows/deploy-*.yml - 커스텀 도메인: 프로덕션 서비스 도메인은
anaspective.com(알렉스앤앨리스 소유·관리, 도메인/DNS는 §7.1). dev는spective-dev.web.app(Firebase Hosting). 출처:apps/web/server/lib/auth.tstrustedOrigins
4.2 GCP 구성
- Cloud Run: Nuxt(Nitro) 서버 컨테이너 실행.
--allow-unauthenticated. - Artifact Registry: Docker 이미지 저장 (
spectiverepo). - Secret Manager: dotenvx 복호화 키 보관 (
DOTENV_PRIVATE_KEY_SECRETS_DEVELOPMENT/..._PRODUCTION). Cloud Run에--set-secrets로 주입. - 서비스 계정:
firebase-adminsdk-fbsvc@spective-{dev,prod}.iam(AR writer, run.admin, serviceAccountUser). Compute SA에 Secret Accessor. - 초기 셋업 명령(API 활성화 · AR 저장소 생성 · IAM 바인딩 · Secret 생성) →
README.md"Google Cloud / Firebase 설정" 전체 참조. 인계 후 신규 환경 구성 시 그대로 재현 가능. - 환경 전환:
firebase use dev|prod
4.3 Firebase Hosting
- 정적 자산(
apps/web/.output/public) 호스팅 + 모든 경로(**)를 Cloud Run(spective-web, asia-northeast3)으로 rewrite. cleanUrls: true.- 출처:
firebase.json,.firebaserc
4.4 외부 서비스 인벤토리
소유/결제 주체는 §7.1 참조 (대부분 알렉스앤앨리스). 아래는 코드 근거로 확인한 연동 상세.
토스페이먼츠 (결제 PG)
- 코드 위치:
apps/web/server/api/payments/(prepare.post.ts→confirm.post.ts→entitlement.get.ts,webhook.post.ts,history.get.ts),api/tickets/confirm.post.ts - 승인 API:
https://api.tosspayments.com/v1/payments/confirm(timeout 30s) - 웹훅 사용: 예 (
payments/webhook.post.ts) - 환경변수:
TOSS_SECRET_KEY(서버),NUXT_PUBLIC_TOSS_CLIENT_KEY(클라이언트),NUXT_PUBLIC_TOSS_MID(상점ID) —nuxt.config.tsruntimeConfig. (승인 URL·타임아웃은 코드 상수) - 스펙:
docs/specs/02-individual/007-individual-payment.md - 콘솔 계정·요금·정산: 알렉스앤앨리스 자체 보유·관리 (인계 대상 아님)
Cloudflare Browser Rendering (PDF)
- 코드 위치:
apps/web/server/lib/cloudflare-pdf.ts(REST/pdfwrapper, 공식cloudflareSDK) - 호출처:
api/internal/pdf/run.post.ts,api/internal/report/[id].get.ts, org/adminreports/bulk-download.get.ts,routers/org/comparison-reports.ts - 환경변수:
CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_API_TOKEN - 한도(코드 주석 기준): Workers Paid 플랜 REST
/pdf초당 10건, 브라우저 인스턴스 타임아웃 60s. 5xx/429/네트워크 오류 지수백오프 3회 재시도.
이메일 — Resend
- Resend 사용 확정 (
apps/web/server/lib/resend.ts). CTO 확인 완료. - Region: Tokyo (ap-northeast-1)
- 환경변수:
RESEND_API_KEY,EMAIL_FROM(nuxt.config.tsruntimeConfig) - 발송 종류: 이메일 인증코드(가입), 비밀번호 재설정, 계정삭제 확인, 조직/참여자 초대, 보고서 발송
- 호출처:
lib/auth.ts,routers/admin/organizations.ts,routers/org/participants.ts,routers/reports/pdf.ts등 - 스펙:
docs/specs/02-individual/006-individual-auth.md - 콘솔 계정·요금제·도메인 인증(SPF·DKIM): 알렉스앤앨리스 자체 보유·관리 (인계 대상 아님)
AWS (RunsOn / S3)
- self-hosted GitHub Actions 러너 + Docker 빌드 S3 캐시. 열정팩토리 보유, 인계 대상 아님(§7.1).
Cloudflare·토스·Resend 콘솔 계정/요금제/한도는 모두 알렉스앤앨리스가 자체 보유·관리하므로 별도 수집 대상이 아닙니다. 위 표는 코드 연동 상세(인계 지식)만 정리합니다.