צ'אט AI פרטי עם חיפוש ברשת: Open WebUI ו-SearXNG

Open WebUI עם מודל מקומי ב-Ollama, ו-SearXNG כמנוע החיפוש שלו, על שרת אחד מאחורי Caddy. החיפושים יוצאים מהשרת שלכם למנועי החיפוש, לא ל-API חיפוש של צד שלישי.

נבדק 14 באוקטובר 2026

למה האפליקציות האלה יחד

צוות קטן או משק בית רוצים צ'אט AI שהתשובות שלו יכולות להסתמך על דפי רשת עדכניים, בלי לשלוח הנחיות למודל מתארח ובלי לשלוח שאילתות ל-API חיפוש בתשלום.

דפי האפליקציות מעריכים משאבים ומפרסים כל אפליקציה לבד. יחד הן צריכות שני דברים שאף אחד מהדפים לא מכסה: לכוון את Open WebUI אל SearXNG דרך הרשת ש-Caddy חולק עם שתיהן, ולהגדיר ל-SearXNG לענות ב-JSON, מה שהוא מסרב לעשות כברירת מחדל (403 Forbidden). הדף הזה מעריך את שתיהן כשרת אחד ונותן את הכתובת וההגדרה המדויקות.

האפליקציות בסטאק

אפליקציההתפקיד בסטאקרמת עומסתמיכת Compose
Open WebUIממשק הצ'אט, כש-Ollama מריץ את המודל על ה-CPU.קלנבדק בהרצה
SearXNGמנוע ה-metasearch שאליו Open WebUI שולח את החיפושים ברשת.קלנתמך

איך האפליקציות מתחברות

Open WebUI אל SearXNG: http://searxng:8080/search
Open WebUI שולח חיפושים ברשת לנקודת הקצה ‎/search של SearXNG דרך רשת ה-edge של Caddy, לפי שם השירות. הבקשה לא יוצאת מרשתות ה-Docker של השרת.

משאבים לשרת כולו

מחושב במנוע של ה-Stack Sizer לאפליקציות ולרמות העומס האלה: מה שהאפליקציות צריכות, בסיס המערכת ומרווח הביטחון. אותו קלט ב-Stack Sizer נותן את אותם מספרים.

רכיבvCPURAM ‏(GiB)דיסק (GiB)
Open WebUI35.7518.472
SearXNG0.50.50.6
בסיס המערכת0.11.258.3
מרווח ביטחון0.721.54.106
סה"כ מומלץ4.32931.478

‏Caddy לא כלול בחישוב המשאבים של ה-Stack Sizer וה-Deployment Spec.

לפתוח את האפליקציות האלה ב-Stack Sizer

קבצים מה-Compose Generator

docker-compose.yml
# Generated by the ANAROQ Compose Generator: https://anaroq.com/tools/compose-generator
# Engine @anaroq/compose 1.0.0, catalog 2026.10.10, exposure caddy.
# Apps: open-webui 1.2.0, searxng 1.0.0 (supported, not run-tested).
# No secrets in this file: copy .env.example to .env and fill it in before `docker compose up -d`.

services:
  open-webui:
    image: "ghcr.io/open-webui/open-webui:v0.11.4"
    restart: "unless-stopped"
    environment:
      OLLAMA_BASE_URL: "http://open-webui-ollama:11434"
      WEBUI_SECRET_KEY: "${OPEN_WEBUI_SECRET_KEY:?set OPEN_WEBUI_SECRET_KEY in .env}"
    volumes:
      - "open-webui-data:/app/backend/data"
    networks:
      - "open-webui-internal"
      - "edge"
    depends_on:
      open-webui-ollama:
        condition: "service_started"
    healthcheck:
      start_period: "120s"
  open-webui-ollama:
    image: "ollama/ollama:0.40.2"
    restart: "unless-stopped"
    volumes:
      - "open-webui-ollama:/root/.ollama"
    networks:
      - "open-webui-internal"
  searxng:
    image: "searxng/searxng:2026.10.13-22c64b8d3"
    restart: "always"
    environment:
      SEARXNG_SECRET: "${SEARXNG_SECRET:?set SEARXNG_SECRET in .env}"
      SEARXNG_BASE_URL: "https://${SEARXNG_DOMAIN:?set SEARXNG_DOMAIN in .env}/"
    volumes:
      - "searxng-config:/etc/searxng"
      - "searxng-data:/var/cache/searxng"
    networks:
      - "searxng-internal"
      - "edge"
    healthcheck:
      test:
        - "CMD"
        - "wget"
        - "-q"
        - "--spider"
        - "http://127.0.0.1:8080/healthz"
      interval: "30s"
      timeout: "5s"
      retries: 3
      start_period: "60s"
  caddy:
    image: "caddy:2.11.7-alpine"
    restart: "unless-stopped"
    environment:
      OPEN_WEBUI_DOMAIN: "${OPEN_WEBUI_DOMAIN:?set OPEN_WEBUI_DOMAIN in .env}"
      SEARXNG_DOMAIN: "${SEARXNG_DOMAIN:?set SEARXNG_DOMAIN in .env}"
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - "./Caddyfile:/etc/caddy/Caddyfile:ro"
      - "caddy-data:/data"
      - "caddy-config:/config"
    networks:
      - "edge"
