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

Agency v2 ์žฌ๊ตฌ์ถ• S1 sprint ๋ณด๊ณ 

๋ณด๊ณ  ID: agency-v2-s1-20260503 ์ž‘์„ฑ์ผ: 2026-05-03 ์ž‘์„ฑ์ž: Claude (์ž„์‹œ CEO ๊ถŒํ•œ, AI ๊ด€๋ฆฌ์ž) Sprint: S1 (ํ๊ธฐ + Plan + Skeleton) ์ƒํƒœ: โœ… ์™„๋ฃŒ (1๊ฑด PENDING)


1. ํŠธ๋ฆฌ๊ฑฐ

์‚ฌ์šฉ์ž(์ด๋งŒ์šฐ, CEO) ๋ฐœ์˜:

  1. ์ง์ „ health check์—์„œ hospital agency 3๊ฑด stopped ๋ฐœ๊ฒฌ
  2. ์ •๋ฐ€ ์ง„๋‹จ์œผ๋กœ 04-25 ์นจ์ž… ์‚ฌ๊ฑด์˜ ๊ฒฉ๋ฆฌ ์˜์—ญ์ž„ ํ™•์ธ
  3. ์‚ฌ์šฉ์ž ๊ฒฐ์ •: Option A ๋น„์ฆˆ๋‹ˆ์Šค ์žฌ๊ฐœ (์žฌ๊ตฌ์ถ•) + ์ž„์‹œ CEO ๊ถŒํ•œ ์œ„์ž„ + /sprint ์‚ฌ์šฉ + ๋ณ‘๋ ฌ + "AI ์ž๋™ ์—…๋ฌด ์‹คํ–‰ ํšŒ์‚ฌ"
  4. ์‚ฌ์šฉ์ž ์˜๋ฌธ ์ •์ •: "์„œ๋น„์Šค ์‹คํ–‰ ์•ˆ ํ–ˆ๋Š”๋ฐ ์™œ ํ•ดํ‚น?" โ†’ lateral movement ๊ฐ€์„ค (์‚ฌ์šฉ์ž ์ฑ…์ž„ 0)

2. Sprint 7๋‹จ๊ณ„ ๊ฒฐ๊ณผ

Phase ๊ฒฐ๊ณผ
Think โœ… forensic ๊ฐ€์„ค ์ •์ • + CEO ๊ฒฐ์ • 7๊ฑด ์ž์œจ
Plan โœ… ๋น„์ฆˆ๋‹ˆ์Šค spec + ๋ณด์•ˆ spec (paperclip ์ •๋ณธ + hospital sync)
Build โœ… v1 ํ๊ธฐ + ์ž์‚ฐ ๋ณด์กด + monorepo skeleton + Prisma schema
Review โœ… ๋ชจ๋ธ ์นด์šดํŠธ 20 + ์‚ฐ์ถœ๋ฌผ ๊ฒ€์ฆ
Test โœ… ํŠธ๋ ˆ์ด๋”ฉ/4์„œ๋ฒ„ ๋ฌด์ค‘๋‹จ ๊ฒ€์ฆ
Ship โœ… mco-bot ์•Œ๋ฆผ + ๋ฉ”๋ชจ๋ฆฌ + ๋ณธ ๋ณด๊ณ ์„œ
Retro โœ… S2~S8 ๋กœ๋“œ๋งต + ์ž”์—ฌ ๊ฒฐ์ • ์‚ฌํ•ญ

3. ์‚ฐ์ถœ๋ฌผ ๋งคํŠธ๋ฆญ์Šค

3-1. ๋ฌธ์„œ (paperclip ์ •๋ณธ)

# ํŒŒ์ผ ํฌ๊ธฐ
1 /opt/star365-hq/docs/01-plan/agency-v2-rebuild-spec-20260503.md 16.7 KB
2 /opt/star365-hq/docs/01-plan/agency-v2-security-hardening-20260503.md 9.5 KB
3 ๋ณธ ๋ณด๊ณ ์„œ (/opt/star365-hq/docs/04-report/agency-v2-s1-20260503.report.md) ์ž์ฒด

3-2. ๋ฉ”๋ชจ๋ฆฌ (paperclip)

# ํŒŒ์ผ ํƒ€์ž…
1 agency-never-ran-but-hacked-forensic-20260503.md project (forensic ๊ฐ€์„ค)
2 agency-v2-rebuild-s1-20260503.md project (S1 sprint ๊ฒฐ๊ณผ)
3 MEMORY.md ์ธ๋ฑ์Šค ๊ฐฑ์‹  index

3-3. Hospital ์‚ฐ์ถœ๋ฌผ

