개요
Open WebUI는 Ollama, OpenAI 등 다양한 LLM을 위한 셀프호스팅 AI 플랫폼입니다. ChatGPT와 같은 깔끔한 인터페이스로 로컬 LLM이나 API를 사용할 수 있으며, RAG, 웹 검색, 도구/함수 호출 등 강력한 기능을 제공합니다. 완전한 오프라인 동작이 가능합니다.
| 항목 | 내용 |
|---|---|
| GitHub | https://github.com/open-webui/open-webui |
| 공식 사이트 | https://openwebui.com |
| 문서 | https://docs.openwebui.com |
| 라이선스 | MIT |
| GitHub Stars | 55K+ |
| 다운로드 | 2.8억+ |
Open WebUI란?
왜 Open WebUI인가?
✅ ChatGPT 같은 UI: 깔끔하고 직관적인 채팅 인터페이스
✅ 다중 LLM 지원: Ollama, OpenAI, Anthropic, Groq 등
✅ 완전 오프라인: 인터넷 없이 로컬 LLM만으로 동작
✅ RAG 내장: 문서 업로드 후 질문 (9개 벡터DB 지원)
✅ 웹 검색: 15+ 검색 엔진 통합
✅ 도구/함수: Python으로 커스텀 기능 추가
✅ 멀티 유저: 계정별 대화 기록, 권한 관리
✅ 엔터프라이즈: LDAP, SSO, SCIM 2.0 지원
핵심 철학
"Own it. Not rent it."
- 완전한 자체 통제
- 오프라인 가능
- 프라이버시 보장
- 확장 가능한 플랫폼
주요 기능
🤖 LLM 통합
| 백엔드 | 설명 |
|---|---|
| Ollama | 로컬 LLM (LLaMA, Mistral, Phi 등) |
| OpenAI | GPT-4o, GPT-4, GPT-3.5 |
| Anthropic | Claude 3.5, Claude 3 |
| Gemini | |
| Groq | 초고속 추론 |
| OpenAI 호환 | LiteLLM, LocalAI 등 |
📚 RAG (검색 증강 생성)
| 기능 | 설명 |
|---|---|
| 문서 업로드 | PDF, Word, 텍스트, 코드 등 |
| # 명령어 | #문서명으로 문서 참조 |
| 벡터DB | ChromaDB, PGVector, Qdrant, Milvus, Elasticsearch 등 9개 |
| 임베딩 | Ollama, OpenAI, Sentence Transformers |
| 하이브리드 검색 | BM25 + 벡터 검색 + CrossEncoder 리랭킹 |
| YouTube RAG | 유튜브 영상 요약 |
🔍 웹 검색
| 지원 엔진 |
|---|
| SearXNG, Google PSE, Brave, DuckDuckGo, Bing |
| Tavily, Perplexity, Kagi, Jina, Exa |
| serpstack, serper, Serply, SearchApi, SerpApi |
🛠️ 도구 & 함수
| 기능 | 설명 |
|---|---|
| Tools | Python 함수를 LLM이 호출 |
| Functions | 커스텀 RAG, 필터, 액션 |
| Pipelines | 복잡한 워크플로우 구성 |
| 코드 실행 | Python 코드 인터프리터 |
💬 채팅 기능
| 기능 | 설명 |
|---|---|
| 멀티 모델 | 여러 모델에 동시 질문 |
| 대화 분기 | 대화 흐름 분기 |
| 프롬프트 템플릿 | 재사용 가능한 프롬프트 |
| 공유 | 대화 공유 링크 |
| 내보내기 | JSON, Markdown 내보내기 |
🎙️ 음성 & 이미지
| 기능 | 설명 |
|---|---|
| STT | 음성 → 텍스트 (Whisper) |
| TTS | 텍스트 → 음성 |
| 이미지 생성 | DALL-E, Stable Diffusion |
| 이미지 분석 | 멀티모달 모델 (LLaVA 등) |
👥 사용자 관리
| 기능 | 설명 |
|---|---|
| 역할 | Admin, User, Pending |
| 그룹 | 사용자 그룹 |
| RBAC | 역할 기반 접근 제어 |
| LDAP/AD | Active Directory 통합 |
| OAuth/OIDC | SSO 지원 |
| SCIM 2.0 | 자동 프로비저닝 |
📊 모니터링
| 기능 | 설명 |
|---|---|
| OpenTelemetry | 트레이스, 메트릭, 로그 |
| Langfuse | LLM 사용량 분석 |
| 사용량 통계 | 토큰, 비용 추적 |
시스템 요구 사항
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 2 코어 | 4+ 코어 |
| RAM | 4GB | 8GB+ (LLM에 따라) |
| GPU | 없음 (CPU 가능) | NVIDIA (CUDA) |
| 포트 | 8080 (내부) / 3000 (외부) | – |
💡 GPU 요구사항: Open WebUI 자체는 GPU 불필요. Ollama/로컬 LLM 실행 시 GPU 권장.
Docker 설치
방법 1: Open WebUI만 (외부 Ollama 연결)
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
extra_hosts:
- "host.docker.internal:host-gateway"
💡 host.docker.internal: 호스트에서 실행 중인 Ollama에 연결
방법 2: Open WebUI + Ollama 번들 (CPU)
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:ollama
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./ollama:/root/.ollama
- ./data:/app/backend/data
방법 3: Open WebUI + Ollama 번들 (GPU)
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:ollama
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./ollama:/root/.ollama
- ./data:/app/backend/data
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
방법 4: Open WebUI + Ollama 분리 (GPU)
# docker-compose.yml
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0:11434
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
depends_on:
- ollama
ports:
- "3000:8080"
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
방법 5: OpenAI API 사용
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./data:/app/backend/data
environment:
- OPENAI_API_KEY=sk-your-api-key
- OPENAI_API_BASE_URL=https://api.openai.com/v1
방법 6: RAG + ChromaDB 분리
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
depends_on:
- ollama
- chromadb
ports:
- "3000:8080"
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- VECTOR_DB=chroma
- CHROMA_HTTP_HOST=chromadb
- CHROMA_HTTP_PORT=8000
- RAG_EMBEDDING_ENGINE=ollama
- RAG_EMBEDDING_MODEL=nomic-embed-text
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
chromadb:
image: chromadb/chroma:latest
container_name: chromadb
restart: unless-stopped
volumes:
- ./chromadb:/chroma/chroma
environment:
- IS_PERSISTENT=TRUE
- PERSIST_DIRECTORY=/chroma/chroma
- ALLOW_RESET=TRUE
방법 7: Traefik + HTTPS
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=your-secret-key
networks:
- traefik_network
- internal
labels:
- "traefik.enable=true"
- "traefik.http.routers.openwebui.rule=Host(`ai.example.com`)"
- "traefik.http.routers.openwebui.entrypoints=websecure"
- "traefik.http.routers.openwebui.tls.certresolver=letsencrypt"
- "traefik.http.services.openwebui.loadbalancer.server.port=8080"
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
volumes:
- ./ollama:/root/.ollama
networks:
- internal
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
networks:
traefik_network:
external: true
internal:
driver: bridge
방법 8: 웹 검색 활성화
# docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
# 웹 검색 (DuckDuckGo - API 키 불필요)
- ENABLE_RAG_WEB_SEARCH=true
- RAG_WEB_SEARCH_ENGINE=duckduckgo
# 또는 SearXNG
# - RAG_WEB_SEARCH_ENGINE=searxng
# - SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
환경 변수
기본 설정
| 변수 | 설명 | 기본값 |
|---|---|---|
WEBUI_SECRET_KEY | JWT 시크릿 키 | 자동 생성 |
WEBUI_NAME | UI 이름 | Open WebUI |
WEBUI_URL | 외부 URL | – |
DATA_DIR | 데이터 디렉토리 | /app/backend/data |
LLM 연결
| 변수 | 설명 |
|---|---|
OLLAMA_BASE_URL | Ollama 서버 URL |
OLLAMA_BASE_URLS | 다중 Ollama (쉼표 구분) |
OPENAI_API_KEY | OpenAI API 키 |
OPENAI_API_BASE_URL | OpenAI 호환 API URL |
RAG 설정
| 변수 | 설명 | 기본값 |
|---|---|---|
VECTOR_DB | 벡터DB (chroma, pgvector 등) | chroma |
RAG_EMBEDDING_ENGINE | 임베딩 엔진 | ollama |
RAG_EMBEDDING_MODEL | 임베딩 모델 | – |
CHUNK_SIZE | 청크 크기 | 500 |
CHUNK_OVERLAP | 청크 오버랩 | 100 |
ChromaDB
| 변수 | 설명 |
|---|---|
CHROMA_HTTP_HOST | ChromaDB 호스트 |
CHROMA_HTTP_PORT | ChromaDB 포트 |
CHROMA_TENANT | 테넌트 |
웹 검색
| 변수 | 설명 |
|---|---|
ENABLE_RAG_WEB_SEARCH | 웹 검색 활성화 |
RAG_WEB_SEARCH_ENGINE | 검색 엔진 |
SEARXNG_QUERY_URL | SearXNG URL |
GOOGLE_PSE_API_KEY | Google PSE API 키 |
BRAVE_SEARCH_API_KEY | Brave 검색 API 키 |
인증
| 변수 | 설명 |
|---|---|
WEBUI_AUTH | 인증 활성화 |
ENABLE_SIGNUP | 회원가입 허용 |
DEFAULT_USER_ROLE | 기본 역할 |
ENABLE_OAUTH_SIGNUP | OAuth 회원가입 |
OAUTH_PROVIDER_NAME | OAuth 제공자 이름 |
OAUTH_CLIENT_ID | OAuth 클라이언트 ID |
OAUTH_CLIENT_SECRET | OAuth 클라이언트 시크릿 |
코드 실행
| 변수 | 설명 |
|---|---|
ENABLE_CODE_INTERPRETER | 코드 인터프리터 활성화 |
CODE_INTERPRETER_ENGINE | 엔진 (jupyter, local) |
JUPYTER_URL | Jupyter 서버 URL |
초기 설정
1) 첫 접속 및 관리자 계정
URL: http://localhost:3000
→ 첫 번째 가입자가 관리자
2) 모델 다운로드 (Ollama 사용 시)
UI에서:
- Settings → Models
- 모델 이름 입력 (예:
llama3.2,mistral) - Pull 클릭
CLI에서:
# 컨테이너 내부
docker exec -it ollama ollama pull llama3.2
docker exec -it ollama ollama pull mistral
docker exec -it ollama ollama pull nomic-embed-text # 임베딩용
3) 추천 모델
| 용도 | 모델 | 크기 |
|---|---|---|
| 범용 (소형) | llama3.2:3b, phi4 | 2-4GB |
| 범용 (중형) | llama3.2, mistral | 4-8GB |
| 범용 (대형) | llama3.1:70b, qwen2.5:72b | 40GB+ |
| 코딩 | qwen2.5-coder, deepseek-coder-v2 | 4-16GB |
| 한국어 | llama3.2-ko, qwen2.5 | 4-8GB |
| 임베딩 | nomic-embed-text, mxbai-embed-large | <1GB |
| 멀티모달 | llava, llama3.2-vision | 4-8GB |
4) RAG 설정
- Admin Settings → Documents
- 임베딩 모델 설정 (예:
nomic-embed-text) - 청크 크기, 오버랩 조정
- 하이브리드 검색 활성화 (선택)
5) 웹 검색 설정
- Admin Settings → Web Search
- 검색 엔진 선택 (DuckDuckGo는 API 키 불필요)
- 또는 SearXNG 인스턴스 연결
사용 가이드
RAG 사용
Knowledge Base 생성:
- Workspace → Knowledge → + Create
- 문서 업로드 (PDF, Word, 텍스트 등)
- 이름 지정
채팅에서 사용:
# 명령어로 문서 참조
#문서이름 이 문서에서 중요한 내용을 요약해줘
# 또는 모델에 Knowledge 연결
Workspace → Models → + → Knowledge 선택
웹 검색 사용
채팅에서:
오늘 날씨 검색해줘
최신 AI 뉴스 찾아줘
웹페이지 직접 참조:
#https://example.com 이 페이지를 요약해줘
도구 (Tools) 사용
기본 제공 도구:
- 계산기
- 웹 검색
- 이미지 생성
- 코드 실행
커스텀 도구 만들기:
- Workspace → Tools → +
- Python 코드 작성
- 모델에 연결
Pipelines
외부 서비스 연결:
- Anthropic Claude
- Google Gemini
- Azure OpenAI
- 커스텀 RAG
설치:
docker run -d -p 9099:9099 \
-v ./pipelines:/app/pipelines \
--name pipelines \
ghcr.io/open-webui/pipelines:main
Open WebUI에서:
- Admin Settings → Connections → OpenAI API
- URL:
http://pipelines:9099
백업 및 복원
데이터 구조
./data/
├── webui.db # SQLite 데이터베이스
├── uploads/ # 업로드된 파일
├── cache/ # 캐시
└── docs/ # 문서
./ollama/ # Ollama 모델 (별도 볼륨 시)
백업
# 컨테이너 정지
docker compose down
# 전체 백업
tar -czvf openwebui-backup-$(date +%Y%m%d).tar.gz data/
# Ollama 모델 포함
tar -czvf openwebui-full-backup-$(date +%Y%m%d).tar.gz data/ ollama/
# 컨테이너 재시작
docker compose up -d
복원
tar -xzvf openwebui-backup.tar.gz
docker compose up -d
업데이트
cd ~/open-webui
# 백업
tar -czvf openwebui-backup-$(date +%Y%m%d).tar.gz data/
# 최신 이미지
docker compose pull
# 재시작
docker compose down
docker compose up -d
# 로그 확인
docker compose logs -f open-webui
트러블슈팅
Ollama 연결 안 됨
Docker 내부 → 호스트 Ollama:
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
또는 network_mode 사용:
network_mode: host
environment:
- OLLAMA_BASE_URL=http://127.0.0.1:11434
GPU 인식 안 됨
# NVIDIA Container Toolkit 설치 확인
nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
WebSocket 오류
- 리버스 프록시에서 WebSocket 지원 확인
- Nginx:
proxy_http_version 1.1;설정 - Cloudflare: WebSocket 활성화
모델 다운로드 느림
# Ollama 환경 변수
environment:
- OLLAMA_HOST=0.0.0.0:11434
- OLLAMA_KEEP_ALIVE=24h # 모델 메모리 유지
이미지 태그
| 태그 | 설명 |
|---|---|
main | 최신 안정 버전 |
main-slim | Ollama 미포함 (경량) |
ollama | Ollama 번들 |
cuda | CUDA 지원 |
dev | 개발 버전 |
활용 사례
1. 개인 ChatGPT 대안
목적: 프라이버시 보장, 무료 사용
- 로컬 LLM으로 완전 오프라인
- API 비용 없음
- 대화 기록 완전 통제
2. 기업 문서 QA
목적: 내부 문서 기반 AI 어시스턴트
- RAG로 사내 문서 학습
- 기밀 데이터 외부 유출 없음
- 멀티 유저로 팀 공유
3. 코딩 어시스턴트
목적: 코드 작성, 리뷰, 설명
- Qwen Coder, DeepSeek Coder 사용
- 코드 인터프리터로 실행
- 프로젝트 문서 RAG
4. 연구/학습
목적: 논문, 교재 기반 학습
- PDF 논문 업로드
- YouTube 강의 요약
- 웹 검색으로 최신 정보
5. 팀 AI 플랫폼
목적: 팀 전체 AI 접근
- 멀티 유저, 권한 관리
- 공유 Knowledge Base
- 사용량 모니터링
대안 비교
| 기능 | Open WebUI | LibreChat | Anything LLM |
|---|---|---|---|
| UI | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Ollama 통합 | ✅ 네이티브 | ✅ | ✅ |
| RAG | ✅ 9개 벡터DB | ✅ | ✅ 올인원 |
| 웹 검색 | ✅ 15+ 엔진 | ✅ | ✅ |
| 멀티 유저 | ✅ 엔터프라이즈 | ✅ | ✅ |
| 도구/함수 | ✅ Pipelines | ✅ 플러그인 | ✅ |
| 음성 | ✅ STT/TTS | ✅ | ❌ |
| 설치 난이도 | 쉬움 | 쉬움 | 매우 쉬움 |
마무리
Open WebUI는 셀프호스팅 AI 플랫폼의 표준입니다. ChatGPT 같은 UI에 RAG, 웹 검색, 도구, 멀티 유저까지 모든 기능을 갖추고 있습니다.
핵심 장점
| 장점 | 설명 |
|---|---|
| 완전 오프라인 | 인터넷 없이 동작 가능 |
| 다중 LLM | Ollama, OpenAI, Anthropic 등 |
| RAG 내장 | 9개 벡터DB, 하이브리드 검색 |
| 웹 검색 | 15+ 검색 엔진 통합 |
| 확장성 | Tools, Functions, Pipelines |
| 엔터프라이즈 | LDAP, SSO, SCIM 2.0 |
| 커뮤니티 | 55K+ Stars, 활발한 개발 |
이런 분께 추천
ChatGPT 대안을 원하는 분
로컬 LLM을 편하게 사용하고 싶은 분
문서 기반 AI 어시스턴트가 필요한 분
팀/기업용 AI 플랫폼을 구축하려는 분
프라이버시를 중시하는 분