diff --git a/app/api/health.py b/app/api/health.py new file mode 100644 index 0000000..f88e530 --- /dev/null +++ b/app/api/health.py @@ -0,0 +1,9 @@ +# app/api/health.py +from fastapi import APIRouter + +router = APIRouter() + + +@router.get("/health") +async def health_check(): + return {"status": "ok", "message": "Service is healthy"} diff --git a/app/core/port.py b/app/core/port.py new file mode 100644 index 0000000..8305493 --- /dev/null +++ b/app/core/port.py @@ -0,0 +1,23 @@ +# app/core/port.py + +import os +import socket + + +def get_available_port(default: int = 8000) -> int: + """ + 환경변수 'PORT'가 존재하면 해당 포트를 사용하고, + 없다면 시스템이 할당한 사용 가능한 포트를 반환합니다. + """ + port_from_env = os.getenv("PORT") + + if port_from_env: + print(f"Using port from environment variable: {port_from_env}") + return int(port_from_env) + + # 포트 0 바인딩 → 시스템이 사용 가능한 포트 할당 + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("0.0.0.0", 0)) + assigned_port = s.getsockname()[1] + print(f"Dynamically assigned port: {assigned_port}") + return assigned_port diff --git a/app/main.py b/app/main.py index ea2ecbe..66a4d9f 100644 --- a/app/main.py +++ b/app/main.py @@ -1,39 +1,24 @@ # main.py -import os -import socket # 소켓 모듈 임포트 import uvicorn from fastapi import FastAPI +from app.api import health # 헬스 체크 +from app.core.port import get_available_port # 동적 포트 할당 + app = FastAPI() +# 헬스 체크 라우터 +app.include_router(health.router) + @app.get("/") async def read_root(): return {"message": "Hello, FastAPI Backend!"} -@app.get("/health") -async def health_check(): - return {"status": "ok", "message": "Service is healthy"} - - -# 이 부분이 추가된 동적 포트 할당 로직입니다. if __name__ == "__main__": - # 1. 환경 변수 'PORT'가 있으면 해당 포트를 사용합니다. - # 2. 없으면 사용 가능한 임시 포트를 찾습니다. - port_from_env = os.getenv("PORT") - - if port_from_env: - port = int(port_from_env) - print(f"Using port from environment variable: {port}") - else: - # 시스템에서 사용 가능한 임시 포트를 찾습니다. - # 포트 0을 바인딩하면 운영체제가 사용 가능한 포트를 할당해 줍니다. - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(("0.0.0.0", 0)) # 0.0.0.0에 포트 0을 바인딩 - port = s.getsockname()[1] # 할당된 포트 번호 가져오기 - print(f"Dynamically assigned port: {port}") - + # 동적 할당 로직 + port = get_available_port() # Uvicorn 서버를 시작합니다. uvicorn.run(app, host="0.0.0.0", port=port)