# ๊ฒฝ๋กœ ๋‚ด์šฉ
1 /opt/agency-v2/ ์‹ ๊ทœ monorepo root
2 /opt/agency-v2/package.json turbo + workspaces ์„ค์ •
3 /opt/agency-v2/turbo.json turbo ๋นŒ๋“œ config
4 /opt/agency-v2/.gitignore secret/build ์ œ์™ธ
5 /opt/agency-v2/.env.example ์‹œํฌ๋ฆฟ inventory (ํ‰๋ฌธ X)
6 /opt/agency-v2/README.md ์ง„ํ–‰ ์ƒํƒœ + ์•ˆ์ „ ๋ฃฐ
7 /opt/agency-v2/packages/database/prisma/schema.prisma 20 ๋ชจ๋ธ + 13 enum
8 /opt/agency-v2/packages/database/package.json Prisma ํŒจํ‚ค์ง€
9 /opt/agency-v2/infrastructure/docker/docker-compose.yml 6 service template (postgres/redis/minio/api/web/bot, dedicated network + cap_drop ALL)
10 /opt/agency-v2/docs/01-plan/agency-v2-rebuild-spec-20260503.md ์ •๋ณธ sync
11 /opt/agency-v2/docs/01-plan/agency-v2-security-hardening-20260503.md ์ •๋ณธ sync
12 /opt/agency-v2/docs-archive-from-v1/ v1 ์ž์‚ฐ 9 .md ๋ณด์กด (multi-tenant + ai-automation + sample-data)

4. ํ๊ธฐ ๊ฒฐ๊ณผ (Phase 1+3)

ํ•ญ๋ชฉ ๊ฒฐ๊ณผ
PM2 agency-api/agency-web โœ… delete + save (์ž”์กด 0)
/opt/agency โœ… โ†’ /opt/agency.scrapped-20260503/ (chmod 000 ๋ด‰์ธ)
starium_postgres agency_db โณ retry ๋ฐฑ๊ทธ๋ผ์šด๋“œ 30ํšŒ (PG connection pool ์ผ์‹œ ๊ฐ€๋“). ์ž๋™ ์ฒ˜๋ฆฌ, ๊ฒฐ๊ณผ /tmp/agency_db_drop.log
agency_user PG user โณ DROP ๋™์‹œ ์ง„ํ–‰
nginx vhost โœ… ํ”์  0 (์ด๋ฏธ ์ •๋ฆฌ๋จ, sites-enabled/available ํ™•์ธ)
Redis 6390 / MinIO 9050 N/A (์‹ค ์ธ์Šคํ„ด์Šค ๋ฏธ์กด์žฌ โ€” ์‚ฌ์šฉ์ž ์ง„์ˆ  ์ผ์น˜)
๊ฒฉ๋ฆฌ๋ณธ 21๊ฑด โœ… /root/incident-quarantine/2026-04-25/ ๋ณด์กด (ํฌ๋ Œ์‹ ๊ฐ€์น˜)

Phase 2 (์‚ฌ์šฉ์ž ์™ธ๋ถ€ ์ฝ˜์†” ์•ก์…˜, ์‚ฌ์šฉ์ž ์ง์ ‘)

โ†’ ๋ชจ๋‘ ํ•ดํ‚น ์ž์‚ฐ์œผ๋กœ ๊ฐ„์ฃผ, ์žฌ๋ฐœ๊ธ‰ X ๋‹จ์ˆœ ํ๊ธฐ. v2 ์‹œํฌ๋ฆฟ์€ S2 ์‹œ์ž‘ ์‹œ ์ƒˆ๋กœ ๋ฐœ๊ธ‰.


5. v1 ํ๊ธฐ ๊ฐ€์„ค ์ •์ • (์‚ฌ์šฉ์ž ์ฑ…์ž„ 0)

์‚ฌ์šฉ์ž: "์„œ๋น„์Šค ์‹คํ–‰ ์•ˆ ํ–ˆ๋Š”๋ฐ ์™œ ํ•ดํ‚น?" ๋‹ต: hospital ํ˜ธ์ŠคํŠธ ์ž์ฒด ์นจ์ž… โ†’ lateral movement โ†’ /opt/agency์— sleeper trojan

๊ทผ๊ฑฐ (๋ฉ”๋ชจ๋ฆฌ agency-never-ran-but-hacked-forensic-20260503.md ์ •๋ฆฌ):

โ†’ agency ์ž์ฒด ์ฝ”๋“œ/์„ค์ • ๊ฒฐํ•จ ์•„๋‹˜, ํ˜ธ์ŠคํŠธ OS / ๋‹ค๋ฅธ ์„œ๋น„์Šค / SSH / ๊ณต๊ธ‰๋ง ์–ด๋”˜๊ฐ€์˜ root cause๋Š” ๋ณ„๋„ sprint.


