penti/DEPLOYMENT_CHECKLIST.md

374 lines
8.2 KiB
Markdown

# Deployment Checklist
퇴직연금 리밸런싱 + Quant 플랫폼 배포 체크리스트
## 배포 전 준비 사항
### 1. 환경 설정
- [ ] `.env` 파일 생성 (`.env.example` 참고)
- [ ] 프로덕션용 데이터베이스 비밀번호 설정
- [ ] JWT 시크릿 키 생성 (필요한 경우)
- [ ] Redis 비밀번호 설정
- [ ] CORS 허용 도메인 설정
### 2. 데이터베이스
- [ ] PostgreSQL 15 설치 확인
- [ ] TimescaleDB 익스텐션 설치
- [ ] 데이터베이스 생성
- [ ] Alembic 마이그레이션 실행
- [ ] 인덱스 생성 확인
### 3. 데이터 수집
- [ ] MySQL에서 PostgreSQL로 데이터 마이그레이션 실행
- [ ] 티커 데이터 수집 실행
- [ ] 가격 데이터 수집 실행
- [ ] 재무제표 데이터 수집 실행
- [ ] 섹터 데이터 수집 실행
### 4. 테스트
- [ ] 단위 테스트 통과 (`pytest -m unit`)
- [ ] 통합 테스트 통과 (`pytest -m integration`)
- [ ] 백테스트 엔진 검증
- [ ] 전략 일관성 확인
- [ ] API 엔드포인트 테스트
- [ ] Frontend 빌드 성공
### 5. 성능 최적화
- [ ] 데이터베이스 쿼리 최적화
- [ ] 인덱스 튜닝
- [ ] Redis 캐싱 설정
- [ ] Nginx 설정 최적화
- [ ] 이미지 최적화 (Docker)
## Docker 배포
### 1. 이미지 빌드
```bash
# 전체 이미지 빌드
docker-compose build
# 특정 서비스만 빌드
docker-compose build backend
docker-compose build frontend
```
### 2. 서비스 시작
```bash
# 전체 서비스 시작
docker-compose up -d
# 로그 확인
docker-compose logs -f
```
### 3. 서비스 확인
- [ ] PostgreSQL: `docker-compose ps postgres`
- [ ] Redis: `docker-compose ps redis`
- [ ] Backend: `http://localhost:8000/health`
- [ ] Frontend: `http://localhost:3000`
- [ ] Celery Worker: `docker-compose ps celery_worker`
- [ ] Celery Beat: `docker-compose ps celery_beat`
- [ ] Flower: `http://localhost:5555`
- [ ] Nginx: `http://localhost` (포트 80)
### 4. 데이터베이스 마이그레이션
```bash
docker-compose exec backend alembic upgrade head
```
### 5. 초기 데이터 수집
```bash
# 전체 데이터 수집
curl -X POST http://localhost:8000/api/v1/data/collect/all
# 또는 개별 수집
curl -X POST http://localhost:8000/api/v1/data/collect/ticker
curl -X POST http://localhost:8000/api/v1/data/collect/price
curl -X POST http://localhost:8000/api/v1/data/collect/financial
curl -X POST http://localhost:8000/api/v1/data/collect/sector
```
## 검증
### 1. 자동 검증 스크립트
```bash
python scripts/verify_deployment.py
```
### 2. 수동 검증
#### API 엔드포인트 테스트
```bash
# Health check
curl http://localhost:8000/health
# 전략 목록
curl http://localhost:8000/api/v1/backtest/strategies/list
# 데이터베이스 통계
curl http://localhost:8000/api/v1/data/stats
# 포트폴리오 목록
curl http://localhost:8000/api/v1/portfolios/?skip=0&limit=10
```
#### 백테스트 실행
```bash
curl -X POST http://localhost:8000/api/v1/backtest/run \
-H "Content-Type: application/json" \
-d @samples/backtest_config.json
```
#### 포트폴리오 생성
```bash
curl -X POST http://localhost:8000/api/v1/portfolios/ \
-H "Content-Type: application/json" \
-d @samples/portfolio_create.json
```
### 3. Frontend 테스트
- [ ] 브라우저에서 `http://localhost:3000` 접속
- [ ] 백테스트 탭 동작 확인
- [ ] 리밸런싱 탭 동작 확인
- [ ] 데이터 관리 탭 확인
- [ ] 차트 렌더링 확인
### 4. Celery 작업 확인
- [ ] Flower 대시보드 접속 (`http://localhost:5555`)
- [ ] 워커 상태 확인
- [ ] 태스크 히스토리 확인
- [ ] Beat 스케줄 확인 (평일 18시 자동 수집)
## 모니터링
### 1. 로그 확인
```bash
# 전체 로그
docker-compose logs -f
# 특정 서비스 로그
docker-compose logs -f backend
docker-compose logs -f celery_worker
docker-compose logs -f postgres
```
### 2. 리소스 사용량
```bash
# Docker 컨테이너 리소스 사용량
docker stats
# 디스크 사용량
docker system df
```
### 3. 데이터베이스 모니터링
```bash
# PostgreSQL 연결
docker-compose exec postgres psql -U postgres -d pension_quant
# 테이블 크기 확인
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
# 레코드 수 확인
SELECT
'assets' as table_name, COUNT(*) FROM assets
UNION ALL
SELECT 'price_data', COUNT(*) FROM price_data
UNION ALL
SELECT 'financial_statements', COUNT(*) FROM financial_statements
UNION ALL
SELECT 'portfolios', COUNT(*) FROM portfolios;
```
## 백업
### 1. 데이터베이스 백업
```bash
# 백업 생성
docker-compose exec postgres pg_dump -U postgres pension_quant > backup_$(date +%Y%m%d).sql
# 백업 복원
docker-compose exec -T postgres psql -U postgres pension_quant < backup_20240101.sql
```
### 2. 자동 백업 설정
cron에 백업 스크립트 등록:
```bash
# /etc/cron.daily/pension-quant-backup
#!/bin/bash
cd /path/to/pension-quant-platform
docker-compose exec postgres pg_dump -U postgres pension_quant | gzip > /backups/pension_quant_$(date +%Y%m%d).sql.gz
find /backups -name "pension_quant_*.sql.gz" -mtime +30 -delete
```
## 문제 해결
### 컨테이너가 시작되지 않을 때
```bash
# 상태 확인
docker-compose ps
# 로그 확인
docker-compose logs [service_name]
# 재시작
docker-compose restart [service_name]
```
### 데이터베이스 연결 실패
```bash
# PostgreSQL 상태 확인
docker-compose exec postgres pg_isready -U postgres
# 연결 테스트
docker-compose exec postgres psql -U postgres -c "SELECT 1"
```
### Celery 워커 문제
```bash
# 워커 상태 확인
docker-compose exec celery_worker celery -A app.celery_app inspect ping
# 워커 재시작
docker-compose restart celery_worker celery_beat
```
### 디스크 공간 부족
```bash
# 사용하지 않는 Docker 리소스 정리
docker system prune -a
# 오래된 백업 삭제
find /backups -name "*.sql.gz" -mtime +90 -delete
```
## 보안 체크리스트
- [ ] 데이터베이스 비밀번호 변경 (기본값 사용 금지)
- [ ] Redis 비밀번호 설정
- [ ] 방화벽 설정 (필요한 포트만 개방)
- [ ] HTTPS 설정 (프로덕션 환경)
- [ ] CORS 허용 도메인 제한
- [ ] API Rate Limiting 설정
- [ ] 로그에 민감정보 노출 방지
## 성능 최적화
### 1. PostgreSQL 튜닝
```sql
-- shared_buffers 증가 (RAM의 25%)
ALTER SYSTEM SET shared_buffers = '4GB';
-- effective_cache_size 증가 (RAM의 50-75%)
ALTER SYSTEM SET effective_cache_size = '8GB';
-- work_mem 증가
ALTER SYSTEM SET work_mem = '64MB';
-- maintenance_work_mem 증가
ALTER SYSTEM SET maintenance_work_mem = '512MB';
-- 설정 재로드
SELECT pg_reload_conf();
```
### 2. 인덱스 생성
```sql
-- 자주 사용되는 쿼리에 인덱스 추가
CREATE INDEX idx_price_data_ticker_timestamp ON price_data (ticker, timestamp DESC);
CREATE INDEX idx_financial_ticker_date ON financial_statements (ticker, base_date DESC);
CREATE INDEX idx_assets_sector ON assets (sector) WHERE is_active = true;
```
### 3. TimescaleDB 압축
```sql
-- 압축 정책 활성화 (1년 이상 된 데이터)
ALTER TABLE price_data SET (
timescaledb.compress,
timescaledb.compress_segmentby = 'ticker'
);
SELECT add_compression_policy('price_data', INTERVAL '1 year');
```
## 업데이트 프로세스
### 1. 코드 업데이트
```bash
# Git pull
git pull origin main
# 이미지 재빌드
docker-compose build
# 서비스 재시작
docker-compose up -d
```
### 2. 데이터베이스 마이그레이션
```bash
# 마이그레이션 파일 생성 (필요한 경우)
docker-compose exec backend alembic revision --autogenerate -m "description"
# 마이그레이션 실행
docker-compose exec backend alembic upgrade head
```
### 3. 무중단 업데이트
```bash
# Blue-Green 배포 또는 Rolling 업데이트
# (Kubernetes, Docker Swarm 등 사용 시)
```
## 최종 확인
- [ ] 모든 서비스가 정상 동작
- [ ] 백테스트 실행 성공
- [ ] 데이터 수집 자동화 동작
- [ ] 리밸런싱 계산 정확성 확인
- [ ] Frontend 정상 렌더링
- [ ] Celery 작업 스케줄 확인
- [ ] 백업 설정 완료
- [ ] 모니터링 설정 완료
- [ ] 문서화 완료
배포 완료! 🚀