λ³΄κ³ ID: agency-v2-s2a-20260503 μμ±μΌ: 2026-05-03 μμ±μ: Claude (μμ CEO) Sprint: S2-A (data services κ°λ + Prisma migrate + NestJS skeleton)
S1 sprint + S1-fix μ§ν μλ S2 μ§ν. agency_v2 dedicated Docker stack κ°λ + Prisma 20 ν μ΄λΈ μμ± + NestJS api-gateway 24 νμΌ μμ± μλ£. λΉλ/μ€ν κ²μ¦μ S2-B (npm install μκ° λ³λ).
| νλͺ© | κ²μ¦ κ²°κ³Ό |
|---|---|
| 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 |
| νλͺ© | μ¬μ |
|---|---|
| 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 μμ |
.env + compose μΌκ΄ sed κ°±μ enum X { A B C } νμ€ νμ λ―ΈμΈμ β Python regexλ‘ multi-line λ³ν (enum X {\n A\n B\n})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
infrastructure/docker/
βββ docker-compose.yml β S2-A λͺ¨λ (data only, app μ£Όμ)
βββ data/postgres/ β PG persistent volume
βββ data/redis/ β Redis persistent
βββ data/minio/ β MinIO bucket storage
packages/database/prisma/schema.prisma (410 lines, 20 model + 13 enum)packages/database/node_modules/@prisma/client/ generated~/.claude/projects/-opt/memory/agency-v2-s2a-data-services-20260503.mdnpm install (workspaces μ 체 λλ apps/api-gatewayλ§)nest build κ²μ¦ (TypeScript μ»΄νμΌ)where: { agencyId })| νλͺ© | κ²°κ³Ό |
|---|---|
| νΈλ μ΄λ© 무μ€λ¨ | 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 | κ·Έλλ‘ β |
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 λ³΄κ³ λ β