# Настройка SearXNG для Open WebUI - Рабочее решение ## Обзор Данное решение обеспечивает работу веб-поиска через SearXNG в Open WebUI. Решены проблемы с JSON форматом, лимитером и багом User-Agent в Open WebUI v0.8.3. ## Архитектура ``` Open WebUI → SearXNG → Поисковые движки (Google, DuckDuckGo, Brave и др.) ``` ## Компоненты решения ### 1. Конфигурация SearXNG (`searxng/settings.yml`) ```yaml # SearXNG Settings для работы с Open WebUI # Этот файл включает поддержку JSON формата для API запросов use_default_settings: true server: secret_key: "CHANGE_ME_SECRET_KEY" bind_address: "0.0.0.0" port: 8080 limiter: false # КРИТИЧНО: отключен для работы внутри Docker сети method: "GET" search: safe_search: 0 autocomplete: "google" formats: - html - json # КРИТИЧНО: JSON формат обязателен для Open WebUI general: instance_name: "SearXNG" debug: false ``` **Ключевые моменты:** - `limiter: false` - отключает защиту от ботов (необходимо для запросов из Open WebUI) - `formats: [html, json]` - включает JSON формат для API запросов - Файл монтируется через bind mount, поэтому настройки сохраняются после перезапуска ### 2. Конфигурация Docker Compose (`docker-compose.yml`) ```yaml services: searxng: image: ghcr.io/searxng/searxng:latest container_name: searxng restart: always volumes: - ./searxng:/etc/searxng:rw # Bind mount для сохранения настроек - searxng_cache:/var/cache/searxng networks: - iieasy-ai environment: - SEARXNG_BASE_URL=http://searxng:8080/ deploy: resources: limits: memory: 512M open-webui: image: ghcr.io/open-webui/open-webui:v0.8.3 container_name: open-webui restart: unless-stopped volumes: - openwebui_data:/app/backend/data - ./scripts/fix_user_agent.sh:/fix_user_agent.sh:ro # Патч для User-Agent entrypoint: ["/bin/sh", "-c", "sh /fix_user_agent.sh && exec /bin/bash /app/start.sh"] networks: - iieasy-ai depends_on: searxng: condition: service_started environment: # SearXNG веб-поиск - RAG_WEB_SEARCH_ENGINE=searxng - SEARXNG_QUERY_URL=http://searxng:8080/search?q=&format=json - ENABLE_WEB_SEARCH=true - WEB_SEARCH_RESULT_COUNT=5 - WEB_SEARCH_TRUST_ENV=true - WEB_SEARCH_CONCURRENT_REQUESTS=1 - USER_AGENT=Open-WebUI-RAG-Bot ``` **Ключевые моменты:** - `SEARXNG_QUERY_URL` содержит явное указание `format=json` - Патч User-Agent применяется автоматически через entrypoint - Контейнеры находятся в одной сети `iieasy-ai` ### 3. Патч User-Agent (`scripts/fix_user_agent.sh`) Патч исправляет баг в Open WebUI v0.8.3, где User-Agent начинается с пробела, что вызывает ошибку "Invalid leading whitespace". **Что делает патч:** - Ищет все варианты проблемной строки `' (https://github.com/open-webui/open-webui) RAG Bot'` - Заменяет на `'Open-WebUI-RAG-Bot'` - Исправляет варианты в файлах: - `/app/backend/open_webui/routers/retrieval.py` - `/app/backend/open_webui/utils/middleware.py` - `/app/backend/open_webui/retrieval/loaders/external_web.py` - И других файлах с проблемной строкой - Очищает кеш Python (`.pyc` файлы) ## Установка и настройка ### Шаг 1: Подготовка файлов 1. Убедитесь, что файл `searxng/settings.yml` существует и содержит правильную конфигурацию 2. Убедитесь, что файл `scripts/fix_user_agent.sh` существует и исполняемый ### Шаг 2: Запуск контейнеров ```bash cd /home/its/iiEasyWeb sudo docker compose up -d ``` ### Шаг 3: Проверка работы ```bash # Проверка SearXNG sudo docker ps | grep searxng # Проверка JSON формата sudo docker exec open-webui curl -s "http://searxng:8080/search?q=test&format=json" | head -c 200 # Проверка логов на ошибки sudo docker logs open-webui --tail 50 | grep -i "error\|user-agent\|invalid" ``` ### Шаг 4: Настройка в интерфейсе Open WebUI 1. Откройте Open WebUI в браузере 2. Перейдите в **Settings → Web Search** 3. Убедитесь, что: - Движок: **SearXNG** - URL: `http://searxng:8080/search?q=&format=json` - Переключатель "Web Search" **включен** - "Одновременные запросы" установлено в **1** или больше (не 0) ## Скрипты для обслуживания ### Диагностика (`scripts/diagnose_search.sh`) Проверяет все компоненты системы поиска: ```bash sudo ./scripts/diagnose_search.sh ``` ### Исправление конфигурации SearXNG (`scripts/fix_searxng_config.sh`) Исправляет конфигурацию SearXNG после перезапуска: ```bash sudo ./scripts/fix_searxng_config.sh ``` ### Агрессивное исправление User-Agent (`scripts/fix_user_agent_aggressive.sh`) Ищет и исправляет проблемную строку User-Agent во всех файлах: ```bash sudo ./scripts/fix_user_agent_aggressive.sh ``` ### Полное исправление (`scripts/fix_search_complete.sh`) Выполняет все исправления за один раз: ```bash sudo ./scripts/fix_search_complete.sh ``` ## Решенные проблемы ### 1. Ошибка "403 Forbidden" при запросе JSON **Причина:** SearXNG по умолчанию не разрешает JSON формат для безопасности. **Решение:** Добавлено `formats: [html, json]` в секцию `search:` файла `settings.yml`. ### 2. Ошибка "Invalid leading whitespace" в User-Agent **Причина:** Баг в Open WebUI v0.8.3 - User-Agent начинается с пробела. **Решение:** Патч `fix_user_agent.sh` автоматически исправляет проблемную строку при старте контейнера. ### 3. Ошибка "X-Forwarded-For nor X-Real-IP header is set" **Причина:** SearXNG блокирует запросы без реального IP (защита от ботов). **Решение:** Отключен лимитер (`limiter: false`) в `settings.yml`, так как система работает внутри закрытой Docker сети. ### 4. Потеря настроек после перезапуска **Причина:** Изменения внутри контейнера не сохраняются. **Решение:** Использован bind mount `./searxng:/etc/searxng:rw` для сохранения `settings.yml` на хосте. ## Улучшение покрытия поиска Если нужно больше результатов, можно включить дополнительные движки: ```bash # Включить DuckDuckGo sudo docker exec searxng sed -i '/- name: duckduckgo/,/disabled:/ s/disabled: true/disabled: false/' /etc/searxng/settings.yml # Включить Brave sudo docker exec searxng sed -i '/- name: brave$/,/disabled:/ s/disabled: true/disabled: false/' /etc/searxng/settings.yml # Перезапустить sudo docker restart searxng ``` ## Проверка работоспособности ### Тест 1: Прямой запрос к SearXNG ```bash sudo docker exec open-webui curl -s "http://searxng:8080/search?q=test&format=json" | grep -q "results" && echo "✓ JSON работает" || echo "✗ JSON не работает" ``` ### Тест 2: Проверка патча User-Agent ```bash sudo docker exec open-webui grep -r "github.com/open-webui.*RAG Bot" /app/backend 2>/dev/null | wc -l # Должно вернуть 0 ``` ### Тест 3: Поиск в интерфейсе 1. Откройте чат в Open WebUI 2. Задайте вопрос с включенным поиском (например: "Какая погода в Уфе сегодня?") 3. Должны появиться результаты поиска без ошибок ## Логи и отладка ### Просмотр логов SearXNG ```bash sudo docker logs searxng --tail 50 ``` ### Просмотр логов Open WebUI ```bash sudo docker logs open-webui --tail 50 | grep -i "searxng\|error\|user-agent" ``` ### Проверка сетевого подключения ```bash # Из контейнера Open WebUI к SearXNG sudo docker exec open-webui curl http://searxng:8080/status ``` ## Важные замечания 1. **Безопасность:** Лимитер отключен только для внутренней сети Docker. Если выставляете SearXNG наружу, включите лимитер обратно. 2. **Производительность:** Ограничение памяти SearXNG до 512M предотвращает перегрузку системы. 3. **Стабильность:** Некоторые движки (Google, Bing) могут блокировать запросы с серверов. Это нормально - SearXNG использует другие доступные движки. 4. **Обновления:** При обновлении образа Open WebUI патч User-Agent будет применяться автоматически благодаря entrypoint в docker-compose.yml. ## Структура файлов ``` /home/its/iiEasyWeb/ ├── docker-compose.yml # Конфигурация Docker Compose ├── searxng/ │ └── settings.yml # Конфигурация SearXNG (bind mount) └── scripts/ ├── fix_user_agent.sh # Основной патч User-Agent ├── fix_user_agent_aggressive.sh # Агрессивный патч ├── fix_user_agent_final.sh # Финальный патч ├── fix_searxng_config.sh # Исправление конфигурации SearXNG ├── diagnose_search.sh # Диагностика системы поиска └── fix_search_complete.sh # Полное исправление ``` ## Версия - Open WebUI: v0.8.3 - SearXNG: latest (2026.2.16+8e824017d) - Дата настройки: Февраль 2026 ## Поддержка При возникновении проблем: 1. Запустите диагностику: `sudo ./scripts/diagnose_search.sh` 2. Проверьте логи: `sudo docker logs open-webui --tail 100` 3. Выполните полное исправление: `sudo ./scripts/fix_search_complete.sh` --- **Решение протестировано и работает стабильно.**