#!/usr/bin/env bash # chatbot.exdev.co.kr — Agent 2.0 전체 스택 중지 # # ./server-dev/stop-all-server.sh # ./server-dev/stop-all-server.sh --keep-caddy # ./server-dev/stop-all-server.sh --purge-mongo # ./server-dev/stop-all-server.sh --purge-oracle # ./server-dev/stop-all-server.sh --keep-oracle set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SERVER_DEV_DIR="${ROOT_DIR}/server-dev" RUN_DIR="${SERVER_DEV_DIR}/run" RAG_DIR="${ROOT_DIR}/exAiChatBot-chatbot2.0-agent" APP_DIR="${ROOT_DIR}/chatbotApp-chatbot2.0-agent" COMPOSE_SERVER="${RAG_DIR}/docker-compose.server.yml" COMPOSE_CADDY="${SERVER_DEV_DIR}/docker-compose.caddy.yml" COMPOSE_ORACLE="${SERVER_DEV_DIR}/docker-compose.oracle.yml" MONGO_CONTAINER="${MONGO_CONTAINER:-exaichatbot-agent-mongo}" ORACLE_CONTAINER="${ORACLE_CONTAINER:-exaichatbot-agent-oracle-troad}" LEGACY_STACK_DIR="${LEGACY_STACK_DIR:-/Users/aidev/dev/exAIChatbot2.0}" KEEP_CADDY=false KEEP_ORACLE=false PURGE_MONGO=false PURGE_ORACLE=false STOP_HOST_AI=false for arg in "$@"; do case "$arg" in --keep-caddy) KEEP_CADDY=true ;; --keep-oracle) KEEP_ORACLE=true ;; --purge-mongo) PURGE_MONGO=true ;; --purge-oracle) PURGE_ORACLE=true ;; --stop-host-ai) STOP_HOST_AI=true ;; -h|--help) sed -n '2,10p' "$0" 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 "Agent 2.0 스택 중지..." 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_SERVER}" ]]; then (cd "${RAG_DIR}" && docker compose -f "${COMPOSE_SERVER}" down --remove-orphans 2>/dev/null) || true log "RAG/Qdrant/Admin 중지" fi if ! $KEEP_CADDY && [[ -f "${COMPOSE_CADDY}" ]]; then (cd "${SERVER_DEV_DIR}" && docker compose -f docker-compose.caddy.yml down --remove-orphans 2>/dev/null) || true docker rm -f exaichatbot-agent-caddy 2>/dev/null || true log "Caddy(HTTPS) 중지" fi if $KEEP_ORACLE; then log "Oracle TROAD 유지 (--keep-oracle)" elif [[ -f "${COMPOSE_ORACLE}" ]]; then if $PURGE_ORACLE; then (cd "${SERVER_DEV_DIR}" && docker compose -f docker-compose.oracle.yml down -v --remove-orphans 2>/dev/null) || true docker rm -f "${ORACLE_CONTAINER}" 2>/dev/null || true log "Oracle TROAD 컨테이너·볼륨 삭제 (${ORACLE_CONTAINER})" else (cd "${SERVER_DEV_DIR}" && docker compose -f docker-compose.oracle.yml stop 2>/dev/null) || true docker stop "${ORACLE_CONTAINER}" 2>/dev/null || true log "Oracle TROAD 중지 (${ORACLE_CONTAINER}, 데이터 볼륨 유지)" fi fi if $PURGE_MONGO; then docker stop "${MONGO_CONTAINER}" 2>/dev/null || true docker rm -f "${MONGO_CONTAINER}" 2>/dev/null || true log "MongoDB 컨테이너 삭제 (${MONGO_CONTAINER})" else docker stop "${MONGO_CONTAINER}" 2>/dev/null || true log "MongoDB 중지 (${MONGO_CONTAINER})" fi if $STOP_HOST_AI && [[ -f "${LEGACY_STACK_DIR}/scripts/exdev/stop-host-ai.sh" ]]; then bash "${LEGACY_STACK_DIR}/scripts/exdev/stop-host-ai.sh" || true log "호스트 AI 중지" fi log "완료"