diff --git a/README.md b/README.md index 351cd26..6b0c8d0 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,171 @@ -# aio2o-infrakit +# o2o-infrakit aio2o의 분산된 인프라 서비스 및 설정을 단일 프로젝트로 통합하여 구축한 범용 인프라 솔루션입니다. -## 기반 오픈소스 +## 주요 기능 + +- **FastAPI 애플리케이션 서버**: Gunicorn + Uvicorn ASGI 워커 기반의 비동기 Python 웹 서버 +- **Nginx 리버스 프록시**: SSL/TLS 지원, 정적 파일 서빙, WebSocket 지원 +- **데이터베이스**: PostgreSQL 및 MySQL(Percona) 지원 +- **캐싱 및 메시지 브로커**: Redis 기반 캐싱 및 Celery 태스크 큐 지원 +- **SSL 인증서 자동화**: Let's Encrypt + Certbot 자동 갱신 +- **로그 관리**: 일별 로그 로테이션 및 30일 보관 + +## 기술 스택 + +| 구분 | 기술 | +|------|------| +| 언어 | Python 3.13 | +| 프레임워크 | FastAPI | +| ASGI 서버 | Gunicorn + Uvicorn | +| 웹 서버 | Nginx 1.26 | +| 데이터베이스 | PostgreSQL, MySQL (Percona) | +| 캐시/브로커 | Redis | +| 태스크 큐 | Celery + Celery Beat | +| 컨테이너 | Docker, Docker Compose | + +## 디렉토리 구조 + +``` +o2o-infrakit/ +├── compose/ # Docker Compose 설정 +│ ├── docker-compose.yml # 메인 오케스트레이션 파일 +│ ├── .env # 환경 변수 +│ ├── mysql/ # MySQL 데이터 볼륨 +│ ├── pgdata/ # PostgreSQL 데이터 볼륨 +│ ├── redis/ # Redis 설정 및 데이터 +│ └── ssl/ # SSL 인증서 및 Let's Encrypt +│ +├── config/ # 서비스별 설정 +│ ├── app-server/ # 애플리케이션 서버 설정 +│ │ └── gunicorn_uvicorn.conf.py +│ ├── database/ # 데이터베이스 설정 +│ │ ├── mysql/ # MySQL 설정 (my.cnf, init.sql) +│ │ └── postgresql/ # PostgreSQL 설정 +│ └── web-server/ # 웹 서버 설정 +│ ├── nginx_conf/ # Nginx 메인 설정 +│ ├── conf.d/ # 도메인별 Nginx 설정 +│ └── proxy_params/ # 프록시 헤더 설정 +│ +├── docker/ # Docker 이미지 +│ ├── gunicorn/ # Python 앱 서버 Dockerfile +│ └── nginx/ # Nginx Dockerfile +│ +├── script/ # 유틸리티 스크립트 +│ ├── letsencrypt.sh # SSL 인증서 설정 +│ ├── crontab_gunicorn_set.sh # Cron 작업 설정 +│ └── logrotate/ # 로그 로테이션 설정 +│ +├── log/ # 로그 디렉토리 (볼륨) +│ ├── mysql/ # MySQL 로그 +│ ├── nginx/ # Nginx 액세스/에러 로그 +│ ├── postgresql/ # PostgreSQL 로그 +│ └── uvicorn/ # Uvicorn/FastAPI 로그 +│ +└── www/ # 애플리케이션 코드 볼륨 +``` + +## 시스템 요구사항 + +- **CPU**: 4코어 이상 +- **RAM**: 4GB 이상 +- **스토리지**: SSD 권장 +- **OS**: Linux (Ubuntu 24.04 권장) +- **Docker**: 20.10 이상 +- **Docker Compose**: 2.0 이상 + +## 빠른 시작 + +### 1. 환경 변수 설정 + +```bash +cd compose +cp .env.example .env +# .env 파일을 프로젝트에 맞게 수정 +``` + +주요 환경 변수: +- `PROJECT_DIR`: 애플리케이션 프로젝트 디렉토리명 +- `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`: PostgreSQL 접속 정보 +- `CELERY_BROKER_URL`: Celery 브로커 URL + +### 2. 데이터베이스 볼륨 권한 설정 + +```bash +cd compose +chmod +x set_mysql_permission.sh +./set_mysql_permission.sh +``` + +### 3. SSL 인증서 설정 (선택) + +```bash +cd script +chmod +x letsencrypt.sh +./letsencrypt.sh +``` + +### 4. 컨테이너 실행 + +```bash +cd compose +docker compose up -d +``` + +## 서비스 구성 + +### Docker Compose 서비스 + +| 서비스 | 설명 | 포트 | +|--------|------|------| +| nginx | 리버스 프록시, SSL 종료 | 80, 443 | +| uvicorn-app | FastAPI 애플리케이션 | 8000 (내부) | +| redis | 캐시 및 메시지 브로커 | 6379 (내부) | +| postgresql | 데이터베이스 | 5432 (내부) | +| mysql | 데이터베이스 (선택) | 3306 (내부) | + +### Gunicorn 설정 (config/app-server/gunicorn_uvicorn.conf.py) + +- **워커 수**: 4 (4GB RAM 기준 최적화) +- **워커 타입**: Uvicorn (비동기 I/O) +- **타임아웃**: 300초 (장시간 작업 지원) +- **최대 요청**: 1000 (메모리 누수 방지) +- **바인드**: 0.0.0.0:8000 + +### Nginx 설정 (config/web-server/nginx_conf/nginx.conf) + +- **워커 프로세스**: auto (CPU 코어 수에 맞게 자동 조정) +- **워커 연결**: 1024/프로세스 +- **Keep-alive**: 30초 +- **최대 요청 본문**: 50MB +- **프록시 타임아웃**: 300초 + +## 운영 기능 + +### 로그 로테이션 + +- **주기**: 일별 +- **보관 기간**: 30일 +- **최대 파일 크기**: 100MB +- **설정 위치**: `script/logrotate/` + +### SSL 인증서 자동 갱신 + +- **주기**: 매주 월요일 오전 5시 +- **방식**: Certbot + Nginx 리로드 +- **설정**: Nginx Dockerfile 내 crontab + +### 자동 재시작 + +- **주기**: 매주 월요일 오전 6시 (선택적) +- **설정 스크립트**: `script/crontab_gunicorn_set.sh` + +## 주요 스크립트 + +| 스크립트 | 설명 | +|----------|------| +| `script/letsencrypt.sh` | Let's Encrypt SSL 인증서 발급 | +| `compose/set_mysql_permission.sh` | 데이터베이스 볼륨 권한 설정 | +| `script/crontab_gunicorn_set.sh` | 컨테이너 자동 재시작 cron 설정 | -이 프로젝트는 임도현 책임연구원의 [devspoon-web](https://github.com/devspoons/devspoon-web) 오픈소스를 기반으로 개발되었습니다. -# \ No newline at end of file