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가 모두 실행됩니다.

사전 요구사항

항목최소 버전확인 명령
Docker20.10+docker --version
Docker ComposeV2 (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:18080NiceGUI 통합 대시보드 (21개 페이지)
API 서버http://localhost:8600FastAPI 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 서버 없이 로컬 파일 하나로 동작합니다.

사전 요구사항 (로컬 실행)

항목최소 버전확인 명령
Python3.11+python --version
uv최신uv --version

주요 의존성 (pyproject.toml)

패키지버전용도
fastapi>=0.115REST API 서버
uvicorn>=0.30ASGI 서버
nicegui>=3.8대시보드 UI (21개 페이지)
openai>=1.0LLM 클라이언트 (OpenAI-compatible)
httpx>=0.27비동기 HTTP 클라이언트
apscheduler>=3.10이상탐지 스케줄러
aiosqlite>=0.20비동기 SQLite
chromadb>=0.5벡터 DB (RAG)
oracledb>=2.0, <3.0Oracle DB 커넥터
pydantic>=2.0데이터 검증
pydantic-settings>=2.0설정 관리
pyyaml>=6.0규칙 YAML 파싱
plotly>=5.0대시보드 차트
mcp>=1.0MCP 프로토콜 (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.pycore/db/oracle.py의 함수들을 SQLite 버전으로 monkey-patch합니다. 나머지 코드는 수정 없이 동작합니다. Oracle 직접 연결 시에는 --no-sqlite 플래그를 사용합니다.

CLI 인자

인자기본값설명
--sqlite <path>simulator.dbSQLite DB 경로 (지정 시 SQLite 모드)
--no-sqlitefalseSQLite 비활성화 → Oracle 직접 연결
--interval <sec>config 값 (300)이상탐지 주기 (초)
--host <addr>0.0.0.0바인드 호스트
--port <num>8600API 서버 포트

작동 원리

swap_horiz
Monkey-patch 패턴
원본 함수 (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로 자동 변환합니다 (예: SYSTIMESTAMPCURRENT_TIMESTAMP, NUMBER GENERATED ALWAYS AS IDENTITYINTEGER 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 연결 방법

  1. 대시보드 로그인admin / fab-admin
  2. Tool Studio → DB 연결 관리 → "연결 추가"
  3. 연결 정보 입력 (이름, 타입: oracle, Host/Port/SID)
  4. "연결 테스트" → 성공 확인
  5. 도구 생성 시 연결을 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

전환 절차

  1. Oracle 테이블 생성DB Manual DDL 순서대로 실행
  2. 기본 데이터 INSERT — admin 계정, fab_tools, system_settings
  3. 환경변수 설정ORACLE_USER, ORACLE_PASSWORD, ORACLE_DSN
  4. --no-sqlite 플래그 사용하여 서버 시작
  5. 규칙 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()

전환 절차

  1. Milvus 서버 구축 — K8s 또는 standalone
  2. MilvusVectorStore 구현BaseVectorStore 상속
  3. 등록 — 서버 시작 코드에서 set_vectorstore() 호출
  4. 임베딩 재생성 — 기존 문서 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 스트림 종료

주요 기능

auto_awesome
핵심 기능 목록
기능설명
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로 안전하게 실행합니다. 수치 분석, 통계, 차트 생성 등 데이터 기반 질문에 자동 활용됩니다.

지원 라이브러리

패키지용도
pandasDataFrame 기반 데이터 분석
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 이미지

history 도구 감사 로그 & 버전 관리

Tool Studio 도구의 모든 변경사항을 추적합니다. 누가 언제 무엇을 변경했는지 기록하고, SQL/파라미터 변경 시 버전 스냅샷을 자동 저장합니다.

감사 로그

receipt_long
tool_audit_log 테이블
필드설명
tool_id대상 도구 ID
actioncreated / updated / deleted / enabled / disabled
changed_by작업자 username
changed_at변경 시각
changesJSON diff — {field: {old, new}}

버전 스냅샷

difference
tool_versions 테이블

SQL, 파라미터, 컬럼이 변경될 때만 새 버전을 생성합니다. 도구의 version 필드가 자동 증가합니다.

필드설명
version버전 번호 (1, 2, 3, ...)
sql_query해당 버전의 SQL 전문
parameters파라미터 JSON
columns컬럼 정의 JSON
changed_by변경자

API

GET /api/tool-studio/tools/{id}/history       # 감사 로그
GET /api/tool-studio/tools/{id}/versions      # 버전 목록
GET /api/tool-studio/tools/{id}/versions/{v}  # 특정 버전 스냅샷

cable MCP 서버 — Claude 연동

Tool Studio의 모든 활성 도구를 MCP 프로토콜(stdio)로 외부에 노출합니다. Claude Desktop, Claude Code 등에서 FAB 도구를 직접 호출할 수 있습니다.

MCP 서버 아키텍처 Claude ←─ stdio ─→ mcp_server.pytool_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"]
    }
  }
}

특징

tune 환경변수 총정리

check_circle
프로젝트 루트의 .env.example 파일을 복사하여 사용하세요: cp .env.example .env → 값만 채우면 끝.
변수기본값설명
Oracle DB
ORACLE_USERfabOracle 사용자
ORACLE_PASSWORD(없음)Oracle 비밀번호
ORACLE_DSNlocalhost:1521/XEPDB1Oracle 접속 문자열
LLM
LLM_BASE_URLGemini OpenAI-compat URLLLM API base URL
LLM_API_KEY(없음)LLM API 키
LLM_MODELgemini-2.0-flash모델 ID
LLM_TIMEOUT120LLM 요청 타임아웃 (초)
LLM_MAX_TOKENS4096LLM 최대 응답 토큰 수
임베딩
RAG_EMBED_BACKENDgeminigemini 또는 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_SEC300감지 기본 간격 (초)
DETECTION_TICK_SEC60스케줄러 틱 간격 (초)
DEBUGfalse디버그 모드
API_URLhttp://localhost:8600UI → API 연결 URL
SQLITE_PATH(없음)Docker 환경에서 SQLite DB 경로 (예: /app/data/simulator.db)

checklist 운영 배포 체크리스트

checklist
FAB 폐쇄망 배포 시 확인 사항
  1. Oracle 테이블 생성DB Manual DDL 실행 (FK 순서 주의)
  2. 기본 데이터 INSERT — admin 계정, fab_tools, system_settings
  3. 환경변수 설정ORACLE_*, LLM_*, RAG_EMBED_*
  4. 사내 LLM 연결 확인curl $LLM_BASE_URL/models
  5. 사내 임베딩 연결 확인curl $RAG_EMBED_BASE_URL/embeddings
  6. Milvus 필요 시MilvusVectorStore 구현 + set_vectorstore()
  7. Code Interpreter 패키지 확인pandas, numpy, scipy, scikit-learn, matplotlib 설치 확인
  8. 서버 시작python main.py --no-sqlite
  9. 시작 로그 확인 — "Rules seeded from YAML" 또는 "DB has N rules"
  10. 헬스체크curl localhost:8600/health{"status":"ok","db":"connected","mode":"oracle"}
  11. KB 문서 등록 + 재임베딩 — 임베딩 모델 변경 시 필수