6. v2 ์ฐจ๋ณ„ํ™” (vs v1)

์˜์—ญ v1 v2
๋ณด์•ˆ ecosystem.config.js ํ‰๋ฌธ ์‹œํฌ๋ฆฟ, ํ˜ธ์ŠคํŠธ ์ง์ ‘ PM2 KMS/Vault Phase 2, Docker ๊ฒฉ๋ฆฌ, npm audit CI, sha256 manifest, hospital-tamper-watch path 11๊ฐœ
AI 0% (๊ณ„ํš๋งŒ) v1=2๊ฐœ ํ•„์ˆ˜ (๋ฆฌ๋“œ ์Šค์ฝ”์–ด๋ง + ๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘), ์ ์ง„ 5๊ฐœ
์ฝ”๋“œ ์‹ ๋ขฐ ๋ณ€์กฐ ๊ฐ€๋Šฅ์„ฑ sha256 manifest ์ž๋™ + ๋งค startup ๊ฒ€์ฆ
๊ฒฉ๋ฆฌ ํ˜ธ์ŠคํŠธ PM2 Docker container + dedicated network + cap_drop ALL + read_only fs
๋นŒ๋“œ ํ˜ธ์ŠคํŠธ ์ง์ ‘ npm install Build server ๋ถ„๋ฆฌ (Phase 1: paperclip, Phase 2: GitHub Actions)
์‹œํฌ๋ฆฟ ํ‰๋ฌธ commit git ignore + sops/age (Phase 2)
OAuth scope ๊ด‘๋ฒ”์œ„ openid email๋งŒ (์ตœ์†Œํ™”)

7. Prisma Schema 20 ๋ชจ๋ธ + 13 Enum

13 v1 ๋ชจ๋ธ (DB ์Šคํ‚ค๋งˆ ์ฒญ์‚ฌ์ง„ ๊ทธ๋Œ€๋กœ)

Agency, User, Client, Campaign, Lead, Content, Invoice, Report, DailyMetric, CallTracking, TrackingPixel, UTMDefinition, Notification

7 v2 ์‹ ๊ทœ ๋ชจ๋ธ

13 Enum

AgencyStatus, UserRole, ClientStatus, CampaignStatus, LeadStatus, ContentType, ContentStatus, InvoiceStatus, ReportType, NotificationChannel, AIJobType, AIJobStatus, LeadCategory


8. ๋ณด์•ˆ 11 Layer (๋ณ„๋„ spec ์ฐธ์กฐ)

  1. ld.so.preload immutable + tamper-watch 11 path ์ถ”๊ฐ€
  2. SSH key-only + IP allowlist + fail2ban (๋ณ„๋„ sprint)
  3. Docker ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ (ํ˜ธ์ŠคํŠธ ์นจ์ž… ์‹œ ๊ฒฉ๋ฆฌ)
  4. npm audit CI + lockfile ๋ฌด๊ฒฐ์„ฑ + sha256 manifest
  5. DB user 4-tier ๋ถ„๋ฆฌ (super/rw/ro/audit)
  6. ์‹œํฌ๋ฆฟ KMS/Vault (Phase 1: .env 0600, Phase 2: sops+age)
  7. nginx WAF (rate limit, security headers, ์˜์‹ฌ UA ์ฐจ๋‹จ)
  8. auditd ๋ฃฐ + ์ผ๋ณ„ aureport
  9. OAuth scope ์ตœ์†Œํ™”
  10. Build server ๋ถ„๋ฆฌ
  11. 5๋ถ„ cron health monitor + sha256 verify

9. ์ž„์‹œ CEO ๊ฒฐ์ • 7๊ฑด

  1. agency_db DROP (์ด์ „ ๋ฐ์ดํ„ฐ 0 ํ™•์ธ)
  2. ๋„๋ฉ”์ธ agency.starium.site ์žฌ์‚ฌ์šฉ
  3. ์ ์ง„ ์ถœ์‹œ (S1S8, ์•ฝ 45์ฃผ)
  4. AI v1 = ๋ฆฌ๋“œ ์Šค์ฝ”์–ด๋ง + ๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘ 2๊ฐœ
  5. ๋ณด์•ˆ hardening ์ฒ˜์Œ๋ถ€ํ„ฐ
  6. ์œ„์น˜ /opt/agency-v2/
  7. Docker ๊ฒฉ๋ฆฌ + KMS/Vault Phase 2

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

