# OpenWebUI — ChatGPT-like web UI in front of Ollama. Pre-configured to # use the host's Ollama instance and Kagi for web search. Default port # 3000. # # Persistent state (users, conversations, uploaded docs, RAG vector # index) lives at /srv/docker/openwebui/data so backups touch one path. # # Sibling .env file holds KAGI_API_KEY (single shared key — opencode's # kagimcp MCP on the Mac and this container use the same one). Same # placeholder-then-fill-in-by-hand pattern as compose/beszel.yml and # compose/litellm.yml. services: openwebui: image: ghcr.io/open-webui/open-webui:main container_name: openwebui restart: unless-stopped ports: - "3000:8080" extra_hosts: # Lets the container reach Ollama on the host's :11434 without # needing to share Docker networks. - "host.docker.internal:host-gateway" environment: - OLLAMA_BASE_URL=http://host.docker.internal:11434 # vLLM (Kimi-Linear) exposed as an OpenAI-compatible backend. The # model isn't strongly tool-trained — opencode's agentic system # prompt confuses it. OpenWebUI's plain chat UI is the right home. - OPENAI_API_BASE_URLS=http://host.docker.internal:8000/v1 - OPENAI_API_KEYS=dummy # Built-in web search via Kagi. Kagi-specific env var name is # KAGI_SEARCH_API_KEY (OpenWebUI's convention); kagimcp on the Mac # uses KAGI_API_KEY (Kagi's official convention). We standardize on # KAGI_API_KEY in the .env file and let compose interpolate it # into OpenWebUI's expected name here. - ENABLE_RAG_WEB_SEARCH=true - RAG_WEB_SEARCH_ENGINE=kagi - KAGI_SEARCH_API_KEY=${KAGI_API_KEY} # Fallback (commented): the self-hosted SearXNG path. Re-enable by # swapping RAG_WEB_SEARCH_ENGINE back to searxng and uncommenting: # - SEARXNG_QUERY_URL=https://searxng.n0n.io/search?q=&format=json volumes: - /srv/docker/openwebui/data:/app/backend/data