networks:
  open-webui-internal: {}
  searxng-internal: {}
  edge: {}
volumes:
  open-webui-data: {}
  open-webui-ollama: {}
  searxng-config: {}
  searxng-data: {}
  caddy-data: {}
  caddy-config: {}
.env.example
# Generated by the ANAROQ Compose Generator: https://anaroq.com/tools/compose-generator
# Engine @anaroq/compose 1.0.0, catalog 2026.10.10, exposure caddy.
# Copy this file to .env and fill in every value. Never commit .env.
# ANAROQ does not create passwords or keys: generate them on your own machine.

# --- open-webui ---
# Key Open WebUI signs sessions with (WEBUI_SECRET_KEY). Changing it signs everyone out.
# Secret, required. For example: openssl rand -hex 32
OPEN_WEBUI_SECRET_KEY=
# Public host name of Open WebUI behind the reverse proxy, for example chat.example.com.
# Required.
OPEN_WEBUI_DOMAIN=

# --- searxng ---
# Server secret_key SearXNG uses for cryptography (SEARXNG_SECRET overrides the value in settings.yml). SearXNG refuses to start with the placeholder ultrasecretkey.
# Secret, required. For example: openssl rand -hex 32
SEARXNG_SECRET=
# Public host name of SearXNG behind the reverse proxy, for example search.example.com. Used for SEARXNG_BASE_URL.
# Required.
SEARXNG_DOMAIN=
Caddyfile
# Generated by the ANAROQ Compose Generator: https://anaroq.com/tools/compose-generator
# Engine @anaroq/compose 1.0.0, catalog 2026.10.10, exposure caddy.
# Each site address comes from .env through the Caddy container's environment.

{$OPEN_WEBUI_DOMAIN} {
	reverse_proxy open-webui:8080
}

{$SEARXNG_DOMAIN} {
	reverse_proxy searxng:8080
}

נוצרו במנוע של ה-Compose Generator לאפליקציות האלה מאחורי Caddy. אין סודות בקבצים: העתיקו את ‎.env.example ל-‎.env ומלאו אותו.

תוצאת ה-Compose Analyzer

שגיאה0
גבוהה0
בינונית0
נמוכה10
מידע0

10 ממצאים: 0 שגיאה, 0 גבוהה, 0 בינונית, 10 נמוכה, 0 מידע.

נמוכה10

  1. נמוכהAQ-HLTH-005שורה 8, עמודה 5services.open-webui

    ‏open-webui לא מגביל את גודל הלוגים שלו (logging.options.max-size).

    תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.

  2. נמוכהAQ-SEC-005שורה 11, עמודה 7services.open-webui.environment

    ‏open-webui מעביר סודות דרך environment ‏(WEBUI_SECRET_KEY).

    תיקון: כשה-image תומך בזה, השתמשו ב-secrets: או במשתנה _FILE במקום.

  3. נמוכהAQ-HLTH-002שורה 24, עמודה 5services.open-webui-ollama

    ל-open-webui-ollama אין healthcheck.

    תיקון: הוסיפו healthcheck, כדי ש-Compose ואתם תדעו מתי השירות מוכן.

  4. נמוכהAQ-HLTH-005שורה 24, עמודה 5services.open-webui-ollama

    ‏open-webui-ollama לא מגביל את גודל הלוגים שלו (logging.options.max-size).

    תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.

  5. נמוכהAQ-HLTH-005שורה 31, עמודה 5services.searxng

    ‏searxng לא מגביל את גודל הלוגים שלו (logging.options.max-size).

    תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.

  6. נמוכהAQ-SEC-005שורה 34, עמודה 7services.searxng.environment

    ‏searxng מעביר סודות דרך environment ‏(SEARXNG_SECRET).

    תיקון: כשה-image תומך בזה, השתמשו ב-secrets: או במשתנה _FILE במקום.

  7. נמוכהAQ-HLTH-002שורה 54, עמודה 5services.caddy

    ל-caddy אין healthcheck.

    תיקון: הוסיפו healthcheck, כדי ש-Compose ואתם תדעו מתי השירות מוכן.

  8. נמוכהAQ-HLTH-005שורה 54, עמודה 5services.caddy

    ‏caddy לא מגביל את גודל הלוגים שלו (logging.options.max-size).

    תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.

  9. נמוכהAQ-PORT-005שורה 60, עמודה 9services.caddy.ports.0

    הקובץ מפרסם 3 מיפויי פורטים. ‏Docker מפרסם פורטים בלי לעבור דרך כללי ufw.

    תיקון: סננו אותם בשרשרת DOCKER-USER או בחומת האש של הספק, או אל תפרסמו אותם.

  10. נמוכהAQ-VOL-005שורה 64, עמודה 9services.caddy.volumes.0

    ‏caddy מחבר את הנתיב היחסי ./Caddyfile.

    תיקון: זה עובד, אבל הנתונים נמצאים בתיקייה שממנה מריצים את Compose: גבו אותה.

