πŸ“– star365 Docs
← λ³΄κ³ μ„œ λͺ©λ‘

Agency v2 S2-A 보고 β€” Data Services + Prisma + NestJS Skeleton

보고 ID: agency-v2-s2a-20260503 μž‘μ„±μΌ: 2026-05-03 μž‘μ„±μž: Claude (μž„μ‹œ CEO) Sprint: S2-A (data services 가동 + Prisma migrate + NestJS skeleton)


1. μš”μ•½

S1 sprint + S1-fix 직후 μžλ™ S2 μ§„ν–‰. agency_v2 dedicated Docker stack 가동 + Prisma 20 ν…Œμ΄λΈ” 생성 + NestJS api-gateway 24 파일 μž‘μ„± μ™„λ£Œ. λΉŒλ“œ/μ‹€ν–‰ 검증은 S2-B (npm install μ‹œκ°„ 별도).

2. κ²°κ³Ό (정직 3λΆ„λ₯˜)

βœ… A. μ‹€μΈ‘ κ²€μ¦λœ μ™„μ„±

ν•­λͺ© 검증 κ²°κ³Ό
agency_v2_postgres :5441 (healthy) pg_isready accepting + PG 16.13 + agency_v2 DB 쑴재
agency_v2_redis :6391 docker ps Up + password 적용
agency_v2_minio :9061/9062 docker ps Up
Prisma db push 305ms "in sync" + Client generated
DB ν…Œμ΄λΈ” 20개 information_schema count
NestJS api-gateway 24 파일 find -type f
/opt/agency-v2/.env 0600 stat permission + 63 lines

⏳ B. 정직 PENDING (검증 λͺ» 함)

ν•­λͺ© μ‚¬μœ 
NestJS λΉŒλ“œ/μ‹€ν–‰ npm install λ―Έμ‹€ν–‰ (~150-200MB / 1-2λΆ„) β€” S2-B
Docker μ•± μ»¨ν…Œμ΄λ„ˆ build Dockerfile μž‘μ„±λμœΌλ‚˜ docker compose build λ―Έμ‹œλ„ β€” S2-B
TypeScript type-check npm install ν›„ κ°€λŠ₯
API μ‹€ 호좜 (register/login E2E) μ„œλ²„ 미가동
agency_db (v1) DROP retry 40/40 λͺ¨λ‘ fail β€” starium_postgres pool λ§Œμ„± 가득. 별도 sprint ν•„μš” (max_connections μ‘°μ • λ˜λŠ” PG restart)
DB user 4-tier 뢄리 (rw/ro/audit) super 1개만 μ‚¬μš© 쀑 β€” S2-B μž‘μ—…

⚠️ C. μ§„ν–‰ 쀑 ν•΄κ²°ν•œ 이슈

  1. minio port 9051 좩돌 (λ‹€λ₯Έ docker-proxy 점유) β†’ 9061/9062둜 λ³€κ²½, .env + compose 일괄 sed κ°±μ‹ 
  2. Prisma 5.22 inline enum validation error 158건 β€” enum X { A B C } ν•œμ€„ ν˜•μ‹ 미인식 β†’ Python regex둜 multi-line λ³€ν™˜ (enum X {\n A\n B\n})
  3. Schema LeadScore 쀑볡 μ •μ˜ (S1-fix sprint 패치 κ²°κ³Ό μž”μž¬) β†’ κΉ”λ”νžˆ μž¬μž‘μ„± (410 lines, 20 model + 13 enum + agencyId 53회 일관)

3. μ‚°μΆœλ¬Ό 맀트릭슀

3-1. NestJS api-gateway (24 파일)

