SaaS 모델 개발을 위한 멀티테넌트 환경 구성 및 관리 도구
실제 SaaS 개발 경험을 바탕으로 만든 멀티테넌시 구조의 핵심 요소들을 쉽게 테스트하고 관리할 수 있는 시스템입니다.
🎯 왜 이걸 만들었나요?
SaaS 개발하면서 멀티테넌시 구성이 생각보다 복잡하더라고요. 특히:
- 테넌트별 데이터 격리는 어떻게 할지
- 컨테이너 관리는 어떻게 효율적으로 할지
- 개발/테스트 환경을 어떻게 쉽게 구성할지
이런 고민들을 해결하려고 만든 시스템이에요. 단위 테스트가 가능한 구조로 설계해서 다른 개발자분들도 편하게 사용할 수 있도록 했습니다.
✨ 주요 특징
🏢 멀티테넌시 핵심 기능
- 테넌트별 격리된 컨테이너 환경
- 포트 기반 테넌트 분리
- 독립적인 서비스 인스턴스 관리
- 테넌트별 배포 및 롤백 지원
🛠 개발 편의성
- 웹 기반 직관적인 관리 인터페이스
- 실시간 컨테이너 상태 모니터링
- 코드 수정 후 즉시 재배포 가능
- 단위 테스트 친화적 구조
🚀 SaaS 필수 요소
- 확장 가능한 아키텍처
- 독립적인 서비스 생명주기 관리
- 테넌트별 커스터마이징 지원
🚀 빠른 시작하기
사전 준비
# 필수 요구사항
- Docker Desktop (실행 상태)
- Python 3.8+
- Git
설치 및 실행
# 1. 프로젝트 클론
git clone https://github.com/onesound71/saas_docker2.git
cd saas_docker2
# 2. 가상환경 설정
python3 -m venv venv
source venv/bin/activate # Windows: .\venv\Scripts\activate
# 3. 의존성 설치
cd manager
pip install -r requirements.txt
# 4. 관리자 서버 실행
python3 -m uvicorn app.main:app --reload --port 8000
첫 번째 테넌트 생성해보기
- 관리 콘솔 접속: http://localhost:8000
- API 포트 설정: 8001 (또는 원하는 포트)
- 컨테이너 설치 클릭
- 테스트: http://localhost:8001/hello
🎉 축하합니다! 첫 번째 테넌트 환경이 준비되었어요.
💡 멀티테넌시 활용 예시
테넌트별 독립 환경 구성
# 테넌트 A (포트 8001)
포트: 8001 → 컨테이너 설치 → http://localhost:8001/hello
# 테넌트 B (포트 8002)
포트: 8002 → 컨테이너 설치 → http://localhost:8002/hello
# 테넌트 C (포트 8003)
포트: 8003 → 컨테이너 설치 → http://localhost:8003/hello
각 테넌트는 완전히 독립적인 환경에서 실행되며, 서로 영향을 주지 않습니다.
개발 워크플로우
1. 코드 수정 (hello_api/src/main.py)
↓
2. 이미지 재빌드
↓
3. 컨테이너 재배포
↓
4. 테스트 및 검증
🏗 시스템 아키텍처
SaaS 멀티테넌시 구조
├── 관리자 웹 인터페이스 (Port 8000)
│ ├── 테넌트 생성/관리
│ ├── 컨테이너 상태 모니터링
│ └── 배포 관리
│
├── 테넌트 A 서비스 (Port 8001)
├── 테넌트 B 서비스 (Port 8002)
└── 테넌트 N 서비스 (Port 800N)
🔧 주요 기능
컨테이너 관리
- ✅ 설치: 새로운 테넌트 환경 생성
- ✅ 시작/중지: 서비스 생명주기 관리
- ✅ 삭제: 불필요한 환경 정리
- ✅ 재빌드: 코드 변경사항 적용
실시간 모니터링
- 📊 컨테이너 상태 실시간 확인
- 🔍 로그 및 오류 추적
- 📈 리소스 사용량 모니터링
개발자 친화적 기능
- 🔄 핫 리로드: 코드 수정 후 즉시 반영
- 🧪 단위 테스트 지원: 테스트 친화적 구조
- 🎛 웹 기반 GUI: 복잡한 명령어 없이 직관적 조작
🔗 API 엔드포인트
관리 API
GET / # 웹 관리 인터페이스
GET /api/check-docker # Docker 상태 확인
POST /api/install # 컨테이너 설치
POST /api/start # 컨테이너 실행
POST /api/stop # 컨테이너 중지
POST /api/remove # 컨테이너 삭제
테넌트 API 예시
GET /hello # 기본 헬로 API
GET /hello/{name} # 개인화된 인사 API
🧪 단위 테스트 활용법
이 시스템은 단위 테스트를 염두에 두고 설계되었습니다:
# 테스트 예시
def test_tenant_isolation():
"""테넌트별 격리 테스트"""
tenant_a = create_tenant(port=8001)
tenant_b = create_tenant(port=8002)
# 각 테넌트는 독립적으로 동작해야 함
assert tenant_a.status != tenant_b.status
assert tenant_a.port != tenant_b.port
def test_container_lifecycle():
"""컨테이너 생명주기 테스트"""
container = install_container(port=8001)
assert container.is_running()
container.stop()
assert not container.is_running()
🚨 문제 해결 가이드
Docker 관련 이슈
# Docker 상태 확인
docker --version
docker info
# 권한 문제 (Linux)
sudo usermod -aG docker $USER
포트 충돌 해결
# 사용 중인 포트 확인
lsof -i :8000
netstat -tuln | grep LISTEN
# 프로세스 종료
kill -9 <PID>
컨테이너 문제 디버깅
# 로그 확인
docker logs <container_name>
# 컨테이너 상태 확인
docker ps -a
💬 실제 개발 경험 공유
이런 분들에게 추천해요
- 🎯 SaaS 개발을 시작하려는 개발자
- 🏢 멀티테넌시 구조가 궁금한 분
- 🛠 Docker 기반 개발환경을 구축하려는 팀
- 🧪 테스트 가능한 아키텍처를 원하는 분
실제로 겪었던 이슈들
- 테넌트별 데이터 격리 → port 기반 완전 분리로 해결
- 배포 복잡성 → 웹 인터페이스로 원클릭 배포 구현
- 테스트 환경 구성의 어려움 → 독립적인 컨테이너로 해결
🤝 기여하기
버그 리포트나 기능 제안은 언제나 환영입니다!
- 🐛 이슈 등록: GitHub Issues
- 💡 기능 제안: Pull Request
- 📧 문의사항: onesound71@github
📄 라이선스
MIT License - 자유롭게 사용하세요!
⭐ 이 프로젝트가 도움이 되셨다면 GitHub Star를 눌러주세요!
'나의 IT 기억' 카테고리의 다른 글
🤷♂️ 신입 개발자들이 가장 궁금해하는 질문들 - 현직 개발자의 솔직한 답변 (0) | 2025.05.27 |
---|---|
🚀 MCP Server - 나의 동료에게 설명하는 MCP (7) | 2025.05.27 |
동료에게 배운 새로운 기술: NGINX 트래픽 미러링으로 안전한 마이그레이션 하기 (1) | 2025.05.24 |
MySQL에서 PostgreSQL로의 실시간 데이터 동기화 시스템 구축기 (1) | 2025.05.24 |
MySQL CDC to MySQL Demo - KOREA (1) | 2025.05.23 |