How To Install And Configure A Full Featured LLM Server

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.


1. Install Windows Subsystem for Linux (WSL)

Open PowerShell as Administrator, then run:

# Install WSL
wsl --install

# Reboot, then ensure WSL is up to date
wsl --update

2. Install Docker Desktop

  1. Open Microsoft Store and search for Docker Desktop
  2. Open Docker Desktop and close the "Windows Subsystem for Linux" dialogue box
  3. [Optional] Create or log in to your account
  4. Enable Start Docker Desktop when you sign in to your computer
  5. Go to Settings → General and confirm WSL 2 based engine is enabled
  6. Uncheck Send usage statistics

3. Install Ollama & Download Models

  1. Visit ollama.com and download/run the installer
  2. Open Ollama and create or log in to your account
  3. Open a browser and go to localhost:11434 to verify the app is running
  4. Open PowerShell as Administrator and pull your desired models:
# 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

4. Install Open WebUI (OWUI)

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+C then run:

docker system prune -f
docker pull ghcr.io/open-webui/open-webui:cuda

Click Allow on the Windows firewall dialogue box.


5. Install SearXNG (SXNG)

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

Create docker-compose.yml

  1. Open File Explorer and navigate to C:\Users\Your_Name
  2. Right-click → New Text Document → name it docker-compose.yml (ensure it does not end in .txt)
  3. Open the file in Notepad and paste the contents below
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:

Configure settings.yml

  1. Navigate to the searxng base folder and open settings.yml
  2. Add use_default_settings: true as the very first line, above the general: section
  3. Scroll down to formats: and add - json above the - html entry

Restart both services in the same container

  1. In File Explorer, navigate up one level to where docker-compose.yml lives (C:\Users\Your_Name)
  2. Right-click in the folder → Open Terminal
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

6. Configure Models in OWUI Admin Panel

  1. Open http://localhost:3000/ and create an Admin account
  2. Click the letter icon in the lower-left corner → Admin Panel
  3. Under Users → Overview, click + to add new users. Repeat as needed.
  4. [Optional] Under Users → Groups, create a group called Users. In the Permissions tab, toggle all Workspace Permissions on → Save. Then click Edit → Users to add members.

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.
  1. Click Access → change from Private to Public → close the window
  2. Scroll to Default Features → tick Web Search → click Save & Update

7. Configure Documents in OWUI Admin Panel

  1. Go to Settings → Documents → scroll to the Retrieval section → toggle Hybrid Search on
  2. Set Top K to 50
  3. Set Top K Reranker to 20
  4. Scroll to RAG Template → at the end of the Guidelines section add: - Do not apologize for not finding information
  5. Scroll to the bottom → click Save

8. Point OWUI to the SearXNG Instance

  1. Go to Settings → Web Search → toggle Web Search on
  2. Set Web Search Engine to searxng
  3. Enter the SearXNG Query URL:
http://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.
  1. Set Search Result Count to 10 and Concurrent Requests to 5
  2. Click Save

9. Other Search Engine Options in OWUI

Found under Admin Panel → Settings → Web Search. Most require an API key.


10. Enable Native Search Function for Individual Models

  1. Go to Admin Panel → Settings → Models → click Edit on the desired model
  2. Scroll to Advanced Params → click Show
  3. Find Function Calling → change from Default to Native and save

11. Using ComfyUI Portable With nVidia GPU To Generate Images

Status: In Progress

  1. Download and unzip the appropriate ComfyUI Portable zip file into the desired folder
  2. Navigate to that folder and right-click run_nvidia_gpu.bat
  3. If OWUI needs to access ComfyUI over a network, add --listen 0.0.0.0 to the end of the first line
  4. Double click run_nvidia_gpu.bat to start ComfyUI and minimize the open terminal
  5. Press Win+R → type shell:startup → add a shortcut to run_nvidia_gpu.bat so ComfyUI runs on startup
  6. Load ComfyUI in a browser, select a workflow, and download the JSON file (used later in OWUI)

Configure OWUI for ComfyUI

  1. Go to Admin Panel → Settings → Images
  2. Toggle Image Generation to ComfyUI
  3. Enter the model name (from the currently loaded ComfyUI workflow)
  4. Set image size and enter the URL used to access ComfyUI
  5. Ignore the ComfyUI API Key field
  6. Upload the ComfyUI Workflow JSON file

Node IDs from the JSON file

Open 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"

Image Edit configuration

  1. Toggle Image Edit on
  2. For the Image node ID, open the JSON file and search for images → Node 57:8
  3. Model node ID is the same as ckpt_name from the Create Image section (57:28)
  4. Use the data from the Create Image section to fill out the remaining fields

12. Setup Cloudflare Tunnel To Access Server Remotely

Status: In Progress

  1. Go to cloudflare.com → DomainsBuy Domain (e.g. exampledomain.com)
  2. From the main account page, click Zero Trust → create an account → select the Free Plan
  3. Go to Access Policies → Policies → Add A Policy
  4. In the Include section, select Emails and enter the email addresses of users who will access the server
  5. Under Policy Details, give the policy a name (e.g. OpenWeb UI), set Action to Allow, and set a session duration (e.g. 2 weeks)
  6. Click Save Policy
This creates a policy that emails the user a one-time password (OTP) granting access for the policy's duration.
  1. Go to Networks → Connectors → Create a tunnel
  2. Select Cloudflared, give the tunnel a name → Save Tunnel
  3. Select your OS (Windows 11 in this case) and follow steps 1–3. For step 4, use the copy icon — the command is very long.
  4. Scroll down → Next
  5. Add a subdomain (e.g. openwebui) and select exampledomain.com from the dropdown
  6. Under Service, set Type to HTTP and enter localhost:3000 (the port OWUI runs on)
HTTPS is more secure but is outside the scope of this guide.
  1. Click Complete Setup
  2. Go to Access Controls → Applications → Create new application → Self-hosted and private
  3. Enter the subdomain (openwebui) and select the purchased domain (exampledomain.com)
  4. Under Access Policies, select the OpenWeb UI policy from the dropdown → save
  5. Open a browser and go to openwebui.exampledomain.com — enter your email to receive an OTP and gain access
Works with Firefox and Chrome, but have not tested it with Safari.

Optional: Google Gemini for Image Generation

  1. Go to Admin Panel → Settings → Images
  2. Toggle Image Generation on
  3. Enter gemini-3-pro-image-preview in the Model field
  4. Set the desired image width and height
  5. Toggle Image Prompt Generation on
  6. Set Image Generation Engine to Gemini
  7. Enter the Gemini Base URL: https://generativelanguage.googleapis.com/v1beta
  8. Generate an API key at aistudio.google.com/app/api-keys → Create API Key
  9. Payment is required to use this API. Once set up, paste the key into the Gemini API Key field
  10. Set Gemini Endpoint Method to generateContent
  11. For image editing, toggle Image Edit on — fields will populate automatically. Adjust image size if needed.

Optional: SearXNG Search Priorities

SXNG 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


Optional: Adjust Model Reasoning Effort in OWUI

  1. Go to Admin Panel → Settings → Models → click the desired model
  2. Go to Advanced Params → Show
  3. Scroll to Reasoning Effort → click Default → change the value from medium to high (or low)
  4. Scroll to the bottom → click Save & Update
After saving advanced parameters, refresh the Admin Panel page. Going back into the same model without refreshing may still show the old values.

Miscellaneous Notes