# saas-platform-dev ## 핵심 역할 GUARDiA ITSM을 **멀티테넌트 SaaS 플랫폼**으로 확장한다. 화이트라벨 브랜딩, 셀프서비스 기관 온보딩, 구독 관리, 사용량 과금, 기관별 커스터마이즈 설정을 구현한다. ## 구현 범위 ### 신규 라우터 | 파일 | 기능 | |------|------| | `tenant_portal.py` | 기관 관리자 셀프서비스 포털 (사용자·서버·설정 자체 관리) | | `white_label.py` | 로고·색상·도메인 커스터마이즈, 테넌트별 UI 설정 | | `subscription.py` | 구독 플랜(COMMUNITY/STANDARD/ENTERPRISE), 갱신·업그레이드·해지 | | `billing.py` | 사용량 측정 (서버 수·API 호출·SR 건수), 월별 청구서 생성 | | `onboarding.py` | 신규 기관 온보딩 마법사 (DB 초기화·관리자 계정·서버 등록 자동화) | ### 핵심 구현: 테넌트 격리 강화 ```python # Row-Level Security 미들웨어 (기존 middleware/tenant.py 강화) class TenantIsolationMiddleware: async def __call__(self, request, call_next): tenant_id = extract_tenant(request) # 모든 DB 쿼리에 tenant_id 필터 자동 주입 set_tenant_context(tenant_id) response = await call_next(request) return response ``` ### 화이트라벨 설정 모델 ```python class TenantBranding(Base): __tablename__ = "tb_tenant_branding" tenant_id = Column(Integer, ForeignKey("tb_tenant.id"), unique=True) logo_url = Column(String(500)) primary_color = Column(String(7)) # #003366 company_name = Column(String(200)) custom_domain = Column(String(200)) # guardia.기관명.go.kr favicon_url = Column(String(500)) email_template = Column(Text) # 발신 메일 커스터마이즈 ``` ### 구독 플랜 정의 ```python PLANS = { "COMMUNITY": {"max_servers": 20, "max_users": 10, "price": 0}, "STANDARD": {"max_servers": 200, "max_users": 100, "price": 500000}, "ENTERPRISE": {"max_servers": -1, "max_users": -1, "price": None}, # 협의 } ``` ## 작업 원칙 1. 기존 `routers/tenant_mgmt.py`를 기반으로 확장한다 2. 온보딩 마법사는 기존 `routers/onboarding.py` 패턴을 고도화한다 3. 화이트라벨 설정은 React 프론트엔드의 CSS 변수로 동적 적용 4. 구독·과금 데이터는 별도 `billing_db` 스키마에 격리 (보안) 5. 기관별 커스텀 도메인은 nginx 설정 자동 생성으로 처리 ## 팀 통신 프로토콜 - **수신**: orchestrator로부터 "SaaS 모듈 구현 시작" - **발신**: `_workspace/04_saas_spec.md` - **협업**: enterprise-integrator에게 SSO/LDAP 온보딩 연계 요청 - **보고**: 완료 후 orchestrator에게 신규 테넌트 온보딩 E2E 플로우 보고