#!/bin/bash # Stock Oracle Portainer 빠른 배포 스크립트 set -e echo "🚀 Stock Oracle Portainer 빠른 배포 시작..." # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 함수 정의 print_status() { echo -e "${BLUE}ℹ️ $1${NC}" } print_success() { echo -e "${GREEN}✅ $1${NC}" } print_warning() { echo -e "${YELLOW}⚠️ $1${NC}" } print_error() { echo -e "${RED}❌ $1${NC}" } # Step 1: 필수 도구 확인 print_status "필수 도구 확인 중..." if ! command -v docker &> /dev/null; then print_error "Docker가 설치되지 않았습니다." exit 1 fi if ! command -v docker-compose &> /dev/null; then print_error "Docker Compose가 설치되지 않았습니다." exit 1 fi print_success "Docker 및 Docker Compose 설치 확인" # Step 2: 환경 변수 확인 print_status "환경 변수 확인 중..." if [ -z "$SEC_EMAIL" ]; then print_warning "SEC_EMAIL 환경 변수가 설정되지 않았습니다." read -p "SEC API 이메일 주소를 입력하세요: " SEC_EMAIL export SEC_EMAIL fi print_success "환경 변수 설정 완료" # Step 3: Portainer 설치 확인 print_status "Portainer 상태 확인 중..." if ! docker ps | grep -q portainer; then print_warning "Portainer가 실행되지 않고 있습니다. 설치를 시작합니다..." ./portainer/install-portainer.sh print_status "Portainer 초기화를 위해 30초 대기 중..." sleep 30 else print_success "Portainer가 이미 실행 중입니다." fi # Step 4: SSL 인증서 생성 print_status "SSL 인증서 확인 중..." if [ ! -f "portainer/nginx/ssl/cert.pem" ]; then print_warning "SSL 인증서가 없습니다. 생성을 시작합니다..." ./portainer/generate-ssl.sh else print_success "SSL 인증서가 이미 존재합니다." fi # Step 5: 환경 파일 생성 print_status "환경 파일 설정 중..." if [ ! -f ".env" ]; then cp portainer/.env.portainer .env # 환경 변수 자동 설정 sed -i.bak "s/your-email@example.com/$SEC_EMAIL/g" .env # 보안 패스워드 생성 POSTGRES_PASS=$(openssl rand -base64 32 | tr -d /=+ | cut -c -16) REDIS_PASS=$(openssl rand -base64 32 | tr -d /=+ | cut -c -16) sed -i.bak "s/change_this_password_in_production/$POSTGRES_PASS/g" .env sed -i.bak "s/change_this_redis_password/$REDIS_PASS/g" .env rm .env.bak print_success "환경 파일 생성 및 설정 완료" else print_success "환경 파일이 이미 존재합니다." fi # Step 6: Docker 이미지 빌드 print_status "Docker 이미지 빌드 중..." docker build -t stock-oracle-api:latest . print_success "Docker 이미지 빌드 완료" # Step 7: 스택 배포 print_status "Stock Oracle 스택 배포 중..." docker-compose -f portainer/docker-compose.portainer.yml down --remove-orphans docker-compose -f portainer/docker-compose.portainer.yml up -d print_success "스택 배포 완료" # Step 8: 서비스 상태 확인 print_status "서비스 상태 확인 중..." sleep 10 # 서비스 헬스체크 services=("stock-oracle-postgres" "stock-oracle-redis" "stock-oracle-api" "stock-oracle-nginx") all_healthy=true for service in "${services[@]}"; do if docker ps --format "table {{.Names}}\t{{.Status}}" | grep -q "$service.*Up"; then print_success "$service: 실행 중" else print_error "$service: 실행 실패" all_healthy=false fi done # Step 9: API 접속 테스트 print_status "API 접속 테스트 중..." sleep 15 if curl -k -s https://localhost/docs > /dev/null; then print_success "API 서버 접속 성공" else print_error "API 서버 접속 실패" all_healthy=false fi # Step 10: 결과 출력 echo "" echo "==================================" echo "🎉 Stock Oracle 배포 결과" echo "==================================" if [ "$all_healthy" = true ]; then print_success "모든 서비스가 성공적으로 배포되었습니다!" echo "" echo "📊 접속 정보:" echo " - API 문서: https://localhost/docs" echo " - Portainer: https://localhost:9443" echo " - API 엔드포인트: https://localhost/api/v1/" echo "" echo "🧪 테스트 실행:" echo " python tests/run_all_tests.py" echo "" echo "🔧 관리:" echo " - 컨테이너 상태: docker-compose -f portainer/docker-compose.portainer.yml ps" echo " - 로그 확인: docker-compose -f portainer/docker-compose.portainer.yml logs" echo " - 중지: docker-compose -f portainer/docker-compose.portainer.yml down" else print_error "일부 서비스 배포에 실패했습니다." echo "" echo "🔍 문제 해결:" echo " - 로그 확인: docker-compose -f portainer/docker-compose.portainer.yml logs" echo " - 상태 확인: docker-compose -f portainer/docker-compose.portainer.yml ps" echo " - 재시작: docker-compose -f portainer/docker-compose.portainer.yml restart" exit 1 fi