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`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Решение протестировано и работает стабильно.**
|