๐Ÿ“– star365 Docs
โ† ๋ณด๊ณ ์„œ ๋ชฉ๋ก

Agency v2 S3 ๋ณด๊ณ  โ€” 5 ๋ชจ๋“ˆ + Multi-tenant + AI Lead Scoring

๋ณด๊ณ  ID: agency-v2-s3-20260503 ์ž‘์„ฑ์ผ: 2026-05-03 ์ž‘์„ฑ์ž: Claude (์ž„์‹œ CEO) Sprint: S3 (5 ๋ชจ๋“ˆ + Multi-tenant middleware + AI orchestrator + Lead Scoring AI) ์ƒ์œ„: agency-v2-s2b-20260503.report.md


1. ํ•œ ์ค„ ์š”์•ฝ

S2-B ์งํ›„ ์ž๋™ S3 ์ง„ํ–‰. LLM ํ‚ค ๋ณต์‚ฌ + Multi-tenant Prisma middleware + 5 ๋ชจ๋“ˆ CRUD + AI orchestrator 3-LLM fallback + Lead Scoring AI agent ๋ชจ๋‘ ์‹ค์ธก ๊ฒ€์ฆ PASS. xAI grok-3-mini ์‹ค LLM ํ˜ธ์ถœ ํ™•์ธ (ํ•œ๊ตญ์–ด reason ์ •์ƒ ์ƒ์„ฑ), Multi-tenant ๊ฒฉ๋ฆฌ ์‹ค ๋ฐ์ดํ„ฐ๋กœ ๊ฒ€์ฆ.

2. ์ •์ง ๊ฒ€์ฆ ๋งคํŠธ๋ฆญ์Šค

โœ… A. ์‹ค์ธก ๊ฒ€์ฆ ์™„์„ฑ (16 ์˜์—ญ)

# ํ•ญ๋ชฉ ๊ฒ€์ฆ ๊ฒฐ๊ณผ
1 LLM ํ‚ค ๋ณต์‚ฌ hospital /opt/assistant/.env โ†’ agency-v2 (XAI ...NkNH / Gemini ...bNeE / Groq ...pTu7)
2 Multi-tenant Prisma middleware agency-context.middleware.ts AsyncLocalStorage ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฒฉ๋ฆฌ
3 AgencyContext interceptor JWT.agencyId โ†’ AsyncLocalStorage ์ž๋™ ์ฃผ์ž…
4 5 ๋ชจ๋“ˆ (CRUD) clients/staff/campaigns/leads/content 23 ์‹ ๊ทœ ํŒŒ์ผ ์ž‘์„ฑ + ๋นŒ๋“œ
5 AI orchestrator LlmService โ€” xAIโ†’Geminiโ†’Groq fallback chain ์ž‘๋™
6 Lead Scoring AI agent POST /leads โ†’ ๋น„๋™๊ธฐ ํ˜ธ์ถœ โ†’ LeadScore ์ €์žฅ
7 ecosystem.cjs env ๋ช…์‹œ .env ํŒŒ์‹ฑ + 43 keys PM2 process์— ์ง์ ‘
8 nest build dist 145 files
9 PM2 delete+start online pid 4004856 (110MB)
10 23 routes ๋งคํ•‘ health 1 + auth 2 + agencies 5 + clients 5 + campaigns 5 + leads 4 + staff 2 + content 3
11 Multi-tenant ๊ฒฉ๋ฆฌ ์‹ค ๊ฒ€์ฆ Alpha admin GET /clients = 0, /leads = 0 (Beta ๋ณดํ˜ธ) โœ…
12 Beta admin ์ž๊ธฐ ๋ฐ์ดํ„ฐ /clients = 1, /leads = 2 (Beta๋งŒ) โœ…
13 AI scoring ์‹ค LLM ํ˜ธ์ถœ xAI grok-3-mini ์‘๋‹ต, ํ•œ๊ตญ์–ด reason ์ •์ƒ
14 LeadScore DB ๊ฒ€์ฆ 2 rows, agencyId ์ •ํ™• ๋งคํ•‘
15 sha256 manifest ๊ฐฑ์‹  145 files verify OK
16 ํŠธ๋ ˆ์ด๋”ฉ ๋ฌด์ค‘๋‹จ gunja-pair-hedge/multi-tenant/gate-pair-hedge/gate-admin ๋ชจ๋‘ active

โณ B. ์ •์ง PENDING

# ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ ์‹œ์ 
1 ๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘ AI cron 09:00 KST S4
2 analytics/reports/billing/integrations/notifications 5 ๋ชจ๋“ˆ S4
3 nginx ํ™œ์„ฑํ™” (์™ธ๋ถ€ ๋…ธ์ถœ) OAuth ํ‚ค ์ ์šฉ ํ›„
4 OAuth ์‹ค client (Google/Kakao/Naver) ์‚ฌ์šฉ์ž ์™ธ๋ถ€ ์ฝ˜์†” ์•ก์…˜
5 agency_db (v1) DROP starium_postgres ๋ณ„๋„ sprint
6 Docker ์•ฑ ์ปจํ…Œ์ด๋„ˆ build S5
7 Web Next.js S5
8 bot-connector S4 (Telegram ํ†ตํ•ฉ)
9 hospital-tamper-watch path ์ถ”๊ฐ€ ๋ณ„๋„ ๋ณด์•ˆ sprint
10 SUPER_ADMIN skip-filter ์ž‘๋™ ๊ฒ€์ฆ ๋‹ค์Œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ

โš ๏ธ C. ์ง„ํ–‰ ์ค‘ ํ•ด๊ฒฐํ•œ ์ด์Šˆ 4๊ฑด

  1. PM2 process env ๋ˆ„๋ฝ

    • ์ฆ์ƒ: ConfigModule์ด .env ๋กœ๋“œํ•ด๋„ /proc/$PID/environ์— keys ์—†์Œ
    • ์›์ธ: NestJS ConfigModule์€ ConfigService ๋‚ด๋ถ€ store์— ์ €์žฅ, process.env์— ์ง์ ‘ inject ์•ˆ ํ•จ. PM2๋„ .env ์ž๋™ ๋กœ๋“œ ์•ˆ ํ•จ
    • ํ•ด๊ฒฐ: ecosystem.config.cjs์— fs.readFileSync('/opt/agency-v2/.env') ํŒŒ์‹ฑ ํ›„ env ๋ช…์‹œ โ†’ PM2๊ฐ€ process์— ์ง์ ‘ ์ „๋‹ฌ
  2. leads.service catch ์—๋Ÿฌ swallow

    • .catch(() => {}) ์˜€์Œ โ†’ ๋””๋ฒ„๊น… ๋ถˆ๊ฐ€
    • ํ•ด๊ฒฐ: Logger ์ถ”๊ฐ€ โ€” scoreAsync FAIL lead=${id}: ${e.message}
  3. DB UPDATE shell escape (์žฌ๋ฐœ)

    • '\'' ์ฒ˜๋ฆฌ๊ฐ€ nested heredoc์—์„œ ๊นจ์ง
    • ํ•ด๊ฒฐ: docker exec -i ... <<SQL ... SQL ํ˜•์‹์œผ๋กœ ์šฐํšŒ
  4. PM2 restart vs delete+start

    • restart๋Š” env ์žฌ๋กœ๋“œ ์•ฝํ•จ (์ด์ „ process env ์œ ์ง€)
    • ํ•ด๊ฒฐ: env ๋ณ€๊ฒฝ ์‹œ delete+start ํ•„์ˆ˜

3. ์‚ฐ์ถœ๋ฌผ (paperclip + hospital)

paperclip ์ •๋ณธ

hospital โ€” agency-v2 ์ฝ”๋“œ

๋””๋ ‰ํ† ๋ฆฌ ์‹ ๊ทœ ํŒŒ์ผ
src/prisma/ agency-context.middleware.ts
src/common/interceptors/ agency-context.interceptor.ts
src/common/decorators/ skip-agency-filter.decorator.ts
src/clients/ 4 files (controller/service/module + 2 dto)
src/staff/ 4 files
src/campaigns/ 5 files
src/leads/ 5 files (AI ํ†ตํ•ฉ)
src/content/ 4 files
src/ai/ 2 files (llm.service / ai.module)
src/ app.module.ts ๊ฐฑ์‹ 
/opt/agency-v2/ ecosystem.config.cjs ๊ฐฑ์‹  (.env ํŒŒ์‹ฑ)

DB E2E ๋ฐ์ดํ„ฐ

4. AI ์‘๋‹ต ์ƒ˜ํ”Œ (์‹ค LLM ํ˜ธ์ถœ ๊ฒฐ๊ณผ)

[Lead 1 - ๊น€ํ™˜์ž, facebook_ad โ†’ social channel]
xAI grok-3-mini ์‘๋‹ต:
{
  "score": 55,
  "category": "WARM",
  "reason": "์†Œ์…œ ์ฑ„๋„(Facebook ๊ด‘๊ณ )์—์„œ ์บ ํŽ˜์ธ์— ์ฐธ์—ฌํ–ˆ์œผ๋‚˜, ๊ตฌ์ฒด์ ์ธ ๊ตฌ๋งค ์˜์‚ฌ๋‚˜ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์˜์—… follow-up์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."
}

