From c4b8692f3af54071d2dd7e987aa8ffdc7b687aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=ED=97=8C?= Date: Wed, 8 Jul 2026 17:14:34 +0900 Subject: [PATCH] =?UTF-8?q?chore(lps):=20=EC=8B=9C=ED=81=AC=EB=A6=BF?= =?UTF-8?q?=EC=9A=A9=20.env=20=EB=8F=84=EC=9E=85=20=E2=80=94=20API=20?= =?UTF-8?q?=ED=82=A4(NAVER/OpenAI/Azure)=20=EC=A3=BC=EC=9E=85=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 키는 코드/커밋이 아닌 환경변수로 주입한다(감사: 시크릿 하드코딩 금지). config.local.toml=비-시크릿 설정, .env=시크릿으로 분리. - .env.example(템플릿, 커밋) + .env(로컬, 미추적)로 키 슬롯 제공 · NAVER_CLIENT_ID/SECRET(+로테이션 _2..), OPENAI_API_KEY, AZURE_OPENAI_* - server_configs 가 기동 시 lps/.env 를 load_dotenv 로 환경변수 주입 - requirements: python-dotenv 추가 - README: .env 셋업 단계 안내 Co-Authored-By: Claude Opus 4.8 (1M context) --- lps/.env.example | 22 ++++++++++++++++++++++ lps/README.md | 5 ++++- lps/config/server_configs.py | 6 ++++++ lps/requirements.txt | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 lps/.env.example diff --git a/lps/.env.example b/lps/.env.example new file mode 100644 index 0000000..ab2a007 --- /dev/null +++ b/lps/.env.example @@ -0,0 +1,22 @@ +# LPS 환경변수 (시크릿). 복사해서 .env 로 만들고 값을 채우세요: +# cp .env.example .env +# .env 는 커밋되지 않습니다(.gitignore). 값은 큰따옴표 안에 넣으세요. +# 앱/워커 기동 시 config/server_configs 가 이 파일을 환경변수로 로드합니다. + +# ── 네이버 쇼핑 검색 오픈 API ───────────────────────────────────────── +# https://developers.naver.com/apps → 애플리케이션 등록 → 사용 API '검색' +NAVER_CLIENT_ID="" +NAVER_CLIENT_SECRET="" +# 로테이션(선택): 429/403 쿼터 회피용 추가 키는 _2, _3 ... 로 늘리면 자동 포함 +# NAVER_CLIENT_ID_2="" +# NAVER_CLIENT_SECRET_2="" + +# ── AI (상품 유사도 판정 / 검색어 생성) ─────────────────────────────── +# 사용하는 쪽만 채우면 됩니다. (A) OpenAI 또는 (B) Azure OpenAI(레퍼런스 방식) +# (A) OpenAI +OPENAI_API_KEY="" +# (B) Azure OpenAI +AZURE_OPENAI_API_KEY="" +AZURE_OPENAI_ENDPOINT="" +AZURE_OPENAI_DEPLOYMENT="" +AZURE_OPENAI_API_VERSION="2024-08-01-preview" diff --git a/lps/README.md b/lps/README.md index 026d8e8..2e510f9 100644 --- a/lps/README.md +++ b/lps/README.md @@ -37,9 +37,12 @@ lps/ ## 로컬 실행 ```bash -cp config/config.local.toml.example config/config.local.toml # 값 채우기 +cp config/config.local.toml.example config/config.local.toml # DB 등 비-시크릿 설정 +cp .env.example .env # 시크릿(API 키) — NAVER/OPENAI 등 ./run_local_server.sh # → http://localhost:9600/docs ``` +> `config.local.toml` = 비밀 아닌 설정(포트/DB), `.env` = 시크릿(API 키). 둘 다 git 미추적. +> 워커는 별도 프로세스: `python worker_main.py` ## 테스트 ```bash diff --git a/lps/config/server_configs.py b/lps/config/server_configs.py index 15ebe4e..30d4e82 100644 --- a/lps/config/server_configs.py +++ b/lps/config/server_configs.py @@ -1,8 +1,14 @@ import os +from dotenv import load_dotenv + from config.config_loader import Configs from config.config_models import WebServerConfig, LogConfig, MainDBConfig +# 시크릿(.env: API 키 등)을 환경변수로 로드. lps 루트의 .env 를 읽는다(없으면 조용히 무시). +# TOML(비밀 아님) 과 env(시크릿) 를 분리 — 키는 코드/커밋에 넣지 않는다. +load_dotenv(os.path.join(os.path.dirname(__file__), "..", ".env")) + # 실행 환경 결정 (기본 local). 환경변수 APP_ENV 로 변경. APP_ENV = os.environ.get("APP_ENV", "local") diff --git a/lps/requirements.txt b/lps/requirements.txt index 1b3c169..0b424ac 100644 --- a/lps/requirements.txt +++ b/lps/requirements.txt @@ -5,6 +5,7 @@ greenlet # SQLAlchemy async 의 sync/async 브리지에 필수 (일부 환경 asyncpg orjson pydantic>=2.0 +python-dotenv # .env(시크릿: API 키) 로드 — server_configs 에서 환경변수로 주입 httpx # 외부 사이트/오픈API(최저가 조회) 호출용 async HTTP 클라이언트 # --- 크롤링(LPS) — 안티봇 대응은 어댑터 안에 격리. 트레드밀 대비 버전 pin. ---