307 lines
11 KiB
Markdown
307 lines
11 KiB
Markdown
# Настройка 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`
|
||
|
||
---
|
||
|
||
**Решение протестировано и работает стабильно.**
|