diff --git a/DockerFile b/DockerFile index a006018..d87c428 100644 --- a/DockerFile +++ b/DockerFile @@ -1,22 +1,43 @@ -# 1. 파이썬 3.10 슬림 버전 +# 1. 베이스 이미지 설정 +# .so 파일이 Python 3.10용이므로 반드시 3.10 버전을 사용해야 합니다. FROM python:3.10-slim -WORKDIR /app - -# 2. 시스템 패키지 설치 -# DNS가 해결되었으므로 미러 변경 없이 기본 명령어로 진행합니다. -RUN apt-get update && apt-get install -y --no-install-recommends \ - libgl1-mesa-glx \ - libglib2.0-0 \ +# 2. 필수 시스템 패키지 설치 +# 컴파일된 바이너리(.so) 실행에 필요한 라이브러리들을 설치합니다. +RUN apt-get update && apt-get install -y \ + build-essential \ + libssl-dev \ + libffi-dev \ && rm -rf /var/lib/apt/lists/* -# 3. 파이썬 의존성 설치 -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt || pip install flask requests +# 3. 작업 디렉토리 설정 +WORKDIR /app -# 4. 전체 파일 복사 (컴파일된 .so 파일 포함) +# 4. 의존성 파일 복사 및 설치 +# 라이브러리 설치를 먼저 해서 빌드 속도를 높입니다. +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + + +# 5. [핵심] 프로젝트 전체 파일 복사 +# 윈도우에서 추가한 static/js/lib 폴더를 포함한 모든 파일을 강제로 복사합니다. COPY . . -# 5. 실행 설정 +# 확인용 (이게 에러 나면 빌드가 중단되니 바로 알 수 있습니다) +RUN ls -R /app/static/js/lib + +# 6. 환경 변수 설정 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV FLASK_APP=app.py + +# 7. 실행 권한 부여 (리눅스 환경 대응) +# 혹시 모를 권한 문제를 방지하기 위해 정적 파일 경로에 권한을 줍니다. +RUN chmod -R 755 /app/static + +# 8. 포트 노출 EXPOSE 5000 -CMD ["python", "app.py"] \ No newline at end of file + +# 9. 실행 명령 +# gunicorn 대신 flask run을 사용하여 디버깅 모드로 실행합니다. +CMD ["python", "app.py"] diff --git a/app.py b/app.py index e7da1f2..b88d7cd 100644 --- a/app.py +++ b/app.py @@ -1,23 +1,55 @@ +import os +import logging +import sys from flask import Flask +from jinja2 import ChoiceLoader, FileSystemLoader from routes.main_routes import main_bp from routes.api_routes import api_bp +# 로그 출력 설정 (컨테이너 로그에서 실시간 확인용) +logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) + def create_app(): app = Flask(__name__) - # Register Blueprints + # 템플릿 로더 설정 유지 + app.jinja_loader = ChoiceLoader([ + FileSystemLoader(os.path.join(app.root_path, 'templates')), + FileSystemLoader(os.path.join(app.root_path, 'tools')) + ]) + + # Blueprints 등록 app.register_blueprint(main_bp) app.register_blueprint(api_bp) + # 진단 로그 + try: + import routes.api_routes as ar + import logic.license_manager as lm + print(f"[*] API Routes Loaded From: {ar.__file__}") + print(f"[*] License Manager Loaded From: {lm.__file__}") + except Exception as e: + print(f"[!] Error during diagnostic: {e}") + return app +try: + from routes import api_routes + print("[*] API 모듈 로드 성공!") +except ImportError as e: + print(f"[!] API 모듈 로드 실패: {e}") +except Exception as e: + print(f"[!] 기타 에러: {e}") + if __name__ == '__main__': app = create_app() - # 로컬 실행 최적화 print("------------------------------------------") print("drawNET Premium Server Starting...") - print("URL: http://127.0.0.1:5000") + # 실제 접속 주소 로그 출력 수정 + print("Binding to: http://0.0.0.0:5000") print("------------------------------------------") - app.run(debug=True, port=5000) + # host='0.0.0.0' 추가가 핵심입니다. + # LXC 환경에서는 use_reloader=False를 권장합니다. + app.run(debug=True, host='0.0.0.0', port=5000, use_reloader=False) diff --git a/docker-compose.yml b/docker-compose.yml index 0293213..185cc09 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,5 @@ version: '3.8' + services: drawnet-app: build: . diff --git a/logic/license_manager.cp312-win_amd64.pyd b/logic/license_manager.cp312-win_amd64.pyd new file mode 100644 index 0000000..580ee6f Binary files /dev/null and b/logic/license_manager.cp312-win_amd64.pyd differ diff --git a/logic/license_manager.cpython-310-x86_64-linux-gnu.so b/logic/license_manager.cpython-310-x86_64-linux-gnu.so new file mode 100644 index 0000000..7cb00b3 Binary files /dev/null and b/logic/license_manager.cpython-310-x86_64-linux-gnu.so differ