Skip to content

4. 인프라 & 환경

시스템이 실제로 어디서, 어떤 구성으로 돌아가는지 정리합니다.

4.1 환경 맵

환경PROJECT_IDCloud Run URLRegion
devspective-devhttps://spective-web-xf3kugqnca-du.a.run.appasia-northeast3
prodspective-prodhttps://spective-web-771785464554.asia-northeast3.run.appasia-northeast3
  • 서비스명: spective-web / Artifact Registry repo: spective (asia-northeast3)
  • Cloud Run 스펙: dev cpu=2, mem=4Gi, min=0, max=3 / prod cpu=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.ts trustedOrigins

4.2 GCP 구성

  • Cloud Run: Nuxt(Nitro) 서버 컨테이너 실행. --allow-unauthenticated.
  • Artifact Registry: Docker 이미지 저장 (spective repo).
  • 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.tsconfirm.post.tsentitlement.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.ts runtimeConfig. (승인 URL·타임아웃은 코드 상수)
  • 스펙: docs/specs/02-individual/007-individual-payment.md
  • 콘솔 계정·요금·정산: 알렉스앤앨리스 자체 보유·관리 (인계 대상 아님)

Cloudflare Browser Rendering (PDF)

  • 코드 위치: apps/web/server/lib/cloudflare-pdf.ts (REST /pdf wrapper, 공식 cloudflare SDK)
  • 호출처: api/internal/pdf/run.post.ts, api/internal/report/[id].get.ts, org/admin reports/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.ts runtimeConfig)
  • 발송 종류: 이메일 인증코드(가입), 비밀번호 재설정, 계정삭제 확인, 조직/참여자 초대, 보고서 발송
  • 호출처: 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 콘솔 계정/요금제/한도는 모두 알렉스앤앨리스가 자체 보유·관리하므로 별도 수집 대상이 아닙니다. 위 표는 코드 연동 상세(인계 지식)만 정리합니다.