#!/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/Qdrant/Admin 중지 (exchatbot-local)" 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 "완료"