Deploy: GitHub submodule sync 2026-07-23 12:46:52

This commit is contained in:
Macbook
2026-07-23 12:46:52 +09:00
parent fb55262bbc
commit 9ea8540979
339 changed files with 811 additions and 44137 deletions
+46 -36
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env bash
# 로컬 전체 스택 기동 (exdev AI SSH 터널 + Mongo + RAG + WAS + Skill + chatbotApp)
# 로컬 전체 스택 기동 (exdev AI SSH 터널 + 원격 Mongo/Qdrant + RAG + WAS + Skill + chatbotApp)
# Mongo/Qdrant 는 stock.exdev.co.kr 를 사용 (로컬 컨테이너 미기동)
#
# ./local-dev/start-all.sh
# ./local-dev/start-all.sh --no-tunnel
@@ -23,8 +24,9 @@ ENV_TEMPLATE="${LOCAL_DEV_DIR}/env.exdev-ai.template"
RAG_ENV="${RAG_DIR}/.env"
COMPOSE_LOCAL="${RAG_DIR}/docker-compose.local.yml"
MONGO_CONTAINER="${MONGO_CONTAINER:-ex-chatbot-mongo-local}"
EXDEV_DATA_HOST="${EXDEV_DATA_HOST:-stock.exdev.co.kr}"
INTERNAL_TOOL_API_KEY="${INTERNAL_TOOL_API_KEY:-local-dev-key}"
MONGODB_URI="${MONGODB_URI:-mongodb://exDev:ehfhrhdtk!!@${EXDEV_DATA_HOST}:27017/chatbot?authSource=chatbot&heartbeatFrequencyMS=30000&minPoolSize=3&maxIdleTimeMS=1800000}"
LLM_PORT="${LLM_PORT:-16000}"
EMBED_PORT="${EMBED_PORT:-16001}"
@@ -34,18 +36,21 @@ ADMIN_PORT="${ADMIN_PORT:-28013}"
WAS_PORT="${CHATBOT_API_PORT:-8086}"
SKILL_PORT="${KAKAO_SKILL_PORT:-8083}"
APP_PORT="${CHATBOT_APP_PORT:-8089}"
MONGO_PORT="${MONGO_PORT:-27017}"
QDRANT_PORT="${QDRANT_PORT:-6333}"
SKIP_TUNNEL=false
SKIP_JAVA=false
NO_BUILD=false
SYNC_QDRANT=false
for arg in "$@"; do
case "$arg" in
--no-tunnel) SKIP_TUNNEL=true ;;
--skip-java) SKIP_JAVA=true ;;
--no-build) NO_BUILD=true ;;
--sync-qdrant) SYNC_QDRANT=true ;;
--sync-qdrant)
echo "경고: 원격 Qdrant 사용 중이라 --sync-qdrant 는 무시됩니다."
;;
-h|--help)
sed -n '2,12p' "$0"
exit 0
@@ -148,43 +153,52 @@ ensure_rag_env() {
cp "${ENV_TEMPLATE}" "${RAG_ENV}"
fi
# Docker 컨테이너 → Mac 호스트 접근
# Docker 컨테이너 → Mac 호스트(SSH 터널) 접근
patch_env "LLM_BASE_URL" "http://host.docker.internal:${LLM_PORT}"
patch_env "TEI_EMBED_URL" "http://host.docker.internal:${EMBED_PORT}"
patch_env "TEI_RERANK_URL" "http://host.docker.internal:${RERANK_PORT}"
patch_env "EMBED_API_STYLE" "tei"
patch_env "RERANK_API_STYLE" "legacy"
patch_env "MONGO_HOST" "host.docker.internal"
patch_env "CHATBOT_API_BASE_URL" "http://host.docker.internal:${WAS_PORT}/api"
patch_env "INTERNAL_TOOL_API_KEY" "${INTERNAL_TOOL_API_KEY}"
# 로컬 Mongo 무인증
# Mongo / Qdrant → stock.exdev.co.kr (원격)
patch_env "EXDEV_DATA_HOST" "${EXDEV_DATA_HOST}"
patch_env "MONGO_HOST" "${EXDEV_DATA_HOST}"
patch_env "MONGO_PORT" "${MONGO_PORT}"
patch_env "MONGO_USER" ""
patch_env "MONGO_PASSWORD" ""
patch_env "MONGO_DATABASE" "chat_history"
patch_env "QDRANT_HOST" "${EXDEV_DATA_HOST}"
patch_env "QDRANT_PORT" "${QDRANT_PORT}"
patch_env "QDRANT_COLLECTION" "qa_vectors"
}
ensure_mongo() {
if docker ps --format '{{.Names}}' | grep -qx "${MONGO_CONTAINER}"; then
docker start "${MONGO_CONTAINER}" >/dev/null 2>&1 || true
log "MongoDB 재사용: ${MONGO_CONTAINER}"
wait_port 27017 "MongoDB" 20 || true
return 0
fi
ensure_remote_data() {
log "원격 데이터 확인: ${EXDEV_DATA_HOST} (Mongo :${MONGO_PORT}, Qdrant :${QDRANT_PORT})"
if lsof -iTCP:27017 -sTCP:LISTEN >/dev/null 2>&1; then
log "MongoDB :27017 이미 사용 중 (외부 인스턴스)"
return 0
if ! curl -sf --max-time 5 "http://${EXDEV_DATA_HOST}:${QDRANT_PORT}/collections" >/dev/null 2>&1; then
fail "원격 Qdrant 접속 실패 — http://${EXDEV_DATA_HOST}:${QDRANT_PORT}"
fi
log "✅ 원격 Qdrant (${EXDEV_DATA_HOST}:${QDRANT_PORT})"
log "MongoDB 컨테이너 생성: ${MONGO_CONTAINER}"
docker run -d --name "${MONGO_CONTAINER}" \
-p 27017:27017 \
mongo:7 >/dev/null
wait_port 27017 "MongoDB" 30 || true
if command -v nc >/dev/null 2>&1; then
if ! nc -z -w 5 "${EXDEV_DATA_HOST}" "${MONGO_PORT}" >/dev/null 2>&1; then
fail "원격 MongoDB 접속 실패 — ${EXDEV_DATA_HOST}:${MONGO_PORT}"
fi
fi
log "✅ 원격 MongoDB (${EXDEV_DATA_HOST}:${MONGO_PORT})"
}
ensure_rag_compose() {
local template="${LOCAL_DEV_DIR}/docker-compose.rag.local.yml"
[[ -f "${template}" ]] || fail "local-dev/docker-compose.rag.local.yml 없음"
cp "${template}" "${COMPOSE_LOCAL}"
}
start_rag() {
ensure_rag_env
ensure_rag_compose
[[ -f "${COMPOSE_LOCAL}" ]] || fail "docker-compose.local.yml 없음"
cd "${RAG_DIR}"
@@ -199,23 +213,17 @@ start_rag() {
# 이전 slim/legacy 잔여 정리
docker compose -f docker-compose-slim.yml down --remove-orphans 2>/dev/null || true
log "RAG 스택 기동 (docker-compose.local.yml)..."
# 로컬 Qdrant 잔여 컨테이너 정리 (원격 사용)
docker compose -f docker-compose.local.yml stop qdrant 2>/dev/null || true
docker compose -f docker-compose.local.yml rm -f qdrant 2>/dev/null || true
log "RAG 스택 기동 (docker-compose.local.yml, 원격 Mongo/Qdrant)..."
docker compose -f docker-compose.local.yml up "${up_flags[@]}"
wait_http "http://127.0.0.1:6335/readyz" "Qdrant" 30 || \
wait_http "http://127.0.0.1:6335/collections" "Qdrant" 30 || true
wait_http "http://${EXDEV_DATA_HOST}:${QDRANT_PORT}/collections" "원격 Qdrant" 30 || true
wait_http "http://127.0.0.1:${RAG_PORT}/health" "RAG API" 120
wait_http "http://127.0.0.1:${ADMIN_PORT}/api/stats" "Vector Admin" 60 || \
wait_port "${ADMIN_PORT}" "Vector Admin" 30 || true
local vc
vc="$(curl -sf "http://127.0.0.1:${RAG_PORT}/health" 2>/dev/null \
| python3 -c "import sys,json; print(json.load(sys.stdin).get('vector_count',0))" 2>/dev/null || echo 0)"
if $SYNC_QDRANT || [[ "${vc}" == "0" ]]; then
log "Qdrant 데이터 exdev 동기화 (vector_count=${vc})..."
chmod +x "${LOCAL_DEV_DIR}/sync-qdrant-from-exdev.sh"
"${LOCAL_DEV_DIR}/sync-qdrant-from-exdev.sh" || log "⚠️ Qdrant 동기화 실패 — 수동: ./local-dev/sync-qdrant-from-exdev.sh"
fi
}
ensure_java() {
@@ -305,7 +313,7 @@ else
ai_tunnel_ready || fail "--no-tunnel 이지만 :${LLM_PORT}~:${RERANK_PORT} AI 미응답"
fi
ensure_mongo
ensure_remote_data
start_rag
if ! $SKIP_JAVA; then
@@ -313,6 +321,7 @@ if ! $SKIP_JAVA; then
start_java_service "chatbotApi" "${API_DIR}" \
"${RUN_DIR}/chatbot-api.pid" "${LOG_DIR}/chatbot-api.log" \
"INTERNAL_TOOL_API_KEY=${INTERNAL_TOOL_API_KEY}" \
"MONGODB_URI=${MONGODB_URI}" \
"SKILL_INTERNAL_BASE_URL=http://127.0.0.1:${SKILL_PORT}" \
"RAG_SERVER_HOST=127.0.0.1" \
"RAG_SERVER_PORT=${RAG_PORT}"
@@ -345,7 +354,8 @@ log "기동 완료"
log " UI http://127.0.0.1:${APP_PORT}/chatbot/app/"
log " RAG http://127.0.0.1:${RAG_PORT}/health"
log " Admin http://127.0.0.1:${ADMIN_PORT}/"
log " Qdrant http://127.0.0.1:6335/ (호스트 포트)"
log " Mongo ${EXDEV_DATA_HOST}:${MONGO_PORT} (원격, RAG+WAS)"
log " Qdrant http://${EXDEV_DATA_HOST}:${QDRANT_PORT}/dashboard (원격)"
log " WAS http://127.0.0.1:${WAS_PORT}/"
log " Skill http://127.0.0.1:${SKILL_PORT}/web/ask"
log " exdev AI tunnel :${LLM_PORT} ~ :${RERANK_PORT}"