#!/usr/bin/env bash # ============================================================ # Trading AI - Setup Script # ============================================================ set -euo pipefail RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' log() { echo -e "${GREEN}[✓]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } err() { echo -e "${RED}[✗]${NC} $1" >&2; exit 1; } [ -f .env ] && source .env || err ".env 파일이 없습니다." echo "============================================================" echo " Trading AI System - Setup" echo "============================================================" # ── 1. Docker / NVIDIA 확인 ──────────────────────────────── command -v docker >/dev/null 2>&1 || err "Docker가 없습니다." if ! command -v nvidia-smi >/dev/null 2>&1; then err "NVIDIA 드라이버가 없습니다." fi if ! docker info 2>/dev/null | grep -q "Runtimes.*nvidia"; then warn "nvidia-container-toolkit 설치 중..." curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \ sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update -qq sudo apt-get install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker log "nvidia-container-toolkit 설치 완료" fi log "GPU 정보:" nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader | \ while IFS=, read -r idx name mem; do echo " GPU $idx: $name ($mem)"; done # ── 2. 시스템 최적화 ──────────────────────────────────────── if ! grep -q "vm.overcommit_memory" /etc/sysctl.conf 2>/dev/null; then printf "vm.overcommit_memory = 1\nvm.swappiness = 10\nnet.core.somaxconn = 65535\n" | \ sudo tee -a /etc/sysctl.conf sudo sysctl -p >/dev/null 2>&1 log "커널 파라미터 최적화" fi echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled >/dev/null # ── 3. NFS 마운트 (스킵 - 나중에 수동 설정) ─────────────── warn "NFS 마운트 스킵 (Synology 설정 후 수동으로 진행하세요)" sudo mkdir -p /mnt/nas/news /mnt/nas/models /mnt/nas/backups # ── 4. 기존 네트워크 정리 ────────────────────────────────── log "기존 컨테이너/네트워크 정리 중..." docker compose down --remove-orphans 2>/dev/null || true docker network prune -f >/dev/null 2>&1 || true # ── 5. 순차 시작 ─────────────────────────────────────────── log "1단계: Redis, Qdrant, Bareun 시작..." docker compose up -d --build redis qdrant bareun log "헬스체크 대기 (20초)..." sleep 20 log "2단계: bareunaapi 시작..." docker compose up -d --build bareunaapi log "3단계: Ollama 시작 (GPU 1 - RTX 3070)..." docker compose up -d ollama log "BGE-M3 모델 다운로드 중..." sleep 30 docker exec trading-ollama ollama pull bge-m3 2>/dev/null || \ warn "BGE-M3 수동 다운로드 필요: docker exec trading-ollama ollama pull bge-m3" log "4단계: vLLM 시작 (GPU 0 - RTX 3060, 모델 로딩 2~5분)..." docker compose up -d vllm log "5단계: n8n 시작..." docker compose up -d n8n n8n-worker # ── 6. Qdrant 컬렉션 초기화 ──────────────────────────────── log "Qdrant 컬렉션 초기화 중..." sleep 10 HTTP=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:6333/collections/news_vectors) if [ "${HTTP}" = "404" ]; then curl -s -X PUT http://localhost:6333/collections/news_vectors \ -H "Content-Type: application/json" \ -d '{ "vectors": {"size": 1024, "distance": "Cosine"}, "optimizers_config": {"default_segment_number": 4}, "on_disk_payload": false }' >/dev/null log "Qdrant 컬렉션 'news_vectors' 생성" else warn "Qdrant 컬렉션 이미 존재" fi echo "" echo "============================================================" echo -e "${GREEN} 시작 완료!${NC}" echo "============================================================" echo " n8n : http://localhost:5678" echo " Qdrant : http://localhost:6333/dashboard" echo " vLLM : http://localhost:8000/docs" echo " Ollama : http://localhost:11434" echo " 바른API : http://localhost:5757/docs" echo "============================================================" warn "vLLM 모델 로딩 확인: docker compose logs -f vllm"