261 lines
6.6 KiB
Markdown
261 lines
6.6 KiB
Markdown
# 배포 가이드
|
|
|
|
## 1. 전제 조건
|
|
|
|
### 호스트에 직접 설치 (Docker 외부)
|
|
- **MariaDB** 10.6+ — 관계형 데이터 저장
|
|
- **MongoDB** 7.0+ — 문서 데이터 저장
|
|
|
|
### Docker로 관리
|
|
- **Docker** 24.0+
|
|
- **Docker Compose** v2
|
|
|
|
---
|
|
|
|
## 2. 최초 설정
|
|
|
|
### 2.1 환경변수
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
`.env` 파일에서 반드시 변경해야 할 항목:
|
|
|
|
```bash
|
|
# 보안 키 (반드시 변경)
|
|
SECRET_KEY=<랜덤 문자열>
|
|
JWT_SECRET_KEY=<랜덤 문자열>
|
|
|
|
# MariaDB 접속 정보
|
|
MARIADB_HOST=127.0.0.1
|
|
MARIADB_PORT=3306
|
|
MARIADB_USER=core_api_user
|
|
MARIADB_PASSWORD=<강력한 비밀번호>
|
|
MARIADB_DATABASE=core_api
|
|
|
|
# MongoDB 접속 정보
|
|
MONGODB_URL=mongodb://127.0.0.1:27017
|
|
MONGODB_DATABASE=core_api
|
|
```
|
|
|
|
### 2.2 MariaDB 준비
|
|
|
|
```sql
|
|
CREATE DATABASE core_api CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
CREATE USER 'core_api_user'@'%' IDENTIFIED BY 'your_password';
|
|
GRANT ALL PRIVILEGES ON core_api.* TO 'core_api_user'@'%';
|
|
FLUSH PRIVILEGES;
|
|
```
|
|
|
|
### 2.3 MongoDB 준비
|
|
|
|
```javascript
|
|
use core_api
|
|
db.createUser({
|
|
user: "core_api_user",
|
|
pwd: "your_password",
|
|
roles: [{ role: "readWrite", db: "core_api" }]
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 개발 환경
|
|
|
|
### 3.1 로컬 실행
|
|
|
|
```bash
|
|
# 의존성 설치
|
|
pip install -e ".[dev]"
|
|
|
|
# DB 마이그레이션
|
|
alembic upgrade head
|
|
|
|
# 시드 데이터
|
|
python -m scripts.init_db
|
|
|
|
# 관리자 계정 생성
|
|
python -m scripts.create_superuser admin@example.com password123
|
|
|
|
# 인프라 시작 (Redis + Mosquitto)
|
|
docker-compose up -d redis mosquitto
|
|
|
|
# 앱 서버
|
|
uvicorn app.asgi:app --reload --host 0.0.0.0 --port 8000
|
|
|
|
# Celery 워커 (별도 터미널)
|
|
celery -A app.tasks.celery_app worker --loglevel=info \
|
|
-Q default,analytics,notifications,devices
|
|
|
|
# Celery 스케줄러 (별도 터미널)
|
|
celery -A app.tasks.celery_app beat --loglevel=info
|
|
```
|
|
|
|
### 3.2 Docker 전체 스택
|
|
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
서비스 확인:
|
|
- API: http://localhost:8000/docs
|
|
- Flower: http://localhost:5555
|
|
|
|
---
|
|
|
|
## 4. 프로덕션 배포
|
|
|
|
### 4.1 Docker Compose
|
|
|
|
```bash
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
|
```
|
|
|
|
프로덕션 차이점:
|
|
- Uvicorn 워커 4개 (`--workers 4`)
|
|
- Celery 동시성 4, Worker 레플리카 2
|
|
- Flower 기본 인증 활성화
|
|
- 소스 코드 볼륨 마운트 없음 (이미지 내장)
|
|
- 로그 레벨 `warning`
|
|
|
|
### 4.2 환경변수 (프로덕션 추가)
|
|
|
|
```bash
|
|
APP_ENV=production
|
|
DEBUG=false
|
|
LOG_LEVEL=WARNING
|
|
|
|
# Flower 인증
|
|
FLOWER_USER=admin
|
|
FLOWER_PASSWORD=<강력한 비밀번호>
|
|
|
|
# CORS (실제 도메인)
|
|
CORS_ORIGINS=["https://your-domain.com"]
|
|
```
|
|
|
|
### 4.3 리버스 프록시 (Nginx 예시)
|
|
|
|
```nginx
|
|
upstream core_api {
|
|
server 127.0.0.1:8000;
|
|
}
|
|
|
|
server {
|
|
listen 80;
|
|
server_name api.your-domain.com;
|
|
|
|
location / {
|
|
proxy_pass http://core_api;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
location /socket.io/ {
|
|
proxy_pass http://core_api;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 서비스 구성
|
|
|
|
```
|
|
┌────────────────────────────────────────────────────┐
|
|
│ Docker Compose │
|
|
│ │
|
|
│ ┌─────────┐ ┌─────────┐ ┌────────┐ ┌───────┐ │
|
|
│ │ App │ │ Worker │ │ Beat │ │Flower │ │
|
|
│ │ :8000 │ │ (x2) │ │ │ │ :5555 │ │
|
|
│ └────┬────┘ └────┬────┘ └───┬────┘ └───┬───┘ │
|
|
│ │ │ │ │ │
|
|
│ ┌────┴────┐ ┌────┴──────────┴────────────┘ │
|
|
│ │ Redis │ │ │
|
|
│ │ :6379 │ │ │
|
|
│ └─────────┘ │ │
|
|
│ ┌────────────┘ │
|
|
│ │ Mosquitto │ │
|
|
│ │ :1883 │ │
|
|
│ └───────────┘ │
|
|
└────────────────────────────────────────────────────┘
|
|
│ │
|
|
┌────┴────┐ ┌───┴────┐
|
|
│ MariaDB │ │MongoDB │
|
|
│ (호스트) │ │(호스트) │
|
|
└─────────┘ └────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 6. 헬스체크
|
|
|
|
```bash
|
|
# 기본 헬스체크
|
|
curl http://localhost:8000/api/v1/system/health
|
|
# → {"status": "ok", "service": "core-api", "version": "0.1.0"}
|
|
|
|
# 상세 시스템 상태 (인증 필요)
|
|
curl -H "Authorization: Bearer <token>" \
|
|
http://localhost:8000/api/v1/monitoring/health
|
|
|
|
# Docker 서비스 상태
|
|
docker-compose ps
|
|
|
|
# Celery 워커 상태
|
|
docker-compose logs worker
|
|
|
|
# Celery 활성 태스크
|
|
docker-compose exec worker celery -A app.tasks.celery_app inspect active
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 로그
|
|
|
|
### 개발 환경
|
|
- structlog 콘솔 렌더러 (사람이 읽기 좋은 형식)
|
|
- 로그 레벨: DEBUG
|
|
|
|
### 프로덕션 환경
|
|
- structlog JSON 렌더러 (ELK/Grafana 연동)
|
|
- 로그 레벨: WARNING
|
|
|
|
```bash
|
|
# 실시간 로그 확인
|
|
docker-compose logs -f app
|
|
docker-compose logs -f worker
|
|
```
|
|
|
|
---
|
|
|
|
## 8. 백업
|
|
|
|
### MariaDB
|
|
```bash
|
|
mysqldump -u root -p core_api > backup_$(date +%Y%m%d).sql
|
|
```
|
|
|
|
### MongoDB
|
|
```bash
|
|
mongodump --db core_api --out backup_$(date +%Y%m%d)
|
|
```
|
|
|
|
---
|
|
|
|
## 9. 트러블슈팅
|
|
|
|
| 증상 | 원인 | 해결 |
|
|
|------|------|------|
|
|
| `Cannot connect to MySQL` | MariaDB 미실행 또는 접속 정보 오류 | `.env` 확인, MariaDB 상태 확인 |
|
|
| `MongoDB not initialized` | MongoDB 미실행 | MongoDB 서비스 시작 |
|
|
| `Redis connection refused` | Redis 미실행 | `docker-compose up -d redis` |
|
|
| Celery 태스크 실행 안 됨 | Worker 미실행 또는 큐 불일치 | Worker 로그 확인, 큐 이름 확인 |
|
|
| Socket.IO 연결 실패 | CORS 설정 누락 | `CORS_ORIGINS`에 클라이언트 URL 추가 |
|
|
| MQTT 연결 실패 | Mosquitto 미실행 | `docker-compose up -d mosquitto` |
|