ה-Compose Analyzer ‏(ruleset 1.0.0) בדק את docker-compose.yml: 0 שגיאה, 0 גבוה, 0 בינוני ו-10 נמוך. מתכון מתפרסם רק בלי ממצאי שגיאה וגבוה.

להמשיך בכלים

הקישור פותח את ה-Compose Generator עם האפליקציות, האפשרויות והחשיפה האלה, ועם ה-Deployment Spec של הערכת המשאבים הזו, כך ש-cloud-init וה-Runbook מתחילים מאותו מצב.

לפתוח במסע

Runbook

לפני ההפעלה הראשונה

  1. העתיקו את .env.example ל-.env ליד docker-compose.yml ומלאו כל ערך. ‏Compose נעצר עם שגיאה כל עוד ערך חובה חסר.
  2. צרו את OPEN_WEBUI_SECRET_KEY במחשב שלכם, למשל עם openssl rand -hex 32. ‏ANAROQ אף פעם לא יוצר סיסמאות או מפתחות.
  3. צרו את SEARXNG_SECRET במחשב שלכם, למשל עם openssl rand -hex 32. ‏ANAROQ אף פעם לא יוצר סיסמאות או מפתחות.
  4. השאירו את Caddyfile ליד docker-compose.yml; קונטיינר Caddy מחבר אותו לקריאה בלבד.
  5. פורטים 80 ו-443 (TCP, ו-443/UDP ל-HTTP/3) חייבים להיות נגישים מהאינטרנט כדי ש-HTTPS האוטומטי של Caddy יעבוד.
  6. לפני ההפעלה, כוונו את רשומות A/AAAA של הדומיין שב-OPEN_WEBUI_DOMAIN ‏(open-webui) לשרת הזה; ‏Caddy מבקש את התעודה שלו בהפעלה הראשונה.
  7. לפני ההפעלה, כוונו את רשומות A/AAAA של הדומיין שב-SEARXNG_DOMAIN ‏(searxng) לשרת הזה; ‏Caddy מבקש את התעודה שלו בהפעלה הראשונה.
  8. מודלים לא יורדים אוטומטית: ‏docker compose exec open-webui-ollama ollama pull <model>. ‏CPU בלבד, בלי GPU.
  9. הפעילו את ה-stack עם docker compose up -d ועקבו אחריו עם docker compose ps.

אחרי ההפעלה הראשונה

  1. לאפשר תשובות JSON ב-SearXNG

    אחרי ההפעלה הראשונה, הוסיפו json ל-search.formats בקובץ ‎/etc/searxng/settings.yml ‏(ה-volume ‏searxng-config), ואז הפעילו מחדש את SearXNG. בלי זה החיפושים של Open WebUI נכשלים עם 403 Forbidden.

    search:
      formats:
        - html
        - json
  2. לכוון את Open WebUI אל SearXNG

    ב-Open WebUI, פתחו Settings, אחר כך Admin, אחר כך Web Search. הפעילו חיפוש ברשת, בחרו searxng כמנוע והזינו את כתובת השאילתה שלמטה.

    http://searxng:8080/search
  3. לבדוק את החיבור

    פתחו צ'אט, הפעילו בו חיפוש ברשת ושאלו על משהו עדכני. התשובה מציגה את הדפים ש-SearXNG החזיר; ‏403 אומר שפורמט ה-JSON עדיין כבוי.

מה האפליקציות חולקות

  • שתי האפליקציות מקבלות שם מארח ציבורי דרך Caddy. ‏SearXNG לא מוגדר כ-instance ציבורי (ה-limiter שלו כבוי), לכן שמרו את שם המארח שלו לעצמכם או הגבילו אותו ב-Caddyfile; ‏Open WebUI לא צריך ש-SearXNG יהיה ציבורי.
  • חיפוש ברשת מוסיף את הדפים שנשלפו להקשר של המודל. ברמה הקלה ההקשר של המודל קטן, לכן השאירו מספר נמוך של תוצאות חיפוש בהגדרות החיפוש ברשת של Open WebUI.
  • גבו את ה-volume של הנתונים של Open WebUI ואת ה-volume של ההגדרות של SearXNG ‏(‎/etc/searxng), שמכיל את settings.yml שתערכו בהמשך. ה-volume של ה-cache של SearXNG לא צריך גיבוי.

חלופות

  • בלי חיפוש ברשת, Open WebUI לבד מספיק: הדף שלו מעריך את המשאבים ופותח אותו ב-Compose Generator. Open WebUI
  • ‏Open WebUI יכול להשתמש גם ב-API חיפוש מתארח במקום SearXNG; זה חוסך את האפליקציה השנייה אבל שולח כל שאילתה לאותו ספק.

בסיס

קטלוג
2026.10.10
מדיניות הערכת משאבים
2026.10.0
מנוע Compose
@anaroq/compose 1.0.0
ruleset של ה-Analyzer
1.0.0

מקורות

איך נבנים הפרופילים, הערכות המשאבים וקבצי ה-Compose מתואר במתודולוגיה. לקריאת המתודולוגיה

כל האפליקציות ל-self-hosting