๋ณด๊ณ ID: agency-v2-s1-20260503 ์์ฑ์ผ: 2026-05-03 ์์ฑ์: Claude (์์ CEO ๊ถํ, AI ๊ด๋ฆฌ์) Sprint: S1 (ํ๊ธฐ + Plan + Skeleton) ์ํ: โ ์๋ฃ (1๊ฑด PENDING)
์ฌ์ฉ์(์ด๋ง์ฐ, CEO) ๋ฐ์:
| 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 ๋ก๋๋งต + ์์ฌ ๊ฒฐ์ ์ฌํญ |
| # | ํ์ผ | ํฌ๊ธฐ |
|---|---|---|
| 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) |
์์ฒด |
| # | ํ์ผ | ํ์ |
|---|---|---|
| 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 |
| # | ๊ฒฝ๋ก | ๋ด์ฉ |
|---|---|---|
| 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) |
| ํญ๋ชฉ | ๊ฒฐ๊ณผ |
|---|---|
| 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/ ๋ณด์กด (ํฌ๋ ์ ๊ฐ์น) |
...1T1s3d) โ DELETE ๊ถ์ฅ...1393f) โ DELETE ๊ถ์ฅ...fn) โ DELETE ๊ถ์ฅ...Wdp4) โ DELETE ๊ถ์ฅ...Tu7) โ DELETE ๊ถ์ฅโ ๋ชจ๋ ํดํน ์์ฐ์ผ๋ก ๊ฐ์ฃผ, ์ฌ๋ฐ๊ธ X ๋จ์ ํ๊ธฐ. v2 ์ํฌ๋ฆฟ์ S2 ์์ ์ ์๋ก ๋ฐ๊ธ.
์ฌ์ฉ์: "์๋น์ค ์คํ ์ ํ๋๋ฐ ์ ํดํน?" ๋ต: hospital ํธ์คํธ ์์ฒด ์นจ์ โ lateral movement โ /opt/agency์ sleeper trojan
๊ทผ๊ฑฐ (๋ฉ๋ชจ๋ฆฌ agency-never-ran-but-hacked-forensic-20260503.md ์ ๋ฆฌ):
persistence-3-13/ (3์ 13์ผ๋ถํฐ ์นจ์
) โ agency ๊ฐ๋ฐ ํ์ฐธ ์ ๋ถํฐ hospital ์นจํฌ/etc/ld.so.preload 04-16 18:07 Birth โ ํธ์คํธ root ๊ถํ ํ์ 7957/2460 ๋งค์นญ 0 = hospital ํ์ ์นจ์
โ agency ์์ฒด ์ฝ๋/์ค์ ๊ฒฐํจ ์๋, ํธ์คํธ OS / ๋ค๋ฅธ ์๋น์ค / SSH / ๊ณต๊ธ๋ง ์ด๋๊ฐ์ root cause๋ ๋ณ๋ sprint.
| ์์ญ | 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๋ง (์ต์ํ) |
Agency, User, Client, Campaign, Lead, Content, Invoice, Report, DailyMetric, CallTracking, TrackingPixel, UTMDefinition, Notification
AgencyStatus, UserRole, ClientStatus, CampaignStatus, LeadStatus, ContentType, ContentStatus, InvoiceStatus, ReportType, NotificationChannel, AIJobType, AIJobStatus, LeadCategory
/opt/agency-v2/| ํญ๋ชฉ | ๊ฒฐ๊ณผ |
|---|---|
| ํธ๋ ์ด๋ฉ ๋ฌด์ค๋จ (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 ์ํฅ |
/tmp/agency_db_drop.log ํ์ธ. 15๋ถ max retry.| 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 ์ฆ์ ์งํ.
โ 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 ๋ณด๊ณ ๋ โ