Files
exAichatbot_agent/server-dev/stop-all-server.sh
T
2026-08-13 17:39:39 +09:00

127 lines
4.0 KiB
Bash

#!/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 "완료"