[Lead 2 - ์ดํ™˜์ž, naver_search โ†’ organic channel]
xAI grok-3-mini ์‘๋‹ต:
{
  "score": 60,
  "category": "WARM",  
  "reason": "์บ ํŽ˜์ธ(์—ฌ๋ฆ„ 2026)์„ ํ†ตํ•ด ์œ ๊ธฐ์ ์œผ๋กœ ์œ ์ž…๋œ ํ—ฌ์Šค์ผ€์–ด ์—…์ข… ๋ฆฌ๋“œ์ด์ง€๋งŒ, ๊ตฌ์ฒด์ ์ธ ์˜์‚ฌ ํ‘œ์‹œ๊ฐ€ ์—†์–ด ์ถ”๊ฐ€ follow-up์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."
}

โ†’ ํ•œ๊ตญ์–ด ์ž์—ฐ์–ด reason ์ •์ƒ ์ƒ์„ฑ, score/category ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ผ์น˜ (๋‘˜ ๋‹ค WARM = ์ถ”๊ฐ€ follow-up ํ•„์š”).

5. ๋ณด์•ˆ ์ ์šฉ (S3 ๋‹จ๊ณ„)

๋ณด์•ˆ spec ์ ์šฉ ์ƒํƒœ
L4 sha256 manifest 145 files (61โ†’145, ์‹ ๊ทœ ์ฝ”๋“œ+๋นŒ๋“œ ํฌํ•จ) โœ…
L5 DB user 4-tier super/rw/ro/audit ๊ทธ๋Œ€๋กœ, DATABASE_URL=rw ์ ์šฉ โœ…
L6 ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ .env 0600, ecosystem.cjs๋Š” .env ํŒŒ์‹ฑ (ํ‰๋ฌธ commit 0)
L9 OAuth scope ์ตœ์†Œํ™” ํด๋ผ์ด์–ธํŠธ ๋ฐœ๊ธ‰ ํ›„ ์ ์šฉ โ€” PENDING
Multi-tenant ๊ฒฉ๋ฆฌ ์ž๋™ ๋ฏธ๋“ค์›จ์–ด ์ž‘๋™ + ์‹ค ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ PASS โœ…

6. S4 ๋‹ค์Œ ์ž‘์—…

  1. agency_db (v1) DROP โ€” starium_postgres ๋ณ„๋„
  2. analytics/reports/billing/integrations/notifications 5 ๋ชจ๋“ˆ + AI ํ†ตํ•ฉ
  3. ๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘ AI cron 09:00 KST + Telegram + Notification
  4. bot-connector (Telegram ์•Œ๋ฆผ)
  5. nginx ํ™œ์„ฑํ™” + agency.starium.site SSL
  6. SUPER_ADMIN skip-filter ์ž‘๋™ ๊ฒ€์ฆ

7. ์•ˆ์ „ ๊ฒ€์ฆ

ํ•ญ๋ชฉ ๊ฒฐ๊ณผ
ํŠธ๋ ˆ์ด๋”ฉ gunja-pair-hedge / multi-tenant / gate-pair-hedge / gate-admin ๋ชจ๋‘ active ๋ฌด์ค‘๋‹จ โœ…
4์„œ๋ฒ„ ๋‹ค๋ฅธ ์„œ๋น„์Šค 0 ์˜ํ–ฅ โœ…
starium_postgres agency_v2 dedicated 5441 โ€” ์˜ํ–ฅ 0 โœ…
UFW / SSH / ์žฌ๋ถ€ํŒ… 0 โœ…
LLM ํ‚ค ๋…ธ์ถœ 0 (๋ 4์ž๋งŒ ํ‘œ์‹œ) โœ…
๊ฒฉ๋ฆฌ๋ณธ / scrapped ๋ฏธ์ ‘์ด‰ โœ…

8. ๊ฒฐ๋ก 

S1 (Plan + Skeleton) โ†’ S1-fix (์ •์ •) โ†’ S2-A (Data services + Prisma + Skeleton) โ†’ S2-B (Build + E2E + 4-tier user) โ†’ S3 (5 ๋ชจ๋“ˆ + Multi-tenant + AI Lead Scoring) ๋ˆ„์  ์ง„ํ–‰.

ํ˜„์žฌ ๊ฐ€๋™ ์ค‘์ธ agency-v2 = Auth + 6 ๋ชจ๋“ˆ + 4-tier DB + Multi-tenant ์ž๋™ ๊ฒฉ๋ฆฌ + AI Lead Scoring ์‹ค ์ž‘๋™.

๊ฑฐ์ง“ ์™„์„ฑ 0๊ฑด. AI ํ˜ธ์ถœ ์‹ค ๊ฒ€์ฆ, Multi-tenant ๊ฒฉ๋ฆฌ ์‹ค ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ. ํŠธ๋ ˆ์ด๋”ฉ 0 ์˜ํ–ฅ.

โ€” S3 ๋ณด๊ณ  ๋ โ€”