#!/usr/bin/env bash # CodeAssist 도커 배포 — 우리 환경용. 이거 하나면 됨. (ABAP_OPENCODE web/deploy/deploy.sh 와 같은 명령 모양) # # ./deploy.sh 빌드 + 기동 (떠 있으면 갱신) # ./deploy.sh update git pull 까지 하고 갱신 # ./deploy.sh stop 종료 (데이터 볼륨은 남음) # ./deploy.sh logs 로그 # ./deploy.sh status 상태 # # 전제: 이 폴더에 .env (cp .env.example .env 후 채움) set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)"; cd "$HERE" CMD="${1:-up}" command -v docker >/dev/null || { echo "docker 없음"; exit 1; } docker compose version >/dev/null 2>&1 || { echo "docker compose v2 없음"; exit 1; } [ -f .env ] || { echo ".env 없음 — cp .env.example .env 후 채워"; exit 1; } set -a; . ./.env; set +a PORT="${BE_PORT:-8080}"; BASE="http://localhost:${PORT}/api/v1" case "$CMD" in stop) docker compose down; echo "종료(볼륨 유지)"; exit 0 ;; logs) docker compose logs -f --tail=100; exit 0 ;; status) docker compose ps; curl -fsS -m 5 "$BASE/health" && echo || echo "헬스 응답 없음"; exit 0 ;; update) git -C "$HERE/../../.." pull --ff-only || { echo "git pull 실패 — 로컬 변경 확인"; exit 1; } ;; up) ;; *) echo "모르는 명령: $CMD (up|update|stop|logs|status)"; exit 1 ;; esac [ -n "${OPENROUTER_API_KEY:-}${AAF_FABRIX_BASE_URL:-}" ] || { echo ".env 에 OPENROUTER_API_KEY(또는 AAF_FABRIX_*) 가 비어 있음"; exit 1; } echo "-- 이미지 빌드 + 기동" docker compose up -d --build echo "-- 기동 확인(최대 2분)" for _ in $(seq 1 60); do curl -fsS -m 3 "$BASE/health" >/dev/null 2>&1 && break; sleep 2; done curl -fsS -m 5 "$BASE/health" || { echo "안 떴음 → ./deploy.sh logs"; docker compose ps; exit 1; } echo echo "-- OpenCode 설정(렌더 결과) 모델:"; grep -oE '"model": *"[^"]+"' ../../opencode/opencode.json || true echo "-- 앱 주소: http://$(hostname -I 2>/dev/null | awk '{print $1}'):${PORT}/api/v1"