apps/api-gateway/
β”œβ”€β”€ Dockerfile                                  ← multi-stage Node 22 + non-root
β”œβ”€β”€ nest-cli.json
β”œβ”€β”€ package.json                                ← 14 dependencies (NestJS 10.4 + JWT + Passport + bcryptjs + Prisma)
β”œβ”€β”€ tsconfig.json                               ← strict mode
└── src/
    β”œβ”€β”€ main.ts                                 ← bootstrap, ValidationPipe, CORS, port 10200
    β”œβ”€β”€ app.module.ts                           ← root (ConfigModule + Prisma + Auth + Agencies + Health)
    β”œβ”€β”€ prisma/
    β”‚   β”œβ”€β”€ prisma.module.ts                    ← @Global
    β”‚   └── prisma.service.ts                   ← OnModuleInit/Destroy lifecycle
    β”œβ”€β”€ health/health.controller.ts             ← GET /api/v1/health (db ping)
    β”œβ”€β”€ auth/                                   ← 10 파일
    β”‚   β”œβ”€β”€ auth.controller.ts                  ← POST register/login
    β”‚   β”œβ”€β”€ auth.service.ts                     ← bcrypt(12) + JWT issue
    β”‚   β”œβ”€β”€ auth.module.ts                      ← JwtModule async + Passport
    β”‚   β”œβ”€β”€ dto/register.dto.ts, login.dto.ts   ← class-validator
    β”‚   β”œβ”€β”€ strategies/jwt.strategy.ts          ← Passport JWT (Bearer)
    β”‚   β”œβ”€β”€ guards/jwt-auth.guard.ts, roles.guard.ts
    β”‚   └── decorators/roles.decorator.ts, current-user.decorator.ts
    └── agencies/                               ← 5 파일, SUPER_ADMIN μ „μš©
        β”œβ”€β”€ agencies.controller.ts              ← @Roles('SUPER_ADMIN'), CRUD
        β”œβ”€β”€ agencies.service.ts                 ← list/get/create/update/archive
        β”œβ”€β”€ agencies.module.ts
        └── dto/create-agency.dto.ts, update-agency.dto.ts

3-2. Docker stack

infrastructure/docker/
β”œβ”€β”€ docker-compose.yml                          ← S2-A λͺ¨λ“œ (data only, app 주석)
β”œβ”€β”€ data/postgres/                              ← PG persistent volume
β”œβ”€β”€ data/redis/                                 ← Redis persistent
└── data/minio/                                 ← MinIO bucket storage

3-3. Prisma

3-4. .env (chmod 0600)

3-5. λ©”λͺ¨λ¦¬ + 보고

4. S2-B λ‹€μŒ μž‘μ—… (이번 scope λ°–, 별도 sprint)

  1. agency_db (v1) DROP β€” starium_postgres restart λ˜λŠ” max_connections μ‘°μ •
  2. npm install (workspaces 전체 λ˜λŠ” apps/api-gateway만)
  3. nest build 검증 (TypeScript 컴파일)
  4. Docker μ•± μ»¨ν…Œμ΄λ„ˆ build + start
  5. PG 4-tier user 뢄리 (rw/ro/audit) 생성 + .env DATABASE_URL_RW 적용
  6. Multi-tenant Prisma middleware κ΅¬ν˜„ (μžλ™ where: { agencyId })
  7. Auth E2E (register β†’ login β†’ JWT decode)
  8. Agency CRUD E2E (SUPER_ADMIN 토큰 + CRUD 5개 μ—”λ“œν¬μΈνŠΈ)

5. S2-A μ•ˆμ „ 검증

ν•­λͺ© κ²°κ³Ό
νŠΈλ ˆμ΄λ”© 무쀑단 gunja-pair-hedge/multi-tenant/gate-pair-hedge/gate-admin λͺ¨λ‘ active μœ μ§€ βœ…
4μ„œλ²„ λ‹€λ₯Έ μ„œλΉ„μŠ€ 0 영ν–₯ (hospital PM2 24+ κ·ΈλŒ€λ‘œ) βœ…
starium_postgres agency_v2κ°€ 별도 μ»¨ν…Œμ΄λ„ˆ (5441) μ‚¬μš© β€” 영ν–₯ 0 βœ…
UFW / SSH / μž¬λΆ€νŒ… / 4μ„œλ²„ DB DROP 0 βœ…
격리본 21건 미접촉 (read만) βœ…
/opt/agency.scrapped-20260503/ chmod 000 κ·ΈλŒ€λ‘œ βœ…

6. κ²°λ‘ 

S2-A: 인프라 + μ½”λ“œ skeleton μ™„μ„±. S2-B: npm install + λΉŒλ“œ + μ»¨ν…Œμ΄λ„ˆ + E2E (별도 sprint μ‹ ν˜Έ λ˜λŠ” μžλ™ μ§„ν–‰ κ°€λŠ₯).

agency_db v1 DROP은 starium_postgres connection pool ν•œκ³„λ‘œ retry 40회 λͺ¨λ‘ fail β€” λ³Έ sprint ν•œμ • ν•œκ³„, 별도 starium_postgres 점검 sprint ν•„μš”. λ‹€λ§Œ agency_v2λŠ” 별도 dedicated DB μ‚¬μš©μœΌλ‘œ λ³Έ λΉ„μ¦ˆλ‹ˆμŠ€ 영ν–₯ 0.

β€” S2-A 보고 끝 β€”