connection_budget(기본 40)을 두고, 기동 시 process_count 에 맞춰 pool_size/max_overflow 를 역산: (pool+overflow)×2엔진×process_count ≤ budget. 워커를 늘려도 config 가 스스로 예산을 지켜 커넥션 고갈→요청 실패를 예방. - config_models: MainDBConfig.connection_budget 추가 - server_configs: _autosize_pool(process_count 확정 후 산정) + _apply_pool_env_override (우선순위 = 명시 DB_POOL_SIZE > 자동 산정 > toml pool) - web_main: 기동 로그에 실효 풀/총커넥션/예산 출력 - env: DB_CONNECTION_BUDGET override, docker-compose 에 knob 노출 - tests: test_pool_autosize 10케이스(예산 준수·분할비·비활성·infeasible 바닥) - docs: operations 2-1 멀티코어/풀 섹션 + loadtest README 자동산정 표 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
75 lines
3.4 KiB
Plaintext
75 lines
3.4 KiB
Plaintext
# 복사해서 사용: cp config.local.toml.example config.local.toml
|
||
# 실제 config.local.toml 은 시크릿 포함이라 커밋하지 않는다(.gitignore: *.toml).
|
||
# 모든 서버는 APP_ENV=local 로 띄우며 이 파일을 읽는다.
|
||
#
|
||
# ── 프로덕션: 시크릿을 이미지에 굽지 말고 env 로 주입(server_configs 가 override) ──
|
||
# DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAME
|
||
# OPENAI_API_KEY / OPENAI_MODEL
|
||
# DECODO_HOST / DECODO_USERNAME / DECODO_PASSWORD / DECODO_COST_PER_GB
|
||
# NAVER_KEYS="id1:secret1,id2:secret2"
|
||
# LPS_PROFILE_DIR=/profiles (Chrome 프로필 영속 볼륨), LPS_CHROME_EXECUTABLE=/usr/bin/chromium
|
||
# → 배포 시엔 아래 시크릿 값을 비워두고 위 env 로 채우면 이미지에 시크릿이 안 남는다.
|
||
[WebServerConfig]
|
||
server_name = "LpsServer"
|
||
port = 9600
|
||
process_count = 1
|
||
is_ssl = false
|
||
is_test = true
|
||
# CORS 허용 오리진(프론트). 비우면 [] (CORS 미적용). 5173=vite dev.
|
||
cors_origins = ["http://localhost:5173", "http://127.0.0.1:5173"]
|
||
|
||
[LogConfig]
|
||
print_console = true
|
||
log_level = "debug"
|
||
|
||
# DB Read/Write 분리. 도커 실행 시 host 는 docker-compose 의 DB_HOST 로 override.
|
||
# 관리형 DB(RDS/Aurora/Azure)는 host 에 엔드포인트, sslmode="require".
|
||
# LPS 도메인 로직/테이블이 생기기 전까지는 접속하지 않으므로(엔진 lazy) placeholder 여도 부팅된다.
|
||
[MainDBConfig]
|
||
db_type = "postgresql"
|
||
name = "lps_db"
|
||
write_host = "127.0.0.1"
|
||
write_port = 5432
|
||
write_id = "<DB_USER>"
|
||
write_pw = "<DB_PASSWORD>"
|
||
read_host = "127.0.0.1"
|
||
read_port = 5432
|
||
read_id = "<DB_USER>"
|
||
read_pw = "<DB_PASSWORD>"
|
||
show_log = false
|
||
pool_size = 10 # connection_budget>0 이면 무시(자동 산정). budget=0 일 때만 이 값 사용.
|
||
max_overflow = 20 # 〃
|
||
# 커넥션 예산(자동 산정). process_count 에 맞춰 pool_size/max_overflow 를 자동 계산:
|
||
# (pool+overflow) × 2엔진 × process_count ≤ connection_budget.
|
||
# 'lps API 가 쓸 총 커넥션 상한' — 공유 PG(max_connections)·동거 서비스(worker 등)를 고려한 값.
|
||
# 예) 전용 PG(max_connections=100)면 90 근처, 공유 PG면 40 권장. 0 이면 자동 끔(위 pool 값 사용).
|
||
connection_budget = 40 # env DB_CONNECTION_BUDGET 로 override
|
||
sslmode = "" # 로컬: "" / 관리형 DB: "require"|"verify-ca"|"verify-full"
|
||
|
||
# ── 시크릿(API 키 등)도 이 파일에서 통합 관리 (미커밋). 배포는 이 파일 마운트 권장. ──
|
||
|
||
# 네이버 쇼핑 오픈API (https://developers.naver.com/apps). 여러 개면 429/403 로테이션 자동 포함.
|
||
[NaverConfig]
|
||
[[NaverConfig.keys]]
|
||
id = "<NAVER_CLIENT_ID>"
|
||
secret = "<NAVER_CLIENT_SECRET>"
|
||
# 추가 키는 아래처럼 블록을 더 넣으면 됨:
|
||
# [[NaverConfig.keys]]
|
||
# id = "..."
|
||
# secret = "..."
|
||
|
||
# AI 유사도 판정/검색어 생성 (OpenAI)
|
||
[OpenAIConfig]
|
||
api_key = "<OPENAI_API_KEY>"
|
||
model = "gpt-4o-mini"
|
||
|
||
# DECODO residential 프록시 (쿠팡 전용, 포트기반 sticky). 값 다 채우면 활성(비면 프록시 미사용).
|
||
[DecodoConfig]
|
||
host = "" # 예: gate.decodo.com
|
||
username = "" # 대시보드 USERNAME (예: sppd6a3ze3)
|
||
password = "" # 대시보드 PASSWORD
|
||
port_start = 0 # 예: 10001
|
||
port_end = 0 # 예: 10010
|
||
session_minutes = 10 # 대시보드 Sticky 지속시간(분)과 일치
|
||
cost_per_gb = 0.0 # DECODO 요금($/GB) — 검색 원가의 대역폭 비용 산정용(플랜에 맞게, 예 3.0)
|