#!/usr/bin/env python3 """ Docker 배포 테스트 스크립트 Docker 컨테이너가 정상적으로 실행되고 있는지 확인 """ import requests import time import subprocess import json import sys import os def check_docker_installation(): """Docker 설치 확인""" try: result = subprocess.run(['docker', '--version'], capture_output=True, text=True, check=True) print(f"✅ Docker 설치됨: {result.stdout.strip()}") return True except subprocess.CalledProcessError: print("❌ Docker가 설치되지 않았습니다.") return False except FileNotFoundError: print("❌ Docker가 설치되지 않았습니다.") return False def check_docker_compose_installation(): """Docker Compose 설치 확인""" try: result = subprocess.run(['docker-compose', '--version'], capture_output=True, text=True, check=True) print(f"✅ Docker Compose 설치됨: {result.stdout.strip()}") return True except subprocess.CalledProcessError: print("❌ Docker Compose가 설치되지 않았습니다.") return False except FileNotFoundError: print("❌ Docker Compose가 설치되지 않았습니다.") return False def check_dockerfile(): """Dockerfile 존재 확인""" if os.path.exists('Dockerfile'): print("✅ Dockerfile 존재") return True else: print("❌ Dockerfile이 존재하지 않습니다.") return False def check_docker_compose_file(): """docker-compose.yml 존재 확인""" if os.path.exists('docker-compose.yml'): print("✅ docker-compose.yml 존재") return True else: print("❌ docker-compose.yml이 존재하지 않습니다.") return False def build_docker_image(): """Docker 이미지 빌드""" try: print("🔨 Docker 이미지 빌드 중...") result = subprocess.run(['docker-compose', 'build'], capture_output=True, text=True, check=True) print("✅ Docker 이미지 빌드 성공") return True except subprocess.CalledProcessError as e: print(f"❌ Docker 이미지 빌드 실패: {e.stderr}") return False def start_services(): """서비스 시작""" try: print("🚀 서비스 시작 중...") result = subprocess.run(['docker-compose', 'up', '-d'], capture_output=True, text=True, check=True) print("✅ 서비스 시작 성공") return True except subprocess.CalledProcessError as e: print(f"❌ 서비스 시작 실패: {e.stderr}") return False def check_service_status(): """서비스 상태 확인""" try: result = subprocess.run(['docker-compose', 'ps'], capture_output=True, text=True, check=True) print("📊 서비스 상태:") print(result.stdout) return True except subprocess.CalledProcessError as e: print(f"❌ 서비스 상태 확인 실패: {e.stderr}") return False def wait_for_api_ready(max_wait=60): """API 준비 대기""" print("⏳ API 준비 대기 중...") for i in range(max_wait): try: response = requests.get('http://localhost:8001/health', timeout=5) if response.status_code == 200: print(f"✅ API 준비 완료 ({i+1}초)") return True except requests.exceptions.RequestException: pass time.sleep(1) print("❌ API 준비 시간 초과") return False def test_api_endpoints(): """API 엔드포인트 테스트""" endpoints = [ ('/health', 'GET'), ('/models', 'GET'), ('/generate', 'POST') ] print("🧪 API 엔드포인트 테스트:") for endpoint, method in endpoints: try: if method == 'GET': response = requests.get(f'http://localhost:8001{endpoint}', timeout=10) elif method == 'POST' and endpoint == '/generate': # 간단한 생성 테스트 data = { 'prompt': '안녕하세요', 'model_id': 'polyglot-ko-1.3b-chat', 'max_length': 50, 'temperature': 0.7 } response = requests.post(f'http://localhost:8001{endpoint}', data=data, timeout=30) else: continue if response.status_code in [200, 201]: print(f"✅ {endpoint} - {response.status_code}") else: print(f"⚠️ {endpoint} - {response.status_code}") except requests.exceptions.RequestException as e: print(f"❌ {endpoint} - 오류: {e}") def test_redis_connection(): """Redis 연결 테스트""" try: result = subprocess.run(['docker-compose', 'exec', '-T', 'redis', 'redis-cli', 'ping'], capture_output=True, text=True, check=True) if 'PONG' in result.stdout: print("✅ Redis 연결 성공") return True else: print("❌ Redis 연결 실패") return False except subprocess.CalledProcessError: print("❌ Redis 연결 실패") return False def test_celery_worker(): """Celery Worker 테스트""" try: result = subprocess.run(['docker-compose', 'exec', '-T', 'celery-worker', 'celery', '-A', 'lily_llm_core.celery_app', 'inspect', 'active'], capture_output=True, text=True, check=True) print("✅ Celery Worker 정상") return True except subprocess.CalledProcessError: print("⚠️ Celery Worker 확인 실패 (정상일 수 있음)") return True def check_flower_monitoring(): """Flower 모니터링 확인""" try: response = requests.get('http://localhost:5555', timeout=5) if response.status_code == 200: print("✅ Flower 모니터링 접근 가능") return True else: print("⚠️ Flower 모니터링 접근 불가") return False except requests.exceptions.RequestException: print("⚠️ Flower 모니터링 접근 불가") return False def stop_services(): """서비스 중지""" try: print("🛑 서비스 중지 중...") subprocess.run(['docker-compose', 'down'], capture_output=True, text=True, check=True) print("✅ 서비스 중지 완료") return True except subprocess.CalledProcessError as e: print(f"❌ 서비스 중지 실패: {e.stderr}") return False def cleanup(): """정리""" try: print("🧹 정리 중...") subprocess.run(['docker-compose', 'down', '-v'], capture_output=True, text=True, check=True) subprocess.run(['docker', 'system', 'prune', '-f'], capture_output=True, text=True, check=True) print("✅ 정리 완료") return True except subprocess.CalledProcessError as e: print(f"❌ 정리 실패: {e.stderr}") return False def main(): """메인 테스트 함수""" print("🐳 Docker 배포 테스트 시작") print("=" * 50) # 1. 사전 요구사항 확인 print("\n📋 사전 요구사항 확인") print("-" * 30) if not check_docker_installation(): return False if not check_docker_compose_installation(): return False if not check_dockerfile(): return False if not check_docker_compose_file(): return False # 2. Docker 이미지 빌드 print("\n🔨 Docker 이미지 빌드") print("-" * 30) if not build_docker_image(): return False # 3. 서비스 시작 print("\n🚀 서비스 시작") print("-" * 30) if not start_services(): return False # 4. 서비스 상태 확인 print("\n📊 서비스 상태 확인") print("-" * 30) check_service_status() # 5. API 준비 대기 print("\n⏳ API 준비 대기") print("-" * 30) if not wait_for_api_ready(): print("❌ API 준비 실패") stop_services() return False # 6. API 엔드포인트 테스트 print("\n🧪 API 엔드포인트 테스트") print("-" * 30) test_api_endpoints() # 7. Redis 연결 테스트 print("\n🔴 Redis 연결 테스트") print("-" * 30) test_redis_connection() # 8. Celery Worker 테스트 print("\n🌿 Celery Worker 테스트") print("-" * 30) test_celery_worker() # 9. Flower 모니터링 확인 print("\n🌸 Flower 모니터링 확인") print("-" * 30) check_flower_monitoring() # 10. 결과 요약 print("\n📊 테스트 결과 요약") print("-" * 30) print("✅ Docker 배포 테스트 완료!") print("\n🌐 접근 가능한 서비스:") print(" - API Server: http://localhost:8001") print(" - Health Check: http://localhost:8001/health") print(" - Flower Monitor: http://localhost:5555") print("\n📝 유용한 명령어:") print(" - 로그 확인: docker-compose logs") print(" - 서비스 상태: docker-compose ps") print(" - 서비스 중지: docker-compose down") print(" - 정리: docker-compose down -v && docker system prune -f") return True if __name__ == "__main__": try: success = main() if not success: print("\n❌ Docker 배포 테스트 실패") sys.exit(1) else: print("\n🎉 Docker 배포 테스트 성공!") except KeyboardInterrupt: print("\n⚠️ 사용자에 의해 중단됨") stop_services() sys.exit(1) except Exception as e: print(f"\n❌ 예상치 못한 오류: {e}") stop_services() sys.exit(1)