아키텍처
이 페이지는 TRUSCA가 내부적으로 어떻게 연결되어 있는지 설명합니다. 포털을 확장하거나 기존 플랫폼에 통합하거나 사내 아키텍처 리뷰에 비교하려고 한다면 여기서 시작하세요.
대상 독자
아키텍트, 플랫폼 엔지니어, 보안 리뷰어. FastAPI, PostgreSQL, Celery, Docker에 익숙해야 합니다.
서비스
프로덕션 스택은 7개의 컨테이너 서비스를 실행합니다.
| 서비스 | 이미지 | 역할 |
|---|---|---|
traefik | traefik:v3.2.1 | 엣지 프록시. Let's Encrypt HTTP-01로 TLS 종료. HTTP→HTTPS 리다이렉트. |
postgres | postgres:17.2-alpine | 주 저장소. 모든 영구 상태. |
redis | redis:7.4-alpine | Celery 브로커 + 결과 백엔드. WebSocket pub/sub. |
backend | trustedoss/trusca-backend:<tag> | FastAPI + uvicorn(4 workers). Traefik이 /api, /health로 라우팅. |
worker | trustedoss/trusca-backend-worker:<tag> | cdxgen, scancode, Trivy, JRE가 번들된 Celery worker(JRE는 cdxgen의 Maven / Gradle SBOM 열거용). 워커는 /var/lib/trivy에 로컬 Trivy DB도 보관합니다. |
beat | trustedoss/trusca-backend-worker:<tag> | Celery Beat 스케줄러. Trivy DB refresh(주간), 취약점 재매칭(refresh 후), 백업(매일). |
frontend | trustedoss/trusca-frontend:<tag> | Vite 빌드를 nginx로 서비스. Traefik이 /로 라우팅. |
이미지 태그는 핀되어 있습니다(CLAUDE.md 규칙 #9 — :latest 절대 금지).
v0.10.0에서 Dependency-Track 제거
이전 릴리스는 Dependency-Track을 선택적 8번째 서비스로 제공했습니다. v0.10.0은 Trivy를 단일 취 약점 엔진으로 채택하면서 DT를 제거했습니다 — ADR-0001과 v0.10.0 릴리스 노트 참조. Trivy DB는 워커 컨테이너 내부에 존재하며, 별도의 취약점 엔진 서비스는 없습니다.
노트
이번 릴리스에는 백엔드 /metrics 핸들러가 마운트되어 있지 않으므로, /metrics는 Traefik 레벨(docker-compose.yml)에서도 라우팅하지 않습니다. Prometheus exporter와 해당 라우트는 GA 이후 로드맵 항목입니다.
네트워크
호스트에 포트를 노출하는 것은 traefik(80, 443)뿐입니다. 다른 모든 서비스는 compose 네트워크 내부에서만 접근 가능합니다.
데이터 레이아웃
PostgreSQL이 단일 진실 저장소입니다. 주요 테이블:
| 테이블 | 용도 |
|---|---|
users, teams, team_memberships | 신원 + RBAC. |
api_keys | 서비스 계정 자격증명(bcrypt 해시). |
projects | 프로젝트당 한 행. 스캔·컴포넌트·발견을 소유. |
scans | 스캔 라이프사이클 레코드(queued → terminal). |
components, component_licenses | 스캔별 SBOM 행 + 라이선스 귀속. |
vulnerability_findings | VEX 상태, justification, Trivy 제공 fixed-version 메타데이터 포함 CVE. |
obligations, obligation_kinds | 컴포넌트별 라이선스 의무사항. |
approvals | 조건부 라이선스 승인 워크플로. |
audit_log | 추가 전용 쓰기 이력. CHECK 제약으로 immutable. |
webhook_deliveries | 멱등성을 위한 (source, delivery_id). |
notifications | 아웃바운드 알림 로그 + dedup 키. |
backups | 백업 manifest 이력(애플리케이션은 read-only). |
마이그레이션은 forward-only Alembic. 스키마와 데이터 마이그레이션은 별도 revision에 분리됩니다.