Windows 11 Pro + Docker + Ollama + Open WebUI + SearXNG + ComfyUI + Remote Access
Made using a fresh install of Windows 11 Pro with no modifications.
Last Updated: 2026-06-18 · Suggestions: setupllmserver@gmail.com
So you're here to setup a LLM server. Awesome! Here is a guide to do that. No videos, no images, no ads - just plain text. This guide assumes you have some tech skills. I've tried to make it straightforward and error free. Just FYI I ran the original guide through my LLM to clean it up and organize it better to get what you see here. I do plan on making a Linux version of this at some point in the future.
Open PowerShell as Administrator, then run:
# Install WSL
wsl --install
# Reboot, then ensure WSL is up to date
wsl --update
localhost:11434 to verify the app is running# Find available models at: https://ollama.com/search
# ollama pull <model_name>
ollama pull llama3.3:70b-instruct-q8_0
ollama pull llama4:latest
ollama pull qwen3.5:122b
Docker Desktop must be running. Open PowerShell as Administrator:
# Pull the OWUI image
docker pull ghcr.io/open-webui/open-webui:main
# AMD GPU
docker run -d -p 3000:8080 -v open-webui:/app/backend/data \
--name open-webui ghcr.io/open-webui/open-webui:main
# nVidia GPU
docker run -d -p 3000:8080 --gpus all -v open-webui:/app/backend/data \
--name open-webui ghcr.io/open-webui/open-webui:cuda
If the command hangs while pulling a layer, press
Ctrl+Cthen run:docker system prune -f docker pull ghcr.io/open-webui/open-webui:cuda
Click Allow on the Windows firewall dialogue box.
Open PowerShell as Administrator:
# Note that $HOME refers to C:UsersYour_Name
$base = "$HOMEsearxng"
# Create base, config, and data folders
New-Item -ItemType Directory -Force -Path "$baseconfig","$basedata"
cd $base
# Pull latest SXNG image
docker pull docker.io/searxng/searxng:latest
# Start the service — this also creates the settings.yml config file
docker run --name searxng -p 8080:8080 docker.io/searxng/searxng
C:\Users\Your_Namedocker-compose.yml (ensure it does not end in .txt)This puts OWUI and SXNG in the same Docker container so they can communicate. I was not able to get them to communicate when running in different containers.
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
depends_on:
- searxng
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
# Add the next line only if you plan to use ComfyUI for image generation
- ENABLE_RAG_LOCAL_WEB_FETCH=true
volumes:
- open_webui_data:/app/backend/data
ports:
- "3000:8080"
restart: unless-stopped
searxng:
image: searxng/searxng:latest
container_name: searxng
volumes:
- ./searxng:/etc/searxng
ports:
- "8080:8080"
restart: unless-stopped
volumes:
open_webui_data:
searxng base folder and open settings.ymluse_default_settings: true as the very first line, above the general: sectionformats: and add - json above the - html entrydocker-compose.yml lives (C:\Users\Your_Name)docker compose down
docker compose up -d
# Both services should appear in Docker Desktop in the same container.
# If you see container name conflict errors, remove the conflicting containers first:
# docker rm -f searxng
# docker compose up -d
# docker rm -f open-webui
# docker compose up -d
Go to Settings → Models. For each model you want available to users:
It appears that Save & Update saves only one change at a time — so re-save after every individual change.
5020- Do not apologize for not finding informationsearxnghttp://searxng:8080/search?q=<query>&format=json
# Alternatively, use the server's direct IP address:
# http://server_ip_address:8080/search?q=<query>&format=json
Higher numbers for Search Result Count and Concurrent Requests don't guarantee better results. Recommended: 5–7 results, 2–3 concurrent requests.
10 and Concurrent Requests to 5Found under Admin Panel → Settings → Web Search. Most require an API key.
Status: In Progress
run_nvidia_gpu.bat--listen 0.0.0.0 to the end of the first linerun_nvidia_gpu.bat to start ComfyUI and minimize the open terminalshell:startup → add a shortcut to run_nvidia_gpu.bat so ComfyUI runs on startupOpen JSON file to look for Node IDs [these ID numbers are examples]:
Prompt: Node 57:27 — search for "CLIPTextEncode"
Model: Node 57:28 — search for "unet_name" (also shows model name for OWUI)
Width/Height: Node 57:13 — search for "width" or "height"
Steps: Node 57:3 — search for "steps"
Seed: Node 57:3 — search for "seed"
images → Node 57:8ckpt_name from the Create Image section (57:28)Status: In Progress
exampledomain.com)This creates a policy that emails the user a one-time password (OTP) granting access for the policy's duration.
openwebui) and select exampledomain.com from the dropdownlocalhost:3000 (the port OWUI runs on)HTTPS is more secure but is outside the scope of this guide.
openwebui) and select the purchased domain (exampledomain.com)openwebui.exampledomain.com — enter your email to receive an OTP and gain accessWorks with Firefox and Chrome, but have not tested it with Safari.
gemini-3-pro-image-preview in the Model fieldhttps://generativelanguage.googleapis.com/v1betaSXNG allows the admin to prioritize or block certain domains via settings.yml. Scroll to the # Configuration of the "Hostnames plugin": section.
A good starting reference for blocked / low-priority / high-priority sites: kagi.com/stats?stat=insights
medium to high (or low)After saving advanced parameters, refresh the Admin Panel page. Going back into the same model without refreshing may still show the old values.
settings.yml, under the engines section, change the disabled: flag from true to false for Reddit and Steam if desired.