import os, base64, zipfile, io, sys, tempfile, subprocess from pathlib import Path from dotenv import load_dotenv # .env 파일 로드 (로컬 개발용) load_dotenv() def setup_environment(): """ 환경변수 자동 설정: - 로컬: .env 파일에서 로드 - Hugging Face Space: 환경변수에서 자동 설정 """ print("🔧 환경변수 설정 중...") # Hugging Face Dataset 설정 (기본값 설정) if not os.getenv("HF_DATA_REPO_ID"): os.environ["HF_DATA_REPO_ID"] = os.getenv("HF_DATA_REPO_ID") print("📝 HF_DATA_REPO_ID 기본값 설정") if not os.getenv("HF_DATA_TOKEN"): os.environ["HF_DATA_TOKEN"] = os.getenv("HF_DATA_TOKEN") print("📝 HF_DATA_TOKEN 기본값 설정") # Oracle DB 설정 확인 required_vars = ["DB_USER", "DB_PASSWORD", "WALLET_DIR", "WALLET_PASSWORD"] missing_vars = [] for var in required_vars: if not os.getenv(var): missing_vars.append(var) if missing_vars: print(f"⚠️ 누락된 환경변수: {', '.join(missing_vars)}") print("💡 .env 파일을 확인하거나 환경변수를 설정해주세요.") # 로컬 개발을 위한 기본값 설정 (경고와 함께) if not os.getenv("DB_USER"): os.environ["DB_USER"] = "ADMIN" print("📝 DB_USER 기본값 설정: ADMIN") if not os.getenv("DB_PASSWORD"): os.environ["DB_PASSWORD"] = "YourDBPassword123!" print("📝 DB_PASSWORD 기본값 설정: YourDBPassword123!") if not os.getenv("WALLET_PASSWORD"): os.environ["WALLET_PASSWORD"] = "YourWalletPassword123!" print("📝 WALLET_PASSWORD 기본값 설정: YourWalletPassword123!") else: print("✅ 모든 필수 환경변수가 설정되었습니다") print("🔧 환경변수 설정 완료") def prepare_wallet_dir(): """ Wallet 준비: - 배포 환경: WALLET_ZIP_B64에서 디코딩 - 로컬 환경: WALLET_DIR 경로 사용 """ # 로컬 개발: WALLET_DIR이 이미 설정되어 있는 경우 if "WALLET_DIR" in os.environ: wallet_dir = os.environ["WALLET_DIR"] if Path(wallet_dir).exists(): print(f"📁 로컬 Wallet 사용: {wallet_dir}") return wallet_dir # 배포 환경: WALLET_ZIP_B64에서 디코딩 if "WALLET_ZIP_B64" not in os.environ: raise RuntimeError( "❌ WALLET_ZIP_B64 또는 WALLET_DIR 환경 변수가 필요합니다.\n" " 로컬: .env 파일에 WALLET_DIR 설정\n" " 배포: Hugging Face Secrets에 WALLET_ZIP_B64 설정" ) print("🔐 Wallet Base64 디코딩 시작...") b64 = os.environ["WALLET_ZIP_B64"] wallet_password = os.environ["WALLET_PASSWORD"] # wallet을 메모리->임시디렉토리로 복원 wallet_dir = tempfile.mkdtemp(prefix="wallet_") print(f"📁 임시 디렉토리: {wallet_dir}") zip_bytes = base64.b64decode(b64) with zipfile.ZipFile(io.BytesIO(zip_bytes)) as z: z.extractall(wallet_dir) # 안전을 위해 권한 축소 for root, _, files in os.walk(wallet_dir): for f in files: os.chmod(os.path.join(root, f), 0o600) print("✅ Wallet 압축 해제 완료") # 지갑 비밀번호는 oracledb에서 사용 os.environ["WALLET_DIR"] = wallet_dir os.environ["WALLET_PASSWORD"] = wallet_password return wallet_dir if __name__ == "__main__": print("=" * 60) print("🚀 MuscleCare FastAPI 서버 시작") print("=" * 60) # 환경변수 자동 설정 setup_environment() # Wallet 준비 try: prepare_wallet_dir() except Exception as e: print(f"❌ Wallet 준비 실패: {e}") sys.exit(1) # Uvicorn 기동 print("\n🌐 FastAPI 서버 실행...") print("=" * 60) subprocess.run([sys.executable, "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"])