Open WebUI Docker 설치 가이드: 셀프호스팅 AI 채팅 인터페이스




개요

Open WebUI는 Ollama, OpenAI 등 다양한 LLM을 위한 셀프호스팅 AI 플랫폼입니다. ChatGPT와 같은 깔끔한 인터페이스로 로컬 LLM이나 API를 사용할 수 있으며, RAG, 웹 검색, 도구/함수 호출 등 강력한 기능을 제공합니다. 완전한 오프라인 동작이 가능합니다.

항목내용
GitHubhttps://github.com/open-webui/open-webui
공식 사이트https://openwebui.com
문서https://docs.openwebui.com
라이선스MIT
GitHub Stars55K+
다운로드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 등)
OpenAIGPT-4o, GPT-4, GPT-3.5
AnthropicClaude 3.5, Claude 3
GoogleGemini
Groq초고속 추론
OpenAI 호환LiteLLM, LocalAI 등

📚 RAG (검색 증강 생성)

기능설명
문서 업로드PDF, Word, 텍스트, 코드 등
# 명령어#문서명으로 문서 참조
벡터DBChromaDB, 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

🛠️ 도구 & 함수

기능설명
ToolsPython 함수를 LLM이 호출
Functions커스텀 RAG, 필터, 액션
Pipelines복잡한 워크플로우 구성
코드 실행Python 코드 인터프리터

💬 채팅 기능

기능설명
멀티 모델여러 모델에 동시 질문
대화 분기대화 흐름 분기
프롬프트 템플릿재사용 가능한 프롬프트
공유대화 공유 링크
내보내기JSON, Markdown 내보내기

🎙️ 음성 & 이미지

기능설명
STT음성 → 텍스트 (Whisper)
TTS텍스트 → 음성
이미지 생성DALL-E, Stable Diffusion
이미지 분석멀티모달 모델 (LLaVA 등)

👥 사용자 관리

기능설명
역할Admin, User, Pending
그룹사용자 그룹
RBAC역할 기반 접근 제어
LDAP/ADActive Directory 통합
OAuth/OIDCSSO 지원
SCIM 2.0자동 프로비저닝

📊 모니터링

기능설명
OpenTelemetry트레이스, 메트릭, 로그
LangfuseLLM 사용량 분석
사용량 통계토큰, 비용 추적

시스템 요구 사항

항목최소권장
CPU2 코어4+ 코어
RAM4GB8GB+ (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_KEYJWT 시크릿 키자동 생성
WEBUI_NAMEUI 이름Open WebUI
WEBUI_URL외부 URL
DATA_DIR데이터 디렉토리/app/backend/data

LLM 연결

변수설명
OLLAMA_BASE_URLOllama 서버 URL
OLLAMA_BASE_URLS다중 Ollama (쉼표 구분)
OPENAI_API_KEYOpenAI API 키
OPENAI_API_BASE_URLOpenAI 호환 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_HOSTChromaDB 호스트
CHROMA_HTTP_PORTChromaDB 포트
CHROMA_TENANT테넌트

웹 검색

변수설명
ENABLE_RAG_WEB_SEARCH웹 검색 활성화
RAG_WEB_SEARCH_ENGINE검색 엔진
SEARXNG_QUERY_URLSearXNG URL
GOOGLE_PSE_API_KEYGoogle PSE API 키
BRAVE_SEARCH_API_KEYBrave 검색 API 키

인증

변수설명
WEBUI_AUTH인증 활성화
ENABLE_SIGNUP회원가입 허용
DEFAULT_USER_ROLE기본 역할
ENABLE_OAUTH_SIGNUPOAuth 회원가입
OAUTH_PROVIDER_NAMEOAuth 제공자 이름
OAUTH_CLIENT_IDOAuth 클라이언트 ID
OAUTH_CLIENT_SECRETOAuth 클라이언트 시크릿

코드 실행

변수설명
ENABLE_CODE_INTERPRETER코드 인터프리터 활성화
CODE_INTERPRETER_ENGINE엔진 (jupyter, local)
JUPYTER_URLJupyter 서버 URL

초기 설정

1) 첫 접속 및 관리자 계정

URL: http://localhost:3000
→ 첫 번째 가입자가 관리자

2) 모델 다운로드 (Ollama 사용 시)

UI에서:

  1. Settings → Models
  2. 모델 이름 입력 (예: llama3.2, mistral)
  3. 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, phi42-4GB
