옵션 A: Docker (권장)
로컬 Python 또는 Node.js가 필요 없습니다 — 모든 것이 컨테이너 내부에서 빌드됩니다.fim-data, fim-uploads)에 유지되며 컨테이너 재시작 후에도 유지됩니다.
참고: Docker 모드는 핫 리로드를 지원하지 않습니다. 코드 변경 시 이미지를 다시 빌드해야 합니다(docker compose up --build -d). 라이브 리로드를 사용한 활성 개발의 경우 아래의 옵션 B를 사용하세요.
옵션 B: 로컬 개발
필수 요구사항: Python 3.11+, uv, Node.js 18+, pnpm.구성
FIM One은 모든 OpenAI 호환 LLM 제공자와 함께 작동합니다 — OpenAI, DeepSeek, Anthropic, Qwen, Ollama, vLLM 등.
**Jina AI**는 웹 검색/페치, 임베딩 및 전체 RAG 파이프라인을 활성화합니다(무료 티어 사용 가능).
최소
.env:
프로덕션 배포
Docker (권장)
docker compose up -d는 필요한 모든 것을 실행합니다 — 수동 서비스 구성이 필요 없습니다:
워커를 통한 확장
기본적으로 API는 단일 워커 프로세스로 실행됩니다. 더 많은 동시 사용자를 처리하려면.env를 통해 워커를 증가시키세요:
- PostgreSQL — SQLite는 단일 쓰기 방식이며 동시 쓰기를 지원하지 않습니다.
DATABASE_URL을 PostgreSQL 연결 문자열로 설정하세요. - Redis — Docker Compose에 이미 포함되어 있습니다(자동 구성). 워커 간 인터럽트/인젝트 릴레이를 처리합니다.
WORKERS=1(기본값)인 경우 Redis나 PostgreSQL이 필요하지 않습니다 — SQLite가 잘 작동합니다.
Nginx 역방향 프록시
HTTPS 및 사용자 정의 도메인의 경우 Nginx 역방향 프록시를 앞에 배치하세요:/api/* 요청을 자동으로 프록시합니다. 포트 3000만 노출하면 됩니다.
코드 실행 샌드박스
코드 실행 샌드박스(CODE_EXEC_BACKEND=docker)를 사용하는 경우 Docker 소켓을 마운트하세요:
Cloudflare Tunnel
포트를 열지 않는 설정을 위해 Nginx 대신 Cloudflare Tunnel을 사용하세요. 모든 트래픽이 Cloudflare의 엣지를 통해 흐르므로 포트 80/443을 노출하거나, SSL 인증서를 관리하거나, 방화벽 규칙을 구성할 필요가 없습니다.1
터널 생성
Cloudflare Zero Trust → Networks → Tunnels → Create a tunnel로 이동하세요.
커넥터 유형으로 Cloudflared를 선택하세요.
2
공개 호스트명 구성
터널 구성에서 공개 호스트명을 추가하세요:
다른 모든 설정(HTTP Host Header, Chunked Encoding, Timeouts, Access)은 기본값으로 두세요.
URL은
localhost가 아닌 Docker 서비스 이름 fim-one을 사용합니다. cloudflared가 같은 Docker 네트워크의 별도 컨테이너로 실행되기 때문입니다.3
터널 토큰 복사
터널의 Configure 페이지에서 설치 명령을 찾으세요 —
eyJ...로 시작하는 토큰이 포함되어 있습니다. 복사하세요.4
.env에 토큰 추가
5
터널 오버레이로 배포
docker-compose.tunnel.yml 오버레이는 cloudflared 사이드카 컨테이너를 추가합니다. 기본 docker-compose.yml은 변경되지 않으므로 Cloudflare가 없는 커뮤니티 사용자는 계속 docker compose up -d를 사용할 수 있습니다.6
이전 DNS 레코드 제거
도메인에 이전에 서버의 IP를 가리키는 A 레코드가 있었다면 Cloudflare DNS에서 삭제하세요. 터널이 자동으로 엣지 엔드포인트를 가리키는 CNAME 레코드를 생성합니다.
7
서버 포트 닫기
서버의
docker-compose.yml에서 ports 섹션을 제거하거나 주석 처리하세요. 트래픽은 이제 터널을 통해서만 흐르므로 인바운드 포트가 필요하지 않습니다.스크립트 배포 (베어 메탈)
베어 메탈 서버 또는 사용자 정의 프로세스 관리자의 경우./start.sh를 직접 사용하세요: