Files
iiEsaywebUI/SEARXNG_SETUP.md

307 lines
11 KiB
Markdown
Raw Normal View History

# Настройка 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=<query>&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=<query>&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`
---
**Решение протестировано и работает стабильно.**