범용 (중형)llama3.2, mistral4-8GB
범용 (대형)llama3.1:70b, qwen2.5:72b40GB+
코딩qwen2.5-coder, deepseek-coder-v24-16GB
한국어llama3.2-ko, qwen2.54-8GB
임베딩nomic-embed-text, mxbai-embed-large<1GB
멀티모달llava, llama3.2-vision4-8GB

4) RAG 설정

  1. Admin Settings → Documents
  2. 임베딩 모델 설정 (예: nomic-embed-text)
  3. 청크 크기, 오버랩 조정
  4. 하이브리드 검색 활성화 (선택)

5) 웹 검색 설정

  1. Admin Settings → Web Search
  2. 검색 엔진 선택 (DuckDuckGo는 API 키 불필요)
  3. 또는 SearXNG 인스턴스 연결

사용 가이드

RAG 사용

Knowledge Base 생성:

  1. Workspace → Knowledge → + Create
  2. 문서 업로드 (PDF, Word, 텍스트 등)
  3. 이름 지정

채팅에서 사용:

# 명령어로 문서 참조
#문서이름 이 문서에서 중요한 내용을 요약해줘

# 또는 모델에 Knowledge 연결
Workspace → Models → + → Knowledge 선택

웹 검색 사용

채팅에서:

오늘 날씨 검색해줘
최신 AI 뉴스 찾아줘

웹페이지 직접 참조:

#https://example.com 이 페이지를 요약해줘

도구 (Tools) 사용

기본 제공 도구:

  • 계산기
  • 웹 검색
  • 이미지 생성
  • 코드 실행

커스텀 도구 만들기:

  1. Workspace → Tools → +
  2. Python 코드 작성
  3. 모델에 연결

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에서:

  1. Admin Settings → Connections → OpenAI API
  2. 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-slimOllama 미포함 (경량)
ollamaOllama 번들
cudaCUDA 지원
dev개발 버전

활용 사례

1. 개인 ChatGPT 대안

목적: 프라이버시 보장, 무료 사용

  • 로컬 LLM으로 완전 오프라인
  • API 비용 없음
  • 대화 기록 완전 통제

2. 기업 문서 QA

목적: 내부 문서 기반 AI 어시스턴트

  • RAG로 사내 문서 학습
  • 기밀 데이터 외부 유출 없음
  • 멀티 유저로 팀 공유

3. 코딩 어시스턴트

목적: 코드 작성, 리뷰, 설명

  • Qwen Coder, DeepSeek Coder 사용
  • 코드 인터프리터로 실행
  • 프로젝트 문서 RAG

4. 연구/학습

목적: 논문, 교재 기반 학습

  • PDF 논문 업로드
  • YouTube 강의 요약
  • 웹 검색으로 최신 정보

5. 팀 AI 플랫폼

목적: 팀 전체 AI 접근

  • 멀티 유저, 권한 관리
  • 공유 Knowledge Base
  • 사용량 모니터링

대안 비교

기능Open WebUILibreChatAnything LLM
UI⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Ollama 통합✅ 네이티브
RAG✅ 9개 벡터DB✅ 올인원
웹 검색✅ 15+ 엔진
멀티 유저✅ 엔터프라이즈
도구/함수✅ Pipelines✅ 플러그인
음성✅ STT/TTS
설치 난이도쉬움쉬움매우 쉬움

마무리

Open WebUI는 셀프호스팅 AI 플랫폼의 표준입니다. ChatGPT 같은 UI에 RAG, 웹 검색, 도구, 멀티 유저까지 모든 기능을 갖추고 있습니다.

핵심 장점

장점설명
완전 오프라인인터넷 없이 동작 가능
다중 LLMOllama, OpenAI, Anthropic 등
RAG 내장9개 벡터DB, 하이브리드 검색
웹 검색15+ 검색 엔진 통합
확장성Tools, Functions, Pipelines
엔터프라이즈LDAP, SSO, SCIM 2.0
커뮤니티55K+ Stars, 활발한 개발

이런 분께 추천

ChatGPT 대안을 원하는 분
로컬 LLM을 편하게 사용하고 싶은 분
문서 기반 AI 어시스턴트가 필요한 분
팀/기업용 AI 플랫폼을 구축하려는 분
프라이버시를 중시하는 분



댓글 남기기