o2o-negosium-original/lps/run_docker.sh
민헌 8fb54be830 feat(lps): local/dev/prod 환경별 실행 체계 — 환경 toml 2종 + 대화형 run_docker.sh
다른 개발자가 어느 환경이든 같은 방식으로 띄울 수 있게 한다.
환경 = APP_ENV 가 고르는 config.<env>.toml 하나(구조 동일, 값만 다름).

- config.docker.toml → config.dev.toml 개명, config.prod.toml.example 신설
  (prod 성격 반영: api_keys 필수 표기·debug 로그 금지·웹훅 권장).
- compose 의 lps 서비스 APP_ENV/마운트를 ${APP_ENV:-dev} 로 파라미터화,
  API 포트를 ${LPS_API_BIND:-0.0.0.0} 바인드로 노출 제어.
- run_docker.sh(대화형) 신설: 환경 선택 → 설정 파일 검증(없으면 example
  복사 제안) → 기동/재시작/중지/로그. prod 는 guard 키 비면 경고 후
  확인받고, LPS_API_BIND=127.0.0.1 자동 설정(외부는 리버스프록시 경유).
- 운영 가이드에 환경 개요 표, README 빠른 시작에 Docker 실행 추가.
- 검증: 스크립트 문법·compose(dev/prod) 파싱·APP_ENV=dev 로딩·145 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 21:22:53 +09:00

50 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# LPS Docker 실행(대화형) — dev/prod 환경을 골라 lps-api/lps-worker 를 관리한다.
# 환경 = APP_ENV 가 고르는 config.<env>.toml (미커밋, example 복사 후 값 채움).
# 호스트(로컬) 실행은 run_local_server.sh / run_local_worker.sh 를 사용.
set -euo pipefail
cd "$(dirname "$0")/.." # 리포 루트(docker-compose.yml 위치)
echo "── LPS Docker 실행 ──"
read -rp "환경 선택 [1] dev(기본) [2] prod : " env_choice
case "${env_choice:-1}" in
1) ENV=dev ;;
2) ENV=prod ;;
*) echo "[error] 알 수 없는 선택: $env_choice"; exit 1 ;;
esac
CFG="lps/config/config.${ENV}.toml"
if [[ ! -f "$CFG" ]]; then
echo "[warn] $CFG 가 없습니다 (환경별 설정은 미커밋 — 서버마다 직접 준비)."
read -rp "example 을 복사해 생성할까요? [Y/n] " yn
if [[ "${yn:-Y}" =~ ^[Yy] ]]; then
cp "lps/config/config.${ENV}.toml.example" "$CFG"
echo "[ok] $CFG 생성 — DB 접속·API 키 등 값을 채운 뒤 다시 실행하세요."
fi
exit 0
fi
# prod 안전 점검: guard 키가 비어 있으면 API 가 개방 모드로 뜬다(위험) — 명시적 확인을 받는다.
if [[ "$ENV" == "prod" ]] && grep -qE '^\s*api_keys\s*=\s*\[\s*\]' "$CFG"; then
echo "[warn] prod 인데 [WebServerConfig].api_keys 가 비어 있습니다 → API 개방 모드(무인증)."
read -rp "그래도 계속할까요? [y/N] " go
[[ "${go:-N}" =~ ^[Yy] ]] || { echo "중단합니다."; exit 1; }
fi
export APP_ENV="$ENV"
if [[ "$ENV" == "prod" ]]; then
export LPS_API_BIND=127.0.0.1 # prod 는 API 포트를 호스트 내부만 바인드(외부는 리버스프록시 경유)
fi
echo ""
echo "환경: $ENV · 설정: $CFG$([[ "$ENV" == "prod" ]] && echo ' · API 바인드: 127.0.0.1')"
read -rp "동작 선택 [1] 시작/재빌드(기본) [2] 재시작 [3] 중지 [4] 로그 : " act
case "${act:-1}" in
1) docker compose up -d --build lps-api lps-worker autoheal
echo "[ok] 기동 — 로그의 'API guard ON/개방 모드' · 'DECODO 프리플라이트' 확인: docker compose logs -f lps-api lps-worker" ;;
2) docker compose restart lps-api lps-worker ;;
3) docker compose stop lps-api lps-worker ;;
4) docker compose logs -f lps-api lps-worker ;;
*) echo "[error] 알 수 없는 선택: $act"; exit 1 ;;
esac