feat(kis): 토큰 디스크 캐시 + restart.bat env 재로드

토큰 발급 1분/1일 제한 (EGW00133 등 403) 회피:
- _load_disk_cache / _save_disk_cache 로 /app/.cache/kis_token.json 영속화
  · ./backend:/app 바인드 마운트로 호스트 backend/.cache/ 에 저장
  · backend/.cache/ 는 .gitignore 에 이미 포함됨 (secret 비커밋)
  · app_key prefix 캐시 무효화 키 (.env 갱신 시 자동 폐기)
  · atomic write (tmp → rename) + 0600 권한
- get_token: 메모리 → 디스크 → 신규 발급 순으로 fallback
- 컨테이너 재기동해도 24시간 유효 토큰 재사용 → 발급 폭주 방지

restart.bat:
- restart → up -d --force-recreate --no-deps backend web
  · restart 는 env_file 재로드 안 함 (.env 의 KIS_APP_KEY 변경이 무시됨)
  · up -d 는 새 인스턴스 생성하며 env_file 다시 읽음
  · --no-deps 로 db 는 절대 건드리지 않음 (postgres_data 영속)
This commit is contained in:
claude-owner
2026-05-23 01:22:32 +09:00
parent 78388d347e
commit 928c2160f9
2 changed files with 91 additions and 8 deletions

View File

@@ -58,13 +58,19 @@ if "%RUN_COUNT%"=="0" (
exit /b 1
)
REM 4) backend + web 만 재시작 — db 는 건드리지 않음.
REM docker compose restart 는 depends_on.condition: service_healthy 를 지키지 않으므로
REM db 까지 같이 재시작하면 backend lifespan 부팅 시드가 db 준비 전에 실행될 수 있다.
REM db 는 상태 (postgres_data 볼륨) 가 영속이라 재시작할 이유도 없다.
REM 4) backend + web 만 재기동 — db 는 건드리지 않음 (--no-deps).
REM
REM 왜 `restart` 가 아니라 `up -d --force-recreate` 인가:
REM - `docker compose restart` 는 기존 컨테이너를 stop/start 만 한다. 그래서
REM `.env` 변경 (예: KIS_APP_KEY 갱신) 이 반영되지 않는다. env_file 은
REM 컨테이너 "생성" 시점에만 읽힌다.
REM - `up -d --force-recreate` 는 새 컨테이너 인스턴스를 만들어서 env_file 을
REM 다시 읽는다. 이게 사용자가 .env 만 고치고 restart.bat 돌렸을 때 직관에 맞는다.
REM - `--no-deps` 로 db 는 절대 건드리지 않음. db 는 postgres_data 볼륨이 영속이라
REM 재기동할 이유 없고, depends_on.condition: service_healthy 와 무관하게 안전.
echo.
echo === docker compose restart backend web ===
docker compose %COMPOSE_FILES% restart backend web
echo === docker compose up -d --force-recreate --no-deps backend web ===
docker compose %COMPOSE_FILES% up -d --force-recreate --no-deps backend web
if errorlevel 1 (
echo [ERROR] restart 실패.
pause