토큰 발급 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 영속)
95 lines
3.6 KiB
Batchfile
95 lines
3.6 KiB
Batchfile
@echo off
|
|
REM stock_chart_site - Windows 재시작 스크립트
|
|
REM
|
|
REM build.bat 와의 차이:
|
|
REM - build.bat: 이미지 재빌드 포함. Dockerfile / pyproject.toml / package*.json /
|
|
REM compose 설정 등 의존성/이미지 구성이 바뀌었을 때 사용.
|
|
REM - restart.bat: 재빌드 없이 컨테이너만 재시작. backend/app/ 또는 web/app/ 안의
|
|
REM 코드만 바뀐 경우. docker-compose.yml 의 바인드 마운트 (./backend:/app,
|
|
REM ./web:/app) 덕에 새 코드가 즉시 컨테이너 안에서 보이고, 재시작으로
|
|
REM lifespan (부팅 시드 등) 도 다시 돌릴 수 있다.
|
|
REM
|
|
REM 즉 일반적으로 git pull 후:
|
|
REM - pyproject.toml / Dockerfile / package*.json 변경 있음 → build.bat
|
|
REM - app/ 코드만 변경 → restart.bat
|
|
|
|
setlocal enabledelayedexpansion
|
|
cd /d "%~dp0"
|
|
|
|
echo === stock_chart_site restart ===
|
|
|
|
REM 1) Docker 확인
|
|
where docker >nul 2>&1
|
|
if errorlevel 1 (
|
|
echo [ERROR] docker 명령을 찾을 수 없습니다. Docker Desktop 설치/실행을 확인하세요.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
docker info >nul 2>&1
|
|
if errorlevel 1 (
|
|
echo [ERROR] Docker Desktop이 실행 중이 아닙니다.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
|
|
REM 2) GPU 감지 (build.bat 과 동일 — compose 파일 조합 일치 위해)
|
|
set USE_GPU=0
|
|
where nvidia-smi >nul 2>&1
|
|
if not errorlevel 1 (
|
|
nvidia-smi >nul 2>&1
|
|
if not errorlevel 1 set USE_GPU=1
|
|
)
|
|
|
|
if "%USE_GPU%"=="1" (
|
|
echo [GPU] NVIDIA GPU detected. Using GPU profile.
|
|
set COMPOSE_FILES=-f docker-compose.yml -f docker-compose.gpu.yml
|
|
) else (
|
|
echo [CPU] NVIDIA GPU not detected. Using CPU profile.
|
|
set COMPOSE_FILES=-f docker-compose.yml
|
|
)
|
|
|
|
REM 3) backend/web 컨테이너 살아있는지 확인 — 없으면 build.bat 안내
|
|
REM (db 까지 포함해서 세면 db 만 떠있어도 통과돼버려서 부정확)
|
|
for /f %%i in ('docker compose %COMPOSE_FILES% ps --status running --quiet backend web 2^>nul ^| find /v /c ""') do set RUN_COUNT=%%i
|
|
if "%RUN_COUNT%"=="0" (
|
|
echo [INFO] 실행 중인 backend/web 컨테이너가 없습니다. 처음이거나 down 된 상태입니다.
|
|
echo build.bat 으로 빌드 + 기동하세요.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
|
|
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 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
|
|
exit /b 1
|
|
)
|
|
|
|
echo.
|
|
echo === 상태 ===
|
|
docker compose %COMPOSE_FILES% ps
|
|
|
|
echo.
|
|
echo 접속:
|
|
echo Web http://localhost:3000
|
|
echo Backend http://localhost:8000/health
|
|
echo DB ext http://localhost:8000/health/db
|
|
echo.
|
|
echo 로그 보기: docker compose logs -f backend
|
|
echo 정지: docker compose down
|
|
echo.
|
|
pause
|
|
endlocal
|