ํ•ญ๋ชฉ ๊ฒฐ๊ณผ
ํŠธ๋ ˆ์ด๋”ฉ ๋ฌด์ค‘๋‹จ (gunja-pair-hedgeร—2 + gate-pair-hedge) โœ… active ์œ ์ง€, uptime ๊ทธ๋Œ€๋กœ
4์„œ๋ฒ„ ๋‹ค๋ฅธ ์„œ๋น„์Šค โœ… 0 ์˜ํ–ฅ (kahan systemd 19/19 + PM2 5/5, hospital PM2 24/27 ๊ทธ๋Œ€๋กœ โ€” agency 3๊ฐœ๋งŒ ์ •๋ฆฌ๋จ)
UFW / SSH / DB DROP / ์žฌ๋ถ€ํŒ… โœ… 0
๊ฒฉ๋ฆฌ๋ณธ ๋ฏธ์ ‘์ด‰ โœ… 21๊ฑด ๊ทธ๋Œ€๋กœ ๋ณด์กด
/opt/agency.scrapped-20260503/ โœ… chmod 000 ๋ด‰์ธ
Stage8 / Gate V7 / paperclip โœ… 0 ์˜ํ–ฅ

11. PENDING ํ•ญ๋ชฉ (S2 ์‹œ์ž‘ ์‹œ ํ•ด๊ฒฐ)

  1. agency_db DROP โ€” PG connection pool ์ผ์‹œ ๊ฐ€๋“, retry ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž๋™ ์ฒ˜๋ฆฌ. ๊ฒฐ๊ณผ /tmp/agency_db_drop.log ํ™•์ธ. 15๋ถ„ max retry.
  2. Phase 2 ์‚ฌ์šฉ์ž ์™ธ๋ถ€ ์•ก์…˜ โ€” Google/Kakao/Naver/Gemini/Groq 5๊ฐœ ์ฝ˜์†”์—์„œ v1 ์‹œํฌ๋ฆฟ DELETE
  3. fail2ban ์„ค์น˜ (gate/stage8 ๋ฏธ์„ค์น˜) โ€” ๋ณ„๋„ sprint
  4. hospital ํ˜ธ์ŠคํŠธ ์นจ์ž… root cause (persistence-3-13 ์ •๋ฐ€ forensic) โ€” ๋ณ„๋„ sprint scope

12. S2~S8 ๋กœ๋“œ๋งต

Sprint ์‚ฐ์ถœ๋ฌผ ๊ธฐ๊ฐ„
S2 Docker compose ๊ฐ€๋™ + Prisma migrate + Auth + Agency CRUD 1์ฃผ
S3 clients/staff/campaigns/leads/content + ๋ฆฌ๋“œ ์Šค์ฝ”์–ด๋ง AI 1์ฃผ
S4 analytics/reports/billing/integrations/notifications + ๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘ AI 1์ฃผ
S5 Web (Next.js) + i18n + OAuth UI 1์ฃผ
S6 E2E + ๋ณด์•ˆ audit (Playwright + npm audit + sha256) 3์ผ
S7 ๋ฒ ํƒ€ (1~2 ์—์ด์ „์‹œ) 2์ผ
S8 ๋ผ์ด๋ธŒ GA + ๊ณต์ง€ 2์ผ

โ†’ ์ด 4~5์ฃผ ์˜ˆ์ƒ. ์‚ฌ์šฉ์ž ์‹ ํ˜ธ ๋ฐ›์œผ๋ฉด S2 ์ฆ‰์‹œ ์ง„ํ–‰.


13. ๊ฒฐ๋ก 

โœ… S1 sprint ์™„๋ฃŒ. v1 ํ๊ธฐ + ์ž์‚ฐ ๋ณด์กด + ๋น„์ฆˆ๋‹ˆ์Šค/๋ณด์•ˆ spec ์ž‘์„ฑ + monorepo skeleton (20 ๋ชจ๋ธ Prisma schema ํฌํ•จ) ๋ชจ๋‘ ์™„์„ฑ.

โณ agency_db DROP๋งŒ PG connection pool ์ผ์‹œ ๊ฐ€๋“์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ retry โ€” ์ž๋™ ์ฒ˜๋ฆฌ, ์˜ํ–ฅ 0.

๐ŸŸข GO for S2: ์‚ฌ์šฉ์ž ์‹ ํ˜ธ ๋ฐ›์œผ๋ฉด Docker compose ๊ฐ€๋™ + Auth ๋ชจ๋“ˆ ๊ตฌํ˜„ ์‹œ์ž‘ ๊ฐ€๋Šฅ.

โ€” S1 sprint ๋ณด๊ณ  ๋ โ€”