למה האפליקציות האלה יחד
צוות קטן או משק בית רוצים צ'אט 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 נותן את אותם מספרים.
| רכיב | vCPU | RAM (GiB) | דיסק (GiB) |
|---|---|---|---|
| Open WebUI | 3 | 5.75 | 18.472 |
| SearXNG | 0.5 | 0.5 | 0.6 |
| בסיס המערכת | 0.1 | 1.25 | 8.3 |
| מרווח ביטחון | 0.72 | 1.5 | 4.106 |
| סה"כ מומלץ | 4.32 | 9 | 31.478 |
Caddy לא כלול בחישוב המשאבים של ה-Stack Sizer וה-Deployment Spec.
קבצים מה-Compose Generator
# 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: {}
# 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=
# 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
10 ממצאים: 0 שגיאה, 0 גבוהה, 0 בינונית, 10 נמוכה, 0 מידע.
נמוכה10
- נמוכהAQ-HLTH-005שורה 8, עמודה 5
services.open-webuiopen-webui לא מגביל את גודל הלוגים שלו (
logging.options.max-size).תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.
- נמוכהAQ-SEC-005שורה 11, עמודה 7
services.open-webui.environmentopen-webui מעביר סודות דרך
environment(WEBUI_SECRET_KEY).תיקון: כשה-image תומך בזה, השתמשו ב-
secrets:או במשתנה_FILEבמקום. - נמוכהAQ-HLTH-002שורה 24, עמודה 5
services.open-webui-ollamaל-open-webui-ollama אין
healthcheck.תיקון: הוסיפו healthcheck, כדי ש-Compose ואתם תדעו מתי השירות מוכן.
- נמוכהAQ-HLTH-005שורה 24, עמודה 5
services.open-webui-ollamaopen-webui-ollama לא מגביל את גודל הלוגים שלו (
logging.options.max-size).תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.
- נמוכהAQ-HLTH-005שורה 31, עמודה 5
services.searxngsearxng לא מגביל את גודל הלוגים שלו (
logging.options.max-size).תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.
- נמוכהAQ-SEC-005שורה 34, עמודה 7
services.searxng.environmentsearxng מעביר סודות דרך
environment(SEARXNG_SECRET).תיקון: כשה-image תומך בזה, השתמשו ב-
secrets:או במשתנה_FILEבמקום. - נמוכהAQ-HLTH-002שורה 54, עמודה 5
services.caddyל-caddy אין
healthcheck.תיקון: הוסיפו healthcheck, כדי ש-Compose ואתם תדעו מתי השירות מוכן.
- נמוכהAQ-HLTH-005שורה 54, עמודה 5
services.caddycaddy לא מגביל את גודל הלוגים שלו (
logging.options.max-size).תיקון: הגבילו את גודל הלוגים כדי שלא ימלאו את הדיסק.
- נמוכהAQ-PORT-005שורה 60, עמודה 9
services.caddy.ports.0הקובץ מפרסם 3 מיפויי פורטים. Docker מפרסם פורטים בלי לעבור דרך כללי ufw.
תיקון: סננו אותם בשרשרת
DOCKER-USERאו בחומת האש של הספק, או אל תפרסמו אותם. - נמוכהAQ-VOL-005שורה 64, עמודה 9
services.caddy.volumes.0caddy מחבר את הנתיב היחסי ./Caddyfile.
תיקון: זה עובד, אבל הנתונים נמצאים בתיקייה שממנה מריצים את Compose: גבו אותה.
ה-Compose Analyzer (ruleset 1.0.0) בדק את docker-compose.yml: 0 שגיאה, 0 גבוה, 0 בינוני ו-10 נמוך. מתכון מתפרסם רק בלי ממצאי שגיאה וגבוה.
להמשיך בכלים
הקישור פותח את ה-Compose Generator עם האפליקציות, האפשרויות והחשיפה האלה, ועם ה-Deployment Spec של הערכת המשאבים הזו, כך ש-cloud-init וה-Runbook מתחילים מאותו מצב.
Runbook
לפני ההפעלה הראשונה
- העתיקו את
.env.exampleל-.envלידdocker-compose.ymlומלאו כל ערך. Compose נעצר עם שגיאה כל עוד ערך חובה חסר. - צרו את OPEN_WEBUI_SECRET_KEY במחשב שלכם, למשל עם
openssl rand -hex 32. ANAROQ אף פעם לא יוצר סיסמאות או מפתחות. - צרו את SEARXNG_SECRET במחשב שלכם, למשל עם
openssl rand -hex 32. ANAROQ אף פעם לא יוצר סיסמאות או מפתחות. - השאירו את
Caddyfileלידdocker-compose.yml; קונטיינר Caddy מחבר אותו לקריאה בלבד. - פורטים 80 ו-443 (TCP, ו-443/UDP ל-HTTP/3) חייבים להיות נגישים מהאינטרנט כדי ש-HTTPS האוטומטי של Caddy יעבוד.
- לפני ההפעלה, כוונו את רשומות A/AAAA של הדומיין שב-OPEN_WEBUI_DOMAIN (open-webui) לשרת הזה; Caddy מבקש את התעודה שלו בהפעלה הראשונה.
- לפני ההפעלה, כוונו את רשומות A/AAAA של הדומיין שב-SEARXNG_DOMAIN (searxng) לשרת הזה; Caddy מבקש את התעודה שלו בהפעלה הראשונה.
- מודלים לא יורדים אוטומטית:
docker compose exec open-webui-ollama ollama pull <model>. CPU בלבד, בלי GPU. - הפעילו את ה-stack עם
docker compose up -dועקבו אחריו עםdocker compose ps.
אחרי ההפעלה הראשונה
לאפשר תשובות JSON ב-SearXNG
אחרי ההפעלה הראשונה, הוסיפו json ל-search.formats בקובץ /etc/searxng/settings.yml (ה-volume searxng-config), ואז הפעילו מחדש את SearXNG. בלי זה החיפושים של Open WebUI נכשלים עם 403 Forbidden.
search: formats: - html - jsonלכוון את Open WebUI אל SearXNG
ב-Open WebUI, פתחו Settings, אחר כך Admin, אחר כך Web Search. הפעילו חיפוש ברשת, בחרו searxng כמנוע והזינו את כתובת השאילתה שלמטה.
http://searxng:8080/searchלבדוק את החיבור
פתחו צ'אט, הפעילו בו חיפוש ברשת ושאלו על משהו עדכני. התשובה מציגה את הדפים ש-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 מתואר במתודולוגיה. לקריאת המתודולוגיה