Agent 2.0 exdev 서버 배포 스택

- server-dev start/stop/deploy 및 Gitea push 자동 배포
- local-dev 로컬 개발 환경

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-07-21 22:57:30 +09:00
commit 4b86b2a660
344 changed files with 45787 additions and 0 deletions
+242
View File
@@ -0,0 +1,242 @@
# ============================================
# RAG System Configuration
# ============================================
# 서버 구성:
# WAS 172.16.180.130 — chatbotApi :8086, exAiChatBot :28012, chatbotAdmin :8087
# kakaoChatbotSkill — 별도 웹 서버 (카카오→nginx→Skill :8083)
# LLM 게이트웨이 172.16.163.96 — llm-ai / embedding-ai / reranker-ai.ex.co.kr
#
# 이 파일을 .env로 복사하고 실제 값으로 수정하세요
# cp env.template .env
# ============================================
# API 서버 설정
# ============================================
# Uvicorn 워커 수 (동시 처리 성능)
# - 1: 순차 처리 (기본)
# - 2-4: 일반적 권장 (CPU 코어 수 기준)
# - 4-8: 고성능 환경
UVICORN_WORKERS=4
# Docker 배포 분리 설정
# - 운영 기본 포트는 28012입니다.
# - 테스트 패키지는 deploy.sh가 아래 값을 28013 / rag-project-test / rag-*-slim-test로 자동 지정합니다.
# - 수동으로 같은 서버에 운영/테스트를 동시에 띄우는 경우 포트, 프로젝트명, 로그/벡터 컬렉션을 다르게 유지하세요.
# API_HOST_PORT=28012
# COMPOSE_PROJECT_NAME=rag-project
# RAG_API_IMAGE=rag-api-slim:latest
# RAG_BATCH_IMAGE=rag-batch-slim:latest
# MONGO_COLLECTION=rag_conversations
# QDRANT_COLLECTION=qa_vectors
# ============================================
# 외부 API 엔드포인트
# ============================================
# ⚠️ 주의: LLM API는 쿼리 응답(API 서비스)에서만 사용됩니다.
# - 데이터 준비 단계(embed, index)에서는 LLM 불필요
# - preprocess 단계 제거됨 (qa_raw.jsonl 직접 임베딩)
# 각 서버의 IP와 포트를 개별 설정 가능
# 신규 게이트웨이(172.16.163.96:443, HTTPS) + 호스트명 라우팅 + Bearer 인증 + OpenAI 호환 포맷
# DNS 미등록 상태이면 docker-compose의 extra_hosts로 호스트명 → GATEWAY_IP 매핑 필요
GATEWAY_IP=172.16.163.96 # 모델 게이트웨이 IP (extra_hosts 매핑용)
MODEL_API_KEY=ADMIN_API_KEY # ★ 실제 발급 키로 교체 (모든 모델 공통)
MODEL_VERIFY_SSL=false # 자체서명 인증서 → 검증 비활성화 (curl -k 동일)
# LLM API (OpenAI 호환 /v1/chat/completions)
LLM_BASE_URL=https://llm-ai.ex.co.kr
LLM_MODEL_NAME=Qwen/Qwen3.6-27B-FP8
# Embedding API (OpenAI 호환 /v1/embeddings)
# 주의: Qwen3-Embedding은 Query/Document를 구분 (Query엔 Instruct 프리픽스 자동 추가)
TEI_EMBED_URL=https://embedding-ai.ex.co.kr
EMBED_MODEL_NAME=Qwen/Qwen3-Embedding-8B
# Reranker API
# gateway: /score (게이트웨이) | legacy: /rerank (exdev reranker_server.py)
TEI_RERANK_URL=https://reranker-ai.ex.co.kr
TEI_RERANK_MODEL=Qwen/Qwen3-Reranker-8B
RERANK_API_STYLE=gateway
# Embedding API
# openai: /v1/embeddings (게이트웨이) | tei: /embed (exdev 호스트 TEI)
EMBED_API_STYLE=openai
# API 타임아웃 (초)
API_TIMEOUT=60
# ============================================
# 임베딩 배치 크기
# ============================================
# TEI API 호출 시 한 번에 처리할 텍스트 개수
# - TEI API 제한: 최대 32개까지 한 번에 처리 가능
# - 권장값: 16~32 (안정성을 위해 32 이하)
# - 기본값: 32 (최대 성능)
# - 오류 발생 시: 16으로 낮춰보세요
EMBED_BATCH_SIZE=32
# Qdrant 저장 배치 크기 (한 번에 upsert 할 벡터 수)
# - 4096차원 임베딩에서 500이면 요청이 ~44MB → Qdrant 32MB 한도 초과(400)
# - 100 권장 (차원 크면 더 낮추기)
VECTOR_BATCH_SIZE=100
# ============================================
# 벡터 DB 설정
# ============================================
# 벡터 스토어 선택: faiss | qdrant
# - faiss: 단순/고속, 추가 인프라 불필요 (권장: ~1,000개 문서)
# - qdrant: 확장 가능, 실시간 업데이트 + 어드민 큐레이션 (운영 기본값)
VECTOR_STORE=qdrant
# Qdrant 설정
# 모든 서비스가 network_mode: host 이므로 서비스명(qdrant)이 아닌 127.0.0.1 사용
QDRANT_HOST=127.0.0.1
QDRANT_PORT=6333
QDRANT_COLLECTION=qa_vectors
# Qdrant dense+sparse 하이브리드 검색
# - 테스트 전환 시 QDRANT_COLLECTION=qa_vectors_v2 권장
# - qa_vectors_v2는 dense named vector + sparse vector를 함께 저장
HYBRID_SEARCH_ENABLED=false
SPARSE_SEARCH_ENABLED=true
SPARSE_TOP_K=30
HYBRID_MERGE_TOP_K=40
# ============================================
# 큐레이션 어드민 (벡터DB 검색/조회/수정/삭제/추가 웹)
# ============================================
ADMIN_PORT=28013
# 별도 프론트 origin 허용(콤마 구분). 내부망이면 * 유지
ADMIN_CORS_ORIGINS=*
# ============================================
# 성능 튜닝
# ============================================
# FAISS 검색 파라미터
FAISS_TOP_K=50
FAISS_THRESHOLD=0.55
# FAISS 재검색 Threshold (Query Rewriting 후)
# - Query Rewriting으로 재작성된 질문은 더 관대한 threshold 적용
# - 원본 질문보다 0.05 낮게 설정 권장
# - 예: 원본 0.55 → 재작성 0.50
FAISS_THRESHOLD_REWRITE=0.50
# 재랭킹 파라미터
RERANK_CANDIDATES=20
RERANK_BATCH_SIZE=16
# LLM 참고자료 개수 (재랭킹 후 상위 N개를 LLM에 전달)
TOP_N_FOR_LLM=5
# LLM 답변 최대 길이 (토큰 수)
# - 512: 짧은 답변 (1-2 문단)
# - 1024: 중간 길이 (3-4 문단)
# - 2048: 긴 답변 (5-6 문단, 권장)
# - 4096: 매우 긴 답변 (전체 문서)
LLM_MAX_TOKENS=2048
# Query Rewriting (쿼리 재작성)
# - true: 활성화 (대화 이력 기반 질문 재작성 후 재검색)
# - false: 비활성화
# 예: "그럼 어디서 사나요?" → "하이패스 단말기는 어디서 구매할 수 있나요?"
QUERY_REWRITE_ENABLED=true
# 대화 이력 참고 설정
# - CHAT_HISTORY_LIMIT: 참고할 이전 대화 개수 (1-10 권장, 기본값: 10)
# - CHAT_HISTORY_HOURS: 참고할 대화 시간 범위 (시간 단위, 기본값: 24)
# - CHAT_HISTORY_ALWAYS_INCLUDE: 정상 질문도 이력 포함 여부
# * true: 모든 답변에 대화 맥락 반영 (대화형 챗봇) ← 기본값
# * false: threshold 미달 시에만 사용 (Query Rewriting용)
CHAT_HISTORY_LIMIT=10
CHAT_HISTORY_HOURS=24
CHAT_HISTORY_ALWAYS_INCLUDE=true
# 프록시 우회 설정
# - Docker 컨테이너에서 내부 IP로 직접 연결하기 위함
# - 회사/조직 프록시가 있는 경우 내부망 대역을 추가
NO_PROXY=localhost,127.0.0.1,172.16.0.0/12,172.16.180.130,llm-ai.ex.co.kr,embedding-ai.ex.co.kr,reranker-ai.ex.co.kr,.ex.co.kr
no_proxy=localhost,127.0.0.1,172.16.0.0/12,172.16.180.130,llm-ai.ex.co.kr,embedding-ai.ex.co.kr,reranker-ai.ex.co.kr,.ex.co.kr
# ============================================
# Agent tool loop (chatbotApi — 동일 WAS 서버)
# ============================================
AGENT_MODE=legacy
AGENT_MAX_ROUNDS=6
CHATBOT_API_BASE_URL=http://127.0.0.1:8086/api
INTERNAL_TOOL_API_KEY=
CHATBOT_TOOL_TIMEOUT=30
AGENT_PENDING_COLLECTION=agent_pending
# ============================================
# MongoDB 대화 이력 설정 (필수!)
# ============================================
# MongoDB 호스트
# ⚠️ 중요: Docker 컨테이너에서 실행 시 환경에 맞게 설정!
#
# 【환경별 설정】
# - Mac/Windows Docker Desktop: host.docker.internal
# - Linux (CentOS/Ubuntu/Rocky): 172.17.0.1 ← 대부분의 경우
# - 원격 MongoDB 서버: 192.168.1.200 (실제 IP)
# - 로컬 개발 (컨테이너 없이): localhost
#
# 【현재 설정】host 네트워크 모드 + 로컬 MongoDB → 127.0.0.1
MONGO_HOST=127.0.0.1
# MongoDB 포트
MONGO_PORT=27017
# MongoDB 인증 정보
# - 데이터베이스별 인증 사용 (authSource=MONGO_DATABASE)
# - 권한: MONGO_DATABASE에 대한 readWrite 권한 필요
MONGO_USER=exlink
MONGO_PASSWORD=!wkcproqkf1
# MongoDB 데이터베이스 및 컬렉션
MONGO_DATABASE=chat_history
MONGO_COLLECTION=rag_conversations
# MongoDB 데이터 보관 기간 (TTL)
# - 지정된 기간 이후 자동으로 오래된 대화 기록 삭제
# - 단위: 일(day)
# - 권장값: 30 (한 달), 7 (일주일), 90 (3개월)
# - 기본값: 30일
MONGO_TTL_DAYS=30
# ⚠️ 중요: MongoDB가 없으면 대화 이력 기능이 비활성화됩니다!
# - 컨테이너 로그에서 "[Service] ✅ 대화 이력 기능 활성화" 확인
# - MongoDB 연결 테스트: docker exec rag-project-api-1 python3 /app/scripts/test_mongodb.py
# - 컨테이너 내부 접근 확인: docker exec rag-project-api-1 curl -v telnet://$MONGO_HOST:27017
# ============================================
# 사용 예시
# ============================================
# 1. 내부 LLM (모든 서비스 같은 서버):
# LLM_HOST=192.168.1.100
# LLM_PORT=16000
# TEI_EMBED_HOST=192.168.1.100
# TEI_EMBED_PORT=16001
# TEI_RERANK_HOST=192.168.1.100
# TEI_RERANK_PORT=16002
#
# 2. 서버 분리 (LLM과 TEI가 다른 서버):
# LLM_HOST=192.168.1.100
# LLM_PORT=8000
# TEI_EMBED_HOST=192.168.1.200
# TEI_EMBED_PORT=80
# TEI_RERANK_HOST=192.168.1.200
# TEI_RERANK_PORT=81
#
# 3. OpenAI API 사용:
# LLM_BASE_URL=https://api.openai.com # 직접 URL 지정도 가능
# LLM_MODEL_NAME=gpt-4o-mini
# LLM_API_KEY=sk-proj-xxxxx
# TEI_EMBED_HOST=192.168.1.100
# TEI_EMBED_PORT=16001
# # ... (TEI는 그대로 사용)
#
# 4. Qdrant 사용 시:
# VECTOR_STORE=qdrant
# docker-compose --profile qdrant up -d qdrant