멀티 프로젝트 구조
📝 초안 (Draft)
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
Multi-SaaS Kit은 하나의 코드베이스에서 여러 SaaS 프로젝트를 관리하는 구조를 제공합니다.
핵심 개념
왜 멀티 프로젝트인가?
SaaS 플랫폼을 운영하다 보면 다양한 고객사나 비즈니스 도메인을 위한 별도 프로젝트가 필요합니다.
| 상황 | 예시 |
|---|---|
| 다른 고객사 | A사용 SaaS, B사용 SaaS |
| 다른 도메인 | 교육용, 의료용, 금융용 |
| 다른 환경 | 개발용, 스테이징, 프로덕션 |
| 특수 목적 | 문서 사이트, 관리 도구 |
Multi-SaaS Kit은 이러한 여러 프로젝트를 단일 리포지토리에서 관리하면서도 완전한 독립성을 보장합니다.
3가지 핵심 원칙
| 원칙 | 설명 |
|---|---|
| 완전 독립 | 각 프로젝트는 자체 DB, Redis, 환경변수를 가짐 |
| 템플릿 복사 | 새 프로젝트는 _template 복사로 시작 |
| 소스/데이터 분리 | 소스 코드와 런타임 데이터를 물리적으로 분리 |
전체 폴더 구조
multi-saas-kit/
├── Makefile # 플랫폼 명령어 (프로젝트 생성, 배포 등)
├── .env # 플랫폼 레벨 환경변수
│
├── ops/ # 운영 스크립트
│ └── scripts/
│ ├── create-project.sh # 프로젝트 생성
│ └── release.sh # 릴리즈 스냅샷 생성
│
├── packages/ # Core + Plugins (Monorepo)
│ ├── core/ # Core 모듈 (중앙 관리)
│ └── plugins/ # 플러그인 (수익화 대상)
│
├── workspace/ # ⭐ 개발 소스 (Git 관리)
│ ├── _docs/ # 플랫폼 문서
│ ├── _template/ # 프로젝트 템플릿
│ ├── _devtools/ # 개발 도구 (dashboard, pgadmin)
│ ├── _portal/ # 비즈니스 플랫폼 (web, plugin-store)
│ └── {project}/ # 실제 프로젝트
│
├── data/ # 런타임 데이터 (Git 제외)
│ ├── platform/ # 플랫폼 레벨 데이터
│ └── projects/{project}/ # 프로젝트별 DB/Redis 데이터
│
├── releases/ # 릴리즈 스냅샷 (Git 제외)
│
├── live/ # 프로덕션 심볼릭 링크 (Git 제외)
│
└── backups/ # 백업 데이터 (Git 제외)
폴더 명명 규칙
언더스코어 접두사 (_)
Multi-SaaS Kit은 언더스코어 접두사로 특수 폴더와 일반 프로젝트를 구분합니다.
| 접두사 | 의미 | 예시 |
|---|---|---|
_ (있음) | 특수 폴더 (프로젝트 아님) | _template, _docs, _devtools, _portal |
| 없음 | 실제 프로젝트 | myapp, client-portal, quant.how |
workspace/ 내부 구조
workspace/
├── _template/ # 특수: 새 프로젝트 템플릿
├── _docs/ # 특수: 플랫폼 문서
├── _devtools/ # 특수: 개발자 도구
├── _portal/ # 특수: 비즈니스 플랫폼
├── _security/ # 특수: 보안 도구
│
├── myapp/ # 실제 프로젝트
├── client-portal/ # 실제 프로젝트
└── quant.how/ # 실제 프로젝트
프로젝트 내부 구조
workspace/{project}/
├── .env # 환경변수 (Git 제외)
├── .env.example # 환경변수 템플릿
├── CLAUDE.md # AI 지침
│
├── _docker/ # 특수: Docker 설정
│ ├── docker-compose.amd64.yml # AMD64/x86_64
│ ├── docker-compose.arm64.yml # ARM64 (Apple Silicon)
│ └── conf/
│ ├── nginx/
│ ├── php/
│ ├── postgres/
│ └── redis/
│
├── docs/ # 프로젝트 문서
│ ├── design/
│ ├── discussion/
│ └── specs/
│
└── web/ # Laravel 애플리케이션
├── app/
│ └── Core → packages/core # 심볼릭 링크
└── ...
특수 폴더 설명
_template
새 프로젝트를 위한 템플릿입니다. make create NAME=myapp 명령으로 이 폴더를 복사하여 새 프로젝트를 생성합니다.
_template/
├── .env.example # 환경변수 템플릿
├── _docker/ # Docker 설정
│ ├── docker-compose.amd64.yml
│ ├── docker-compose.arm64.yml
│ └── conf/ # 서비스별 설정
│
├── docs/ # 문서 구조 템플릿
│
└── web/ # Laravel 애플리케이션
├── app/
│ ├── Core → packages/core # Core 모듈
│ └── Plugins → packages/plugins # 플러그인
└── ...
템플릿 고도화
_template은 계속 발전합니다. 새 기능이 추가되면 템플릿에 반영되고, 이후 생성되는 프로젝트는 자동으로 새 기능을 포함합니다.
_devtools
개발자 도구 모음입니다.
| 서비스 | 설명 | 포트 |
|---|---|---|
dashboard | AI 워크플로 시각화 | 8190 |
pgadmin | PostgreSQL 통합 관리 | 5050 |
_portal
비즈니스 플랫폼입니다. Multi-SaaS Kit 제품의 홍보, 판매, 문서 사이트입니다.
| 서비스 | 설명 | 포트 |
|---|---|---|
web | 메인 사이트 (제품 소개, 판매) | 8210 |
web-manual | 문서 사이트 (이 문서!) | 8230 |
plugin-store | 플러그인 스토어 | 8220 |
프로젝트 완전 독립 원칙
각 프로젝트는 모든 요소를 자체 보유합니다.
| 요소 | 위치 | 공유 여부 |
|---|---|---|
| Docker 설정 | {project}/_docker/ | 독립 |
| 환경변수 | {project}/.env | 독립 |
| PostgreSQL | data/projects/{project}/postgres/ | 독립 |
| Redis | data/projects/{project}/redis/ | 독립 |
| 문서 | {project}/docs/ | 독립 |
독립의 장점
- 격리된 환경: 한 프로젝트의 문제가 다른 프로젝트에 영향 없음
- 독립 배포: 프로젝트별로 개별 배포 가능
- 맞춤 설정: 프로젝트별 다른 환경 설정 가능
- 데이터 안전: 프로젝트 간 데이터 완전 분리
유일한 공유: Core 모듈
Core 모듈만 packages/core/에서 중앙 관리되며, 각 프로젝트에서 심볼릭 링크로 참조합니다.
# 심볼릭 링크 구조
workspace/myapp/web/app/Core → ../../../packages/core
workspace/myapp/web/app/Plugins → ../../../packages/plugins
Core 모듈 업데이트는 모든 프로젝트에 즉시 반영됩니다.