Files
exAichatbot_agent/local-dev/stop-all.sh
T

105 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# local-dev/start-all.sh 로 기동한 프로세스·컨테이너 중지
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
LOCAL_DEV_DIR="${ROOT_DIR}/local-dev"
RUN_DIR="${LOCAL_DEV_DIR}/run"
RAG_DIR="${ROOT_DIR}/exAiChatBot-chatbot2.0-agent"
APP_DIR="${ROOT_DIR}/chatbotApp-chatbot2.0-agent"
MONGO_CONTAINER="${MONGO_CONTAINER:-ex-chatbot-mongo-local}"
COMPOSE_LOCAL="${RAG_DIR}/docker-compose.local.yml"
STOP_MONGO=false
STOP_TUNNEL=false
for arg in "$@"; do
case "$arg" in
--mongo) STOP_MONGO=true ;;
--tunnel) STOP_TUNNEL=true ;;
-h|--help)
echo "Usage: $0 [--mongo] [--tunnel]"
exit 0
;;
esac
done
export PATH="/opt/homebrew/bin:/usr/local/bin:/Applications/Docker.app/Contents/Resources/bin:${PATH}"
log() { echo "[$(date '+%H:%M:%S')] $*"; }
stop_pid_file() {
local name="$1" pid_file="$2"
[[ -f "${pid_file}" ]] || return 0
local pid
pid="$(cat "${pid_file}")"
if kill -0 "$pid" 2>/dev/null; then
log "${name} 종료 (PID ${pid})"
kill "$pid" 2>/dev/null || true
sleep 2
kill -9 "$pid" 2>/dev/null || true
fi
rm -f "${pid_file}"
}
stop_port() {
local port="$1"
local pids
pids="$(lsof -tiTCP:"${port}" -sTCP:LISTEN 2>/dev/null || true)"
if [[ -n "${pids}" ]]; then
log ":${port} 점유 프로세스 종료"
kill ${pids} 2>/dev/null || true
sleep 1
kill -9 ${pids} 2>/dev/null || true
fi
}
log "로컬 exChatbot 스택 중지..."
stop_pid_file "chatbotApi" "${RUN_DIR}/chatbot-api.pid"
stop_pid_file "kakaoChatbotSkill" "${RUN_DIR}/kakao-skill.pid"
for port in 8086 8083; do
stop_port "${port}"
done
if [[ -d "${APP_DIR}" ]]; then
docker rm -f ex-chatbot-app-web 2>/dev/null || true
(cd "${APP_DIR}" && docker compose down --remove-orphans 2>/dev/null) || true
log "chatbotApp 중지"
fi
if [[ -f "${COMPOSE_LOCAL}" ]]; then
(cd "${RAG_DIR}" && docker compose -f docker-compose.local.yml down --remove-orphans 2>/dev/null) || true
log "RAG/Admin 중지 (exchatbot-local, 원격 Mongo/Qdrant는 유지)"
fi
# legacy slim compose 잔여 컨테이너 정리
if [[ -d "${RAG_DIR}" ]]; then
(cd "${RAG_DIR}" && docker compose -f docker-compose-slim.yml down --remove-orphans 2>/dev/null) || true
fi
for name in \
exaichatbot-chatbot20-agent-api-1 \
exaichatbot-chatbot20-agent-admin-1 \
exaichatbot-chatbot20-agent-qdrant-1 \
exaichatbot-chatbot20-agent-embed-1 \
exaichatbot-chatbot20-agent-index-1; do
docker rm -f "${name}" 2>/dev/null || true
done
if $STOP_MONGO; then
docker stop "${MONGO_CONTAINER}" 2>/dev/null || true
log "MongoDB 중지 (${MONGO_CONTAINER})"
fi
if $STOP_TUNNEL; then
stop_pid_file "SSH 터널" "${RUN_DIR}/tunnel.pid"
pkill -f "ssh -[fN].*-L ${LLM_PORT:-16000}:127.0.0.1:${LLM_PORT:-16000}" 2>/dev/null || true
pkill -f "ssh -f -N.*16000:127.0.0.1:16000" 2>/dev/null || true
log "SSH 터널 종료"
fi
log "완료"