Deployment Guide
Docker 한 줄로 시작하고, 개발(SQLite)에서 운영(Oracle + Milvus)으로 전환하는 가이드
info
FLOPI는 교체 가능한 4개 컴포넌트로 설계되어 있습니다:
관계형 DB, 벡터 DB, LLM, 임베딩 모델.
각 컴포넌트는 추상 인터페이스 + 환경변수로 독립 전환 가능합니다.
architecture 전체 구조
개발 환경 (시뮬레이터)
FastAPI ─→ core/db/oracle.py ──(monkey-patch)──→ SQLite
RAG ─→ core/rag/vectorstore.py ─────────────→ ChromaDB (로컬 파일)
AI ─→ core/llm/client.py ───────────────────→ Gemini API
Embed ─→ core/rag/embedder.py ─────────────────→ Gemini Embedding
운영 환경 (FAB 폐쇄망)
FastAPI ─→ core/db/oracle.py ───────────────────→ Oracle DB
RAG ─→ core/rag/vectorstore.py ─────────────→ Milvus
AI ─→ core/llm/client.py ───────────────────→ 사내 LLM (vLLM)
Embed ─→ core/rag/embedder.py ─────────────────→ 사내 임베딩 모델
파일 맵 — 어디를 바꾸나
| 컴포넌트 | 추상 인터페이스 | 전환 방법 |
| 관계형 DB |
core/db/oracle.py |
--no-sqlite 플래그 + Oracle 환경변수 |
| 벡터 DB |
core/rag/vectorstore.py
BaseVectorStore |
set_vectorstore(MilvusStore()) |
| LLM |
core/llm/client.py OpenAI-compatible |
환경변수 3개 (LLM_*) |
| 임베딩 |
core/rag/embedder.py
BaseEmbedder |
환경변수 4개 (RAG_EMBED_*) |
deployed_code Docker 배포 권장
check_circle
가장 쉬운 배포 방법입니다. Python, uv, 의존성 설치 없이
Docker만 있으면 docker compose up -d 한 줄로 API + UI가 모두 실행됩니다.
사전 요구사항
| 항목 | 최소 버전 | 확인 명령 |
| Docker | 20.10+ | docker --version |
| Docker Compose | V2 (docker compose) | docker compose version |
1. 환경변수 설정
프로젝트 루트에 .env 파일을 생성합니다. LLM 연결 정보만 필수입니다.
# .env — 최소 설정 (LLM만 필수)
LLM_BASE_URL="http://llm-server:8000/v1" # 사내 vLLM / Ollama / Gemini
LLM_API_KEY="your-api-key" # API 키 (폐쇄망이면 빈 값 가능)
LLM_MODEL="Qwen/Qwen2.5-72B" # 사용할 모델 ID
info
Gemini를 사용하려면:
LLM_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai,
LLM_MODEL=gemini-2.0-flash로 설정하세요.
전체 환경변수 목록은
환경변수 총정리를 참고하세요.
2. 실행
# 컨테이너 시작 (백그라운드)
docker compose up -d
# 로그 확인
docker compose logs -f
# 중지
docker compose down
3. 접속 정보
| 서비스 | URL | 설명 |
| UI 대시보드 | http://localhost:18080 | NiceGUI 통합 대시보드 (21개 페이지) |
| API 서버 | http://localhost:8600 | FastAPI REST API |
기본 로그인: admin / fab-admin
데모 데이터 주입 (선택)
처음 실행하면 테이블이 비어 있습니다. 시연용 데이터를 넣으면 대시보드 KPI, 이상 목록 등을 바로 체험할 수 있습니다.
# Tool Studio 도구 import (최초 1회)
docker exec flopi-api .venv/bin/python import_seed.py --sqlite /app/data/simulator.db
# MES 시뮬레이션 데이터 + 이상탐지 이력 주입
docker exec flopi-api .venv/bin/python data_injector.py --reset
# 점진적 악화 시나리오 — 라이브 시연용 (Ctrl+C로 중지)
docker exec flopi-api .venv/bin/python data_injector.py --loop --speed 2
| 주입 항목 | 설명 |
| MES 데이터 | 설비/물류/WIP/품질/에너지 시뮬레이션 (38개 테이블) |
| 이상탐지 이력 | critical/warning 등급 이상 감지 기록 |
| 감지 사이클 | 감지 엔진 실행 로그 |
info
운영 환경에서는 데모 데이터를 주입하지 않고, Tool Studio에서 실제 MES Oracle을 연결하세요.
아키텍처
Docker Compose 구성
flopi-api (ghcr.io/donchoru/flopi:1.7.0)
├── FastAPI :8600
├── APScheduler (이상탐지 스케줄)
├── Code Interpreter (pandas/numpy/scipy/sklearn/matplotlib)
└── Volume: flopi-db → /app/data (SQLite DB)
flopi-ui (ghcr.io/donchoru/flopi:1.7.0)
├── NiceGUI :18080 (21개 페이지)
└── API_URL → http://localhost:8600
flopi-backup (ghcr.io/donchoru/flopi:1.7.0)
├── 매일 04:00 자동 백업
└── Volume: ./backups (로컬 백업 디렉토리)
┌─────────────────────────────────────────────┐
│ flopi-db (Docker Volume) │
│ └── simulator.db (시스템 DB) │
│ flopi-vectors (Docker Volume) │
│ └── chroma_data/ (벡터 DB) │
└─────────────────────────────────────────────┘
폐쇄망 배포 (오프라인)
인터넷이 차단된 FAB 폐쇄망에서는 이미지를 파일로 반입합니다.
Step 1 — 인터넷 환경에서 이미지 다운로드
GitHub Releases에서 flopi-image.tar.gz를 다운로드하거나, 직접 pull하여 저장합니다.
# 방법 A: GitHub Release에서 다운로드
# → https://github.com/donchoru/FLOPI/releases 에서 flopi-image.tar.gz 다운로드
# 방법 B: 직접 pull 후 저장
docker pull ghcr.io/donchoru/flopi:1.7.0
docker save ghcr.io/donchoru/flopi:1.7.0 | gzip > flopi-image.tar.gz
Step 2 — 폐쇄망으로 반입 후 로드
# 이미지 로드
docker load < flopi-image.tar.gz
# .env 파일 작성 (사내 LLM 연결 정보)
# → 위 "환경변수 설정" 참고
# 실행
docker compose up -d
warning
폐쇄망에서는 외부 LLM (Gemini 등) 사용 불가.
사내 vLLM, Ollama 등 폐쇄망 내부 LLM 서버를 LLM_BASE_URL로 지정해야 합니다.
임베딩도 마찬가지로 RAG_EMBED_* 환경변수로 사내 서버를 설정하세요.
science SQLite 시뮬레이터 모드
개발/데모용. 외부 DB 서버 없이 로컬 파일 하나로 동작합니다.
사전 요구사항 (로컬 실행)
| 항목 | 최소 버전 | 확인 명령 |
| Python | 3.11+ | python --version |
| uv | 최신 | uv --version |
주요 의존성 (pyproject.toml)
| 패키지 | 버전 | 용도 |
fastapi | >=0.115 | REST API 서버 |
uvicorn | >=0.30 | ASGI 서버 |
nicegui | >=3.8 | 대시보드 UI (21개 페이지) |
openai | >=1.0 | LLM 클라이언트 (OpenAI-compatible) |
httpx | >=0.27 | 비동기 HTTP 클라이언트 |
apscheduler | >=3.10 | 이상탐지 스케줄러 |
aiosqlite | >=0.20 | 비동기 SQLite |
chromadb | >=0.5 | 벡터 DB (RAG) |
oracledb | >=2.0, <3.0 | Oracle DB 커넥터 |
pydantic | >=2.0 | 데이터 검증 |
pydantic-settings | >=2.0 | 설정 관리 |
pyyaml | >=6.0 | 규칙 YAML 파싱 |
plotly | >=5.0 | 대시보드 차트 |
mcp | >=1.0 | MCP 프로토콜 (Claude 연동) |
python-dotenv | >=1.0 | .env 파일 로드 |
info
Code Interpreter 추가 패키지: AI Chat의 코드 실행 기능을 사용하려면
pandas, numpy, scipy, scikit-learn,
matplotlib가 필요합니다. uv sync 또는 pip install로 설치하세요.
# 의존성 설치
uv sync
# 최초 실행 — DB 초기화 + 시뮬레이션 데이터 생성
.venv/bin/python init_db.py
# API 서버 시작 (SQLite 모드)
.venv/bin/python main.py --sqlite simulator.db --interval 60
# UI 대시보드 (별도 터미널, 기본 포트 18080)
.venv/bin/python -m ui.main
check_circle
--sqlite 플래그가 핵심입니다 (기본값: simulator.db).
이 플래그가 있으면 sqlite_backend.py가 core/db/oracle.py의 함수들을
SQLite 버전으로 monkey-patch합니다. 나머지 코드는 수정 없이 동작합니다.
Oracle 직접 연결 시에는 --no-sqlite 플래그를 사용합니다.
CLI 인자
| 인자 | 기본값 | 설명 |
--sqlite <path> | simulator.db | SQLite DB 경로 (지정 시 SQLite 모드) |
--no-sqlite | false | SQLite 비활성화 → Oracle 직접 연결 |
--interval <sec> | config 값 (300) | 이상탐지 주기 (초) |
--host <addr> | 0.0.0.0 | 바인드 호스트 |
--port <num> | 8600 | API 서버 포트 |
작동 원리
| 원본 함수 (oracle.py) | SQLite 대체 | 역할 |
execute() | _execute() | SELECT 쿼리 |
execute_dml() | _execute_dml() | INSERT/UPDATE/DELETE |
execute_returning() | _execute_returning() | INSERT ... RETURNING → lastrowid |
init_pool() | _noop_async() | 커넥션 풀 (SQLite에선 불필요) |
close_pool() | _noop_async() | 풀 종료 (noop) |
sql_compat.py가 Oracle SQL 문법을 SQLite로 자동 변환합니다
(예: SYSTIMESTAMP → CURRENT_TIMESTAMP,
NUMBER GENERATED ALWAYS AS IDENTITY → INTEGER PRIMARY KEY AUTOINCREMENT).
join_inner 하이브리드 모드 — SQLite + MES Oracle
가장 간편한 사내 배포 방식. FLOPI 시스템 데이터는 SQLite에 저장하고, MES 실데이터만 Tool Studio의 Oracle 연결로 조회합니다.
FLOPI (SQLite 모드)
시스템 DB (SQLite) Tool Studio
├── 규칙 / 이상 / RCA / 워크플로우 ├── Oracle 연결 ──→ 실제 MES DB
├── 사용자 / 설정 / 활동로그 │ ├── 설비 현황 (V_EQP_STATUS)
├── AI Chat 세션 │ ├── WIP 조회 (V_WIP_BY_STEP)
└── Tool Studio 도구 정의 │ ├── 물류 현황 (TB_TRANSFER_HIST)
│ └── ...
이상탐지 엔진 ── 규칙에서 Tool Studio 도구 호출 ──┘
장점
| 항목 | 설명 |
| Oracle 스키마 셋업 | 불필요 — schema.sql 실행 안 해도 됨 |
| 배포 소요시간 | 5분 이내 — init_db.py → main.py 로 즉시 시작 |
| MES 실데이터 | Tool Studio에서 Oracle 연결 추가만 하면 실데이터 조회 가능 |
| 이상탐지 | 규칙이 Tool Studio 도구를 통해 MES 실데이터 기반 감지 |
| 확장성 | 나중에 Oracle 전환 시 코드 변경 없음 (sql_compat 자동 변환) |
| 백업 | SQLite 파일 복사만으로 완료 (cp simulator.db backup.db) |
셋업 (4단계)
# 1. 의존성 설치
uv sync
# 2. SQLite DB 초기화 (코어 32개 테이블 + admin 계정 + 기본 도구)
.venv/bin/python init_db.py simulator.db
# 3. API 서버 시작
.venv/bin/python main.py --sqlite simulator.db --interval 300
# 4. 대시보드 시작 (별도 터미널)
.venv/bin/python -m ui.main --port 18080
MES Oracle 연결 방법
- 대시보드 로그인 →
admin / fab-admin
- Tool Studio → DB 연결 관리 → "연결 추가"
- 연결 정보 입력 (이름, 타입: oracle, Host/Port/SID)
- "연결 테스트" → 성공 확인
- 도구 생성 시 연결을 MES로 선택, SQL에 실제 MES 테이블/뷰 사용
SQLite 프로덕션 적합성
| 항목 | 평가 |
| 동시 접속 | 팀 단위 (5~20명) → WAL 모드로 충분 |
| 데이터 규모 | 이상/규칙/로그 수만 건 → 문제없음 |
| MES 데이터 | Tool Studio가 Oracle에서 직접 조회 → SQLite 부하 없음 |
| 확장 | 필요 시 Oracle 전환 가능 (코드 변경 없음) |
lightbulb
팁: 하이브리드 모드로 시작해서 시스템이 안정되면 Oracle로 전환하는 것을 권장합니다.
SQLite → Oracle 전환은
DB 전환 가이드를 참고하세요.
dns Oracle 운영 모드
Oracle로 전체 시스템을 운영하려는 경우입니다. 하이브리드 모드로 충분하면 이 섹션은 건너뛰세요.
# 환경변수 설정
export ORACLE_USER="fab"
export ORACLE_PASSWORD="your_password"
export ORACLE_DSN="dbhost:1521/FABPDB"
# API 서버 시작 (Oracle 모드 — --no-sqlite 플래그)
.venv/bin/python main.py --no-sqlite
# UI 대시보드 (포트 18080)
.venv/bin/python -m ui.main
warning
Oracle 모드에서는 테이블을
수동으로 미리 생성해야 합니다.
DB Manual의 DDL을 순서대로 실행하세요.
storage DB 전환: SQLite → Oracle
전환 절차
- Oracle 테이블 생성 — DB Manual DDL 순서대로 실행
- 기본 데이터 INSERT — admin 계정, fab_tools, system_settings
- 환경변수 설정 —
ORACLE_USER, ORACLE_PASSWORD, ORACLE_DSN
--no-sqlite 플래그 사용하여 서버 시작
- 규칙 seed 확인 — DB 비어있으면
rules.yaml에서 자동 seed
관련 파일
| 파일 | 역할 | 전환 시 변경 |
main.py |
--sqlite / --no-sqlite 플래그 처리 |
--no-sqlite 플래그로 실행 |
config.py |
OracleConfig (환경변수) |
ORACLE_* 환경변수 설정 |
core/db/oracle.py |
oracledb 커넥션 풀 |
변경 없음 (자동) |
core/simulator/sqlite_backend.py |
SQLite monkey-patch |
사용 안 됨 (--sqlite 없으면) |
core/simulator/sql_compat.py |
Oracle→SQLite SQL 변환 |
사용 안 됨 |
core/db/schema.sql |
Oracle DDL 원본 |
테이블 수동 생성 시 참고 |
init_db.py |
SQLite 전용 초기화 |
Oracle에서는 사용 안 함 |
주의사항
info
데이터 마이그레이션은 별도 작업입니다.
SQLite → Oracle로 기존 데이터를 옮기려면 별도 스크립트가 필요합니다.
신규 배포라면 빈 Oracle DB에 DDL + seed 데이터만 넣으면 됩니다.
hub 벡터 DB 전환: ChromaDB → Milvus
현재 구조
추상 인터페이스 구현체 저장소
BaseVectorStore ←── ChromaVectorStore ──→ chroma_data/ (로컬)
upsert()
search() ←── MilvusVectorStore ──→ Milvus 서버 (구현 필요)
delete()
count()
전환 절차
- Milvus 서버 구축 — K8s 또는 standalone
MilvusVectorStore 구현 — BaseVectorStore 상속
- 등록 — 서버 시작 코드에서
set_vectorstore() 호출
- 임베딩 재생성 — 기존 문서 re-embed 필요
구현 예시
# core/rag/milvus_store.py (신규 파일)
from core.rag.vectorstore import BaseVectorStore
class MilvusVectorStore(BaseVectorStore):
def __init__(self, host="localhost", port=19530, collection="kb_chunks"):
from pymilvus import connections, Collection
connections.connect(host=host, port=port)
self.collection = Collection(collection)
async def upsert(self, ids, embeddings, documents, metadatas):
# pymilvus insert 구현
...
async def search(self, query_embedding, top_k=5, where=None):
# pymilvus search 구현 → [{id, document, metadata, score}] 반환
...
async def delete(self, ids):
...
async def count(self):
...
# main.py lifespan에 추가
from core.rag.vectorstore import set_vectorstore
from core.rag.milvus_store import MilvusVectorStore
set_vectorstore(MilvusVectorStore(host="milvus-host", port=19530))
관련 파일
| 파일 | 역할 | 전환 시 변경 |
core/rag/vectorstore.py |
추상 클래스 + ChromaDB 구현 + 싱글턴 |
set_vectorstore() 호출 |
core/rag/milvus_store.py |
Milvus 구현 (신규) |
새로 작성 |
core/rag/searcher.py |
검색 통합 레이어 |
변경 없음 (추상 인터페이스 사용) |
core/rag/embedder.py |
임베딩 모델 |
변경 없음 (독립) |
config.py |
RAG_CHROMA_DIR |
Milvus에선 사용 안 함 |
info
searcher.py, KB API, 워크플로우 rag_search 노드는 모두
get_vectorstore()를 통해 추상 인터페이스만 호출하므로
벡터 저장소를 갈아끼워도 나머지 코드는 수정 불필요합니다.
psychology LLM 전환: Gemini → 사내 모델
FLOPI의 LLM 클라이언트는 OpenAI-compatible API를 사용합니다.
vLLM, Ollama, TGI 등 OpenAI 호환 엔드포인트를 제공하는 서버라면
환경변수 3개만 바꾸면 즉시 전환됩니다.
환경변수
| 변수 | Gemini (기본) | 사내 vLLM 예시 | Ollama 예시 |
LLM_BASE_URL |
https://generativelanguage.googleapis.com/v1beta/openai |
http://llm-server:8000/v1 |
http://localhost:11434/v1 |
LLM_API_KEY |
Gemini API 키 |
사내 토큰 또는 빈 값 |
ollama |
LLM_MODEL |
gemini-2.0-flash |
Qwen/Qwen2.5-72B |
qwen2.5:14b |
# .env 또는 export
export LLM_BASE_URL="http://llm-server:8000/v1"
export LLM_API_KEY="your-token"
export LLM_MODEL="Qwen/Qwen2.5-72B"
관련 파일
| 파일 | 역할 | 전환 시 변경 |
config.py |
LLMConfig — 환경변수 읽기 |
환경변수만 설정 |
core/llm/client.py |
OpenAI SDK 클라이언트 |
변경 없음 |
check_circle
코드 변경 없이 환경변수만으로 전환됩니다.
이상탐지 AI 에이전트, 딥 RCA, AI Chat, 워크플로우 ai_analysis 노드 —
모든 LLM 호출이 동일한 LLMClient를 사용합니다.
data_array 임베딩 전환: Gemini → 사내 모델
임베딩 모델은 LLM과 별도로 관리됩니다.
2가지 백엔드가 내장되어 있습니다:
| 백엔드 | 클래스 | 사용 환경 |
| gemini (기본) |
GeminiEmbedder |
Gemini Native API (httpx 직접 호출) |
| openai |
OpenAICompatibleEmbedder |
OpenAI, vLLM, TEI 등 OpenAI-compatible |
환경변수
| 변수 | Gemini (기본) | 사내 모델 예시 |
RAG_EMBED_BACKEND |
gemini |
openai |
RAG_EMBED_BASE_URL |
(사용 안 함) |
http://embed-server:8080/v1 |
RAG_EMBED_API_KEY |
(LLM 키 공유) |
사내 토큰 |
RAG_EMBED_MODEL |
gemini-embedding-001 |
bge-m3 |
# 사내 임베딩 서버 전환
export RAG_EMBED_BACKEND="openai"
export RAG_EMBED_BASE_URL="http://embed-server:8080/v1"
export RAG_EMBED_API_KEY="your-token"
export RAG_EMBED_MODEL="bge-m3"
관련 파일
| 파일 | 역할 | 전환 시 변경 |
config.py |
EmbeddingConfig |
환경변수만 설정 |
core/rag/embedder.py |
추상 + Gemini/OpenAI 구현 + 싱글턴 |
변경 없음 (get_embedder()가 자동 선택) |
warning
임베딩 모델을 교체하면 벡터 차원이 달라질 수 있습니다.
기존 Knowledge Base 문서의 임베딩을 전부 재생성해야 합니다.
KB 관리 페이지에서 "재임베딩" 또는 POST /api/knowledge-base/{id}/reembed 사용.
smart_toy AI Chat — FAB 전문 어시스턴트
Tool Studio 도구를 자동으로 활용하여 실제 FAB 데이터 기반 답변을 제공하는 SSE 스트리밍 채팅입니다.
AI Chat 동작 흐름
사용자 질문 ─→ Tool Selector ─→ 시맨틱 유사도 기반 도구 자동 선택
↓
LLM (tool calling) ─→ 도구 호출 라운드 (최대 N회)
↓
SSE 이벤트 스트리밍
├── tool_call 도구 호출 시작
├── tool_result 도구 실행 결과
├── token 답변 텍스트 토큰
├── follow_up 후속 추천 질문 (3개)
└── done 스트림 종료
주요 기능
| 기능 | 설명 |
| SSE 스트리밍 | 도구 호출 과정 + 최종 답변을 실시간 표시 |
| 자동 도구 선택 | 질문을 임베딩하여 도구 설명과 유사도 비교 → 최적 도구 선택 |
| 후속 질문 추천 | LLM이 대화 맥락 기반 FAB 도구 활용 가능한 질문 3개 생성 |
| 동적 시작 질문 | 인기 도구 (24시간 Top 3) 기반 추천 질문 자동 표시 |
| 세션 관리 | 대화 이력 DB 저장, 세션 목록/재개/삭제 |
API 엔드포인트
# 채팅 (SSE 스트리밍)
POST /api/ai-chat
# 세션 관리
GET /api/ai-chat/sessions
POST /api/ai-chat/sessions
GET /api/ai-chat/sessions/{id}
DELETE /api/ai-chat/sessions/{id}
# 도구
GET /api/ai-chat/tools
GET /api/ai-chat/suggested-questions
code Code Interpreter — Python 코드 실행
AI Chat에서 LLM이 생성한 Python 코드를 subprocess로 안전하게 실행합니다.
수치 분석, 통계, 차트 생성 등 데이터 기반 질문에 자동 활용됩니다.
지원 라이브러리
| 패키지 | 용도 |
pandas | DataFrame 기반 데이터 분석 |
numpy | 수치 연산 |
scipy | 과학/통계 연산 |
sklearn (scikit-learn) | 머신러닝 분석 |
matplotlib | 차트/그래프 생성 (이미지 base64 반환) |
statistics, math, json, datetime, collections, itertools, ... | Python 표준 라이브러리 |
warning
배포 시 주의: Code Interpreter는 위 라이브러리가 런타임에 설치되어 있어야 합니다.
Docker 이미지에는 포함되어 있지만, 로컬 실행 시 uv sync 또는
pip install pandas numpy scipy scikit-learn matplotlib로 별도 설치가 필요할 수 있습니다.
보안상 os.system, subprocess, 파일 삭제 등 위험 패턴은 차단됩니다.
동작 방식
Code Interpreter 실행 흐름
사용자 질문 ─→ LLM ─→ tool_call: code_interpreter(code)
↓
subprocess 실행 (타임아웃 30초)
├── stdout → 텍스트 결과
├── DataFrame → 테이블 결과
└── matplotlib → base64 이미지
cable MCP 서버 — Claude 연동
Tool Studio의 모든 활성 도구를 MCP 프로토콜(stdio)로 외부에 노출합니다.
Claude Desktop, Claude Code 등에서 FAB 도구를 직접 호출할 수 있습니다.
MCP 서버 아키텍처
Claude ←─ stdio ─→ mcp_server.py
↓
tool_registry.dispatch()
↓
DataStudioManager.execute_tool()
↓
SQL 실행 (Oracle / SQLite)
설정 (.mcp.json)
// Claude Desktop 또는 Claude Code 설정
{
"mcpServers": {
"flopi": {
"command": "uv",
"args": ["run", "python", "mcp_server.py", "--sqlite", "simulator.db"]
}
}
}
특징
- 동적 도구 로딩 — DB에서 활성 도구를 실시간으로 읽어 MCP Tool로 변환
- Rate Limiting — 도구별 분당 호출 제한 적용
- 캐싱 — TTL 기반 결과 캐싱
- 결과 자르기 — 최대 200행으로 응답 크기 제한
- 쿼리 로깅 — 모든 호출
ds_query_log에 기록
tune 환경변수 총정리
check_circle
프로젝트 루트의 .env.example 파일을 복사하여 사용하세요:
cp .env.example .env → 값만 채우면 끝.
| 변수 | 기본값 | 설명 |
| Oracle DB |
ORACLE_USER | fab | Oracle 사용자 |
ORACLE_PASSWORD | (없음) | Oracle 비밀번호 |
ORACLE_DSN | localhost:1521/XEPDB1 | Oracle 접속 문자열 |
| LLM |
LLM_BASE_URL | Gemini OpenAI-compat URL | LLM API base URL |
LLM_API_KEY | (없음) | LLM API 키 |
LLM_MODEL | gemini-2.0-flash | 모델 ID |
LLM_TIMEOUT | 120 | LLM 요청 타임아웃 (초) |
LLM_MAX_TOKENS | 4096 | LLM 최대 응답 토큰 수 |
| 임베딩 |
RAG_EMBED_BACKEND | gemini | gemini 또는 openai |
RAG_EMBED_BASE_URL | (없음) | OpenAI-compat 임베딩 URL |
RAG_EMBED_API_KEY | (없음) | 임베딩 API 키 (미설정 시 LLM 키 사용) |
RAG_EMBED_MODEL | (없음) | 임베딩 모델 ID (예: gemini-embedding-001, bge-m3) |
| 벡터 DB |
RAG_CHROMA_DIR | (없음) | ChromaDB 저장 경로 (예: chroma_data/) |
| 스케줄러 / 시스템 |
DETECTION_INTERVAL_SEC | 300 | 감지 기본 간격 (초) |
DETECTION_TICK_SEC | 60 | 스케줄러 틱 간격 (초) |
DEBUG | false | 디버그 모드 |
API_URL | http://localhost:8600 | UI → API 연결 URL |
SQLITE_PATH | (없음) | Docker 환경에서 SQLite DB 경로 (예: /app/data/simulator.db) |
checklist 운영 배포 체크리스트
- Oracle 테이블 생성 — DB Manual DDL 실행 (FK 순서 주의)
- 기본 데이터 INSERT — admin 계정, fab_tools, system_settings
- 환경변수 설정 —
ORACLE_*, LLM_*, RAG_EMBED_*
- 사내 LLM 연결 확인 —
curl $LLM_BASE_URL/models
- 사내 임베딩 연결 확인 —
curl $RAG_EMBED_BASE_URL/embeddings
- Milvus 필요 시 —
MilvusVectorStore 구현 + set_vectorstore()
- Code Interpreter 패키지 확인 —
pandas, numpy, scipy, scikit-learn, matplotlib 설치 확인
- 서버 시작 —
python main.py --no-sqlite
- 시작 로그 확인 — "Rules seeded from YAML" 또는 "DB has N rules"
- 헬스체크 —
curl localhost:8600/health → {"status":"ok","db":"connected","mode":"oracle"}
- KB 문서 등록 + 재임베딩 — 임베딩 모델 변경 시 필수