""" Hugging Face Spaces용 Flask 애플리케이션 진입점 """ import sys import os import logging from logging.handlers import RotatingFileHandler # UTF-8 인코딩 강제 설정 if sys.platform == 'win32': sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') from app import create_app app = create_app() # Hugging Face Spaces 환경 변수 설정 # Spaces는 자동으로 포트를 할당하므로 환경 변수에서 가져옴 port = int(os.environ.get('PORT', 7860)) host = os.environ.get('HOST', '0.0.0.0') # 로깅 설정 if not os.path.exists('logs'): os.mkdir('logs') # 파일 핸들러 설정 file_handler = RotatingFileHandler('logs/server.log', maxBytes=10240000, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]' )) file_handler.setLevel(logging.INFO) # 콘솔 핸들러 설정 console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )) console_handler.setLevel(logging.INFO) # Flask 앱 로거 설정 app.logger.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.addHandler(console_handler) # 루트 로거 설정 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) root_logger.addHandler(console_handler) # Werkzeug 로거 설정 werkzeug_logger = logging.getLogger('werkzeug') werkzeug_logger.setLevel(logging.INFO) werkzeug_logger.handlers.clear() werkzeug_handler = logging.StreamHandler(sys.stdout) werkzeug_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' )) werkzeug_logger.addHandler(werkzeug_handler) # 환경 변수 확인 (디버깅용) app.logger.info('=' * 80) app.logger.info('환경 변수 확인:') app.logger.info(f' PORT: {port}') app.logger.info(f' HOST: {host}') app.logger.info(f' SECRET_KEY: {"설정됨" if os.environ.get("SECRET_KEY") else "⚠️ 설정되지 않음"}') app.logger.info(f' DATABASE_URL: {"설정됨" if os.environ.get("DATABASE_URL") else "SQLite 사용 (기본값)"}') app.logger.info(f' GEMINI_API_KEY: {"설정됨" if os.environ.get("GEMINI_API_KEY") else "설정되지 않음"}') app.logger.info(f' OLLAMA_BASE_URL: {os.environ.get("OLLAMA_BASE_URL", "http://localhost:11434")}') app.logger.info('=' * 80) app.logger.info(f'서버 시작 - Host: {host}, Port: {port}') if __name__ == '__main__': try: print(f"[{__name__}] 서버 시작: http://{host}:{port}") print(f"[{__name__}] 로그는 콘솔과 logs/server.log 파일에 기록됩니다.") # 환경 변수 확인 출력 print("=" * 80) print("환경 변수 확인:") print(f" PORT: {port}") print(f" HOST: {host}") print(f" SECRET_KEY: {'설정됨' if os.environ.get('SECRET_KEY') else '⚠️ 설정되지 않음'}") print(f" DATABASE_URL: {'설정됨' if os.environ.get('DATABASE_URL') else 'SQLite 사용 (기본값)'}") print(f" GEMINI_API_KEY: {'설정됨' if os.environ.get('GEMINI_API_KEY') else '설정되지 않음'}") print(f" OLLAMA_BASE_URL: {os.environ.get('OLLAMA_BASE_URL', 'http://localhost:11434')}") print("=" * 80) app.run(host=host, port=port, debug=False, use_reloader=False) except Exception as e: print(f"서버 시작 오류: {e}") import traceback traceback.print_exc() # Hugging Face Space에서 에러가 보이도록 sys.exit 사용 sys.exit(1)