.env에서 서버 바인딩(HOST/PORT/LOG_LEVEL/RELOAD) 받아오기
- config.Settings에 host/port/log_level/reload 필드 추가
- app/main.py에 main() + __main__ 진입점 추가 (python -m app.main)
- Dockerfile: python:3.13-slim 베이스로, CMD를 python -m app.main 으로 변경
- docker-compose: env_file 사용, ports를 ${PORT} 변수화
- 환경변수 PORT=N 으로 override 가능 (uvicorn 직접 실행도 그대로 지원)
main
parent
bc40ace2fd
commit
f31ef142e8
|
|
@ -1,3 +1,9 @@
|
||||||
|
# 서버 바인딩 (uvicorn) - python -m app.main 실행 시 사용됨
|
||||||
|
HOST=0.0.0.0
|
||||||
|
PORT=8000
|
||||||
|
LOG_LEVEL=info
|
||||||
|
RELOAD=false
|
||||||
|
|
||||||
API_KEYS=combooks-key-change-me,baikal-key-change-me
|
API_KEYS=combooks-key-change-me,baikal-key-change-me
|
||||||
ENGINE_VERSION=o2o-plagiarism-2.1.0-kosimcse
|
ENGINE_VERSION=o2o-plagiarism-2.1.0-kosimcse
|
||||||
REFERENCE_CORPUS_DIR=./data/reference
|
REFERENCE_CORPUS_DIR=./data/reference
|
||||||
|
|
|
||||||
13
Dockerfile
13
Dockerfile
|
|
@ -1,12 +1,14 @@
|
||||||
FROM python:3.11-slim
|
FROM python:3.13-slim
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
PYTHONUNBUFFERED=1 \
|
PYTHONUNBUFFERED=1 \
|
||||||
PIP_NO_CACHE_DIR=1
|
PIP_NO_CACHE_DIR=1 \
|
||||||
|
HOST=0.0.0.0 \
|
||||||
|
PORT=8000
|
||||||
|
|
||||||
# kiwipiepy/scikit-learn 빌드에 필요한 시스템 패키지
|
# kiwipiepy/scikit-learn/torch 빌드에 필요한 시스템 패키지
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
build-essential \
|
build-essential \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
@ -23,6 +25,7 @@ VOLUME ["/app/data/reference"]
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
||||||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/v1/health').read()" || exit 1
|
CMD python -c "import os, urllib.request; urllib.request.urlopen(f'http://localhost:{os.environ.get(\"PORT\", 8000)}/v1/health').read()" || exit 1
|
||||||
|
|
||||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
# .env의 HOST/PORT/LOG_LEVEL 따라 동작
|
||||||
|
CMD ["python", "-m", "app.main"]
|
||||||
|
|
|
||||||
26
README.md
26
README.md
|
|
@ -18,20 +18,36 @@ KOCCA 출판환경변화 과제 2단계 - 오투오 산출물. 자서전 본문
|
||||||
### Docker
|
### Docker
|
||||||
```bash
|
```bash
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# .env 에서 OPENAI_API_KEY 설정 (선택)
|
# .env 에서 HOST/PORT/LOG_LEVEL/OPENAI_API_KEY 등 조정 (선택)
|
||||||
docker compose up --build
|
docker compose up --build
|
||||||
```
|
```
|
||||||
|
|
||||||
### 로컬 (Python 3.11+)
|
### 로컬 (Python 3.13 권장)
|
||||||
```bash
|
```bash
|
||||||
python -m venv .venv && source .venv/bin/activate
|
python3.13 -m venv .venv && source .venv/bin/activate
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# .env 의 HOST/PORT 따라 실행
|
||||||
|
python -m app.main
|
||||||
|
|
||||||
|
# 또는 일회성 override
|
||||||
|
PORT=9000 LOG_LEVEL=debug python -m app.main
|
||||||
|
|
||||||
|
# 또는 uvicorn 직접
|
||||||
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||||
```
|
```
|
||||||
|
|
||||||
접속:
|
접속:
|
||||||
- `http://localhost:8000/` — 검토 콘솔 (브라우저용)
|
- `http://localhost:{PORT}/` — 검토 콘솔 (브라우저용)
|
||||||
- `http://localhost:8000/docs` — API 명세 (Swagger)
|
- `http://localhost:{PORT}/docs` — API 명세 (Swagger)
|
||||||
|
|
||||||
|
`.env` 의 서버 바인딩 변수:
|
||||||
|
| 변수 | 기본 | 설명 |
|
||||||
|
|---|---|---|
|
||||||
|
| `HOST` | `0.0.0.0` | 바인딩 호스트 |
|
||||||
|
| `PORT` | `8000` | 포트 |
|
||||||
|
| `LOG_LEVEL` | `info` | debug/info/warning/error |
|
||||||
|
| `RELOAD` | `false` | 파일 변경 시 자동 재시작 (개발용) |
|
||||||
|
|
||||||
## 사용법
|
## 사용법
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,12 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||||
class Settings(BaseSettings):
|
class Settings(BaseSettings):
|
||||||
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
||||||
|
|
||||||
|
# 서버 바인딩
|
||||||
|
host: str = "0.0.0.0"
|
||||||
|
port: int = 8000
|
||||||
|
log_level: str = "info" # debug / info / warning / error
|
||||||
|
reload: bool = False # 개발용 자동 재시작
|
||||||
|
|
||||||
api_keys: str = "combooks-key-change-me,baikal-key-change-me"
|
api_keys: str = "combooks-key-change-me,baikal-key-change-me"
|
||||||
engine_version: str = "o2o-plagiarism-2.0.0-pdf-v1.2"
|
engine_version: str = "o2o-plagiarism-2.0.0-pdf-v1.2"
|
||||||
reference_corpus_dir: str = "./data/reference"
|
reference_corpus_dir: str = "./data/reference"
|
||||||
|
|
|
||||||
23
app/main.py
23
app/main.py
|
|
@ -65,3 +65,26 @@ async def root() -> FileResponse:
|
||||||
return FileResponse(str(index))
|
return FileResponse(str(index))
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
return JSONResponse({"service": "o2o-plagiarism-api", "docs": "/docs"})
|
return JSONResponse({"service": "o2o-plagiarism-api", "docs": "/docs"})
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
"""`.env` 의 HOST/PORT/LOG_LEVEL/RELOAD 를 읽어 서버 기동.
|
||||||
|
|
||||||
|
사용법:
|
||||||
|
python -m app.main # .env 따라 실행
|
||||||
|
PORT=9000 python -m app.main # 환경변수 override
|
||||||
|
"""
|
||||||
|
import uvicorn
|
||||||
|
|
||||||
|
settings = get_settings()
|
||||||
|
uvicorn.run(
|
||||||
|
"app.main:app",
|
||||||
|
host=settings.host,
|
||||||
|
port=settings.port,
|
||||||
|
log_level=settings.log_level,
|
||||||
|
reload=settings.reload,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,16 @@ services:
|
||||||
plagiarism-api:
|
plagiarism-api:
|
||||||
build: .
|
build: .
|
||||||
container_name: o2o-plagiarism-api
|
container_name: o2o-plagiarism-api
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "${PORT:-8000}:${PORT:-8000}"
|
||||||
environment:
|
environment:
|
||||||
API_KEYS: ${API_KEYS:-combooks-key-change-me,baikal-key-change-me}
|
HOST: ${HOST:-0.0.0.0}
|
||||||
ENGINE_VERSION: ${ENGINE_VERSION:-o2o-plagiarism-1.0.0-baseline}
|
PORT: ${PORT:-8000}
|
||||||
REFERENCE_CORPUS_DIR: /app/data/reference
|
REFERENCE_CORPUS_DIR: /app/data/reference
|
||||||
SIMILARITY_THRESHOLD: ${SIMILARITY_THRESHOLD:-0.30}
|
TAXONOMY_DIR: /app/data/taxonomy
|
||||||
|
AUTOBIOGRAPHY_PATTERNS_PATH: /app/data/autobiography/common_patterns.txt
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/app/data
|
- ./data:/app/data
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue