diff --git a/backend/.env.example b/backend/.env.example index 8b5f2bc..7bbc8c7 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -2,8 +2,17 @@ # TriplePick 백엔드 환경변수 — 복사: cp .env.example .env # ───────────────────────────────────────────────────────────── -# DB (docker-compose 내부 네트워크 기본값). 로컬 단독이면 localhost 로. -DATABASE_URL=postgresql+asyncpg://triplepick:triplepick@db:5432/triplepick +# ── 데이터베이스 (외부 PostgreSQL 연결) ── +# DB_HOST 가 설정되면 아래 DB_* 로 접속 URL 을 조합한다(특수문자 비밀번호 안전 처리). +# 비밀번호에 # 가 들어가면 따옴표로 감쌀 것: DB_PASSWORD="비밀#번호" +DB_NAME=triplepick +DB_USER=o2o_db_admin +DB_PASSWORD=changeme +DB_HOST=172.30.1.36 +DB_PORT=5432 + +# (대안) DB_HOST 를 비워두면 아래 DATABASE_URL 을 그대로 사용. 로컬 sqlite 테스트 등. +# DATABASE_URL=postgresql+asyncpg://triplepick:triplepick@localhost:5432/triplepick # 일반 TIMEZONE=Asia/Seoul diff --git a/backend/app/config.py b/backend/app/config.py index b069ea0..50f3bb5 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -16,11 +16,34 @@ class Settings(BaseSettings): ) # ── 데이터베이스 ───────────────────────────────────────── - # docker-compose 의 db 서비스를 가리키는 기본값. 로컬 단독 실행 시 .env 로 덮어쓴다. + # 외부 DB 연결: DB_HOST 가 설정되면 아래 DB_* 항목으로 접속 URL 을 조합한다 + # (비밀번호 특수문자는 SQLAlchemy 가 안전하게 인코딩). DB_HOST 미설정 시 + # database_url(또는 sqlite 등 직접 지정값)을 그대로 사용. + db_host: str = "" + db_port: int = 5432 + db_name: str = "triplepick" + db_user: str = "triplepick" + db_password: str = "triplepick" + # 직접 지정용 폴백 (DB_HOST 미설정 시 사용). 로컬 sqlite 테스트 등. database_url: str = ( "postgresql+asyncpg://triplepick:triplepick@db:5432/triplepick" ) + def sqlalchemy_url(self): # noqa: ANN201 + """엔진 생성용 URL. DB_HOST 가 있으면 DB_* 로 조합(특수문자 안전).""" + if self.db_host: + from sqlalchemy import URL + + return URL.create( + "postgresql+asyncpg", + username=self.db_user, + password=self.db_password, + host=self.db_host, + port=self.db_port, + database=self.db_name, + ) + return self.database_url + # ── 일반 ──────────────────────────────────────────────── timezone: str = "Asia/Seoul" # 모든 경기 시각의 기준 (KST) cors_origins: str = "*" # 콤마구분. nginx 프록시 사용 시 동일 출처라 보통 불필요. diff --git a/backend/app/database.py b/backend/app/database.py index 437e21f..cca4527 100644 --- a/backend/app/database.py +++ b/backend/app/database.py @@ -20,7 +20,7 @@ class Base(DeclarativeBase): pass -engine = create_async_engine(settings.database_url, echo=False, pool_pre_ping=True) +engine = create_async_engine(settings.sqlalchemy_url(), echo=False, pool_pre_ping=True) SessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) diff --git a/docker-compose.yml b/docker-compose.yml index 2b88770..c5ee622 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,39 +1,21 @@ -# TriplePick — 전체 스택을 한 번에 실행. -# db PostgreSQL +# TriplePick — 외부 PostgreSQL 에 연결하는 구성 (로컬 db 컨테이너 없음). # api FastAPI (uvicorn) # worker APScheduler (상태전이 · 매일 AI 예측 생성 · 결과 메일) # frontend Vite 빌드 → nginx (정적 + /api 프록시) # -# 실행: cp backend/.env.example backend/.env (키 채우기) → docker compose up --build +# DB 는 이미 떠 있는 외부 PostgreSQL(예: 172.30.1.36:5432)에 연결한다. +# backend/.env 에 DB_HOST/DB_PORT/DB_NAME/DB_USER/DB_PASSWORD 를 채우면 +# app 이 접속 URL 을 조합해 그 DB 에 스키마(테이블)를 생성한다. +# +# 실행: cp backend/.env.example backend/.env (DB·키 채우기) → docker compose up --build # 접속: http://localhost:8080 services: - db: - image: postgres:16-alpine - environment: - POSTGRES_USER: triplepick - POSTGRES_PASSWORD: triplepick - POSTGRES_DB: triplepick - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U triplepick -d triplepick"] - interval: 5s - timeout: 5s - retries: 10 - ports: - - "5432:5432" - api: build: ./backend env_file: - path: ./backend/.env required: false - environment: - DATABASE_URL: postgresql+asyncpg://triplepick:triplepick@db:5432/triplepick - depends_on: - db: - condition: service_healthy ports: - "8000:8000" @@ -43,11 +25,7 @@ services: env_file: - path: ./backend/.env required: false - environment: - DATABASE_URL: postgresql+asyncpg://triplepick:triplepick@db:5432/triplepick depends_on: - db: - condition: service_healthy api: condition: service_started @@ -57,6 +35,3 @@ services: - api ports: - "8080:80" - -volumes: - pgdata: