Skip to main content

SearXNG

warning

Open WebUI 的 SearXNG 集成目前处于实验阶段。

这是一个教程,指导您如何搭建 SearXNG 用于 Open WebUI。

使用前请阅读

在集成 Open WebUI 和 SearXNG 之前,了解要求至关重要。

对于各种搜索引擎(如 Google、Bing、Wikipedia 等)正常工作,它们必须能够识别您的请求。这需要外部网络连接和公共 IP 地址。如果您在没有外部网络访问的封闭网络中运行此设置,您将无法搜索需要外部连接的引擎。

请记住,您的搜索查询将从托管您的 SearXNG 实例的服务器的公共 IP 地址发起。如果您使用的是家用网络连接,搜索引擎可能会检测到这种模式并可能限制或阻止请求。您可能需要研究企业级网络连接、VPS/云服务器实例,或者从专门的提供商购买住宅代理。有关详细信息,请参考 SearXNG 文档

许多搜索引擎对可以从单个IP地址发起的查询数量有速率限制。如果超过这些限制,您可能会暂时或永久被阻止。考虑实施速率限制或使用多个IP地址来减轻此风险。

1. 使用修改的配置文件设置 SearXNG

要让 SearXNG 正常工作,您需要自定义配置文件。以下是配置文件的示例及设置 SearXNG 的完整详细信息。

第 1 步:克隆 SearXNG Docker 仓库

  1. 将 SearXNG Docker 仓库克隆到您的主机:

    git clone https://github.com/searxng/searxng-docker.git
    cd searxng-docker

第 2 步:设置环境变量

  1. 编辑 .env 文件并更新 SEARXNG_HOSTNAME

    SEARXNG_HOSTNAME=localhost:8080

    如果您使用域名,请相应更新:

    SEARXNG_HOSTNAME=search.domain.com

第 3 步:编辑 docker-compose.yaml 文件

  1. 确保您的 searxng-docker/docker-compose.yaml 文件包含以下内容:
searxng-docker/docker-compose.yaml
services:
redis:
container_name: redis
image: redis:alpine
command: redis-server --save 30 1 --loglevel warning
restart: unless-stopped
volumes:
- redis-data:/data
cap_drop:
- ALL
cap_add:
- SETGID
- SETUID
- DAC_OVERRIDE

searxng:
container_name: searxng
image: searxng/searxng:latest
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"

volumes:
redis-data:

第 4 步:启动容器

  1. 启动容器以生成配置文件:

    docker compose up -d

第 5 步:停止容器并修改设置

  1. 启动后停止容器以修改设置:

    docker compose down

第 6 步:更新 Limiter 设置

  1. 打开 searxng-docker/searxng/limiter.toml 文件并更新以下设置:
searxng-docker/searxng/limiter.toml
[botdetection.ip_limit]
# 在 'real_ip.x_for' 中配置的真实IP的每秒请求数
# 在下面的示例中,每个(真实)IP的限制为 3 次搜索/秒。

link_token = true
real_ip.x_for = 1
real_ip.ipv4_prefix = 32
real_ip.ipv6_prefix = 48

# activate link_token method in the ip_limit method
link_token = false

# GET request from an IP
window = 20
limit = 200

# POST request from an IP / a POST request is always a search
[botdetection.ip_limit.POST]
window = 20
limit = 100

[botdetection.link_token]
# 内部生成的令牌可用于限制搜索请求的速率

# 激活链接令牌方法以对搜索请求进行速率限制
link_token = false

# GET request from a browser
[botdetection.link_token.GET]
window = 60
limit = 600

# POST request from a browser / a POST request is always a search
[botdetection.link_token.POST]
window = 60
limit = 60

第 7 步:自定义搜索引擎配置

  1. 要自定义搜索引擎,请修改 searxng-docker/searxng/engines.yml 文件:
searxng-docker/searxng/engines.yml
# 这个文件配置 SearXNG 可用的引擎
# 各个部分的语法和选项在上游文档中有详细说明:
# https://docs.searxng.org/admin/engines/

# 全局引擎设置

# 对于使用 "default" 搜索语言的每个请求,添加以下搜索语言
default_lang: ""

# 引擎配置
engines:
- name: '9gag'
disabled: true

- name: 'acgsou'
disabled: true

- name: 'annas archive'
disabled: false

- name: 'arch linux wiki'
disabled: false

- name: 'arxiv'
disabled: false

- name: 'bandcamp'
disabled: true

- name: 'wikipedia'
disabled: false

- name: 'bing'
disabled: false

- name: 'bing images'
disabled: true

- name: 'bing news'
disabled: false

- name: 'bing videos'
disabled: true

- name: 'bitbucket'
disabled: true

- name: 'bpb'
disabled: true

- name: 'btdigg'
disabled: true

- name: 'ccc-tv'
disabled: true

- name: 'crossref'
disabled: false

- name: 'crowdview'
disabled: false

- name: 'currency'
disabled: false

- name: 'deezer'
disabled: true

- name: 'deviantart'
disabled: true

- name: 'ddg definitions'
disabled: false

- name: 'docker hub'
disabled: false

- name: 'duckduckgo'
disabled: false

- name: 'duckduckgo images'
disabled: true

- name: 'duckduckgo videos'
disabled: true

- name: 'erowid'
disabled: true

- name: 'wikidata'
disabled: false

- name: 'duckduckgo weather'
disabled: false

- name: 'fdroid'
disabled: true

- name: 'flickr'
disabled: true

- name: 'free software directory'
disabled: false

- name: 'z-library'
disabled: false

- name: 'github'
disabled: false

- name: 'gitlab'
disabled: false

- name: 'google'
disabled: false

- name: 'google images'
disabled: true

- name: 'google news'
disabled: false

- name: 'google videos'
disabled: true

- name: 'google scholar'
disabled: false

- name: 'hackernews'
disabled: false

- name: 'imdb'
disabled: true

- name: 'imgur'
disabled: true

- name: 'ina'
disabled: true

- name: 'invidious'
disabled: false

- name: 'jisho'
disabled: true

- name: 'library genesis'
disabled: false

- name: 'library of congress'
disabled: false

- name: 'lingva'
disabled: false

- name: 'lobste.rs'
disabled: false

- name: 'mastodon users'
disabled: true

- name: 'mdn'
disabled: false

- name: 'metacpan'
disabled: false

- name: 'microsoft translator'
disabled: false

- name: 'mixcloud'
disabled: true

- name: 'mwmbl'
disabled: false

- name: 'npm'
disabled: false

- name: 'openstreetmap'
disabled: true

- name: 'openverse'
disabled: true

- name: 'package'
disabled: false

- name: 'peertube'
disabled: true

- name: 'piped'
disabled: false

- name: 'piped.music'
disabled: true

- name: 'pypi'
disabled: false

- name: 'qwant'
disabled: false

- name: 'qwant images'
disabled: true

- name: 'qwant videos'
disabled: true

- name: 'qwant news'
disabled: false

- name: 'reddit'
disabled: false

- name: 'rottentomatoes'
disabled: true

- name: 'sepiasearch'
disabled: true

- name: 'soundcloud'
disabled: true

- name: 'stackoverflow'
disabled: false

- name: 'startpage'
disabled: false

- name: 'tineye'
disabled: true

- name: 'tokyotoshokan'
disabled: true

- name: 'translate'
disabled: false

- name: 'unsplash'
disabled: true

- name: 'yacy'
disabled: false

- name: 'yahoo'
disabled: false

- name: 'yahoo news'
disabled: false

- name: 'yandex'
disabled: false

- name: 'yandex images'
disabled: true

- name: 'yandex music'
disabled: true

- name: 'yandex videos'
disabled: true

- name: 'youtube'
disabled: false

- name: 'rumble'
disabled: false

- name: 'brave'
disabled: false

- name: 'brave.images'
disabled: true

- name: 'brave.videos'
disabled: true

- name: 'brave.news'
disabled: false

- name: 'stract'
disabled: false

- name: 'mojeek'
disabled: false

- name: 'mojeek news'
disabled: false

- name: 'librex'
disabled: false

- name: 'librey'
disabled: false

- name: 'right dao'
disabled: false

- name: 'seekr images'
disabled: true

- name: 'seekr news'
disabled: false

- name: 'seekr'
disabled: false

- name: 'sjp.pwn'
disabled: true

- name: 'stract images'
disabled: true

- name: 'wttr.in'
disabled: false

- name: 'yep'
disabled: false

- name: 'yep images'
disabled: true

- name: 'yep news'
disabled: false

- name: 'alexandria'
disabled: false

- name: 'wikibooks'
disabled: false

- name: 'wikinews'
disabled: false

- name: 'wikiquote'
disabled: false

- name: 'wikisource'
disabled: false

- name: 'wiktionary'
disabled: false

- name: 'wikiversity'
disabled: false

- name: 'wikivoyage'
disabled: false

- name: 'wolfram alpha'
disabled: false

- name: 'dictzone'
disabled: true

- name: 'mymemory translated'
disabled: false

- name: 'brave.goggles'
disabled: false

- name: 'yacy images'
disabled: true

- name: 'internetarchivescholar'
disabled: false

- name: 'openalex'
disabled: false

- name: 'pd literature'
disabled: false

- name: 'core.ac.uk'
disabled: false

- name: 'semantic scholar'
disabled: false

- name: 'livespace'
disabled: false

- name: 'wordnik'
disabled: false

- name: 'woxikon.de synonyme'
disabled: true

- name: 'searchmysite'
disabled: false

- name: 'sourcehut'
disabled: false

- name: 'tagesschau'
disabled: true

- name: 'kaufland'
disabled: true

- name: 'seznam'
disabled: true

- name: 'mullvad leta'
disabled: false

- name: 'qdrant'
disabled: false

- name: 'radio browser'
disabled: true

- name: 'discourse'
disabled: false

- name: 'goo'
disabled: true

- name: 'bt4g'
disabled: true

- name: 'goodreads'
disabled: false

- name: 'naver'
disabled: true

- name: 'rubygems'
disabled: false

- name: 'commandlinefu'
disabled: false

- name: 'funkwhale'
disabled: true

- name: 'ask'
disabled: false

- name: 'pub.dev'
disabled: false

- name: 'sourcehut git'
disabled: false

- name: 'sourcehut hg'
disabled: false

- name: 'voidlinux'
disabled: false

- name: 'gitea.com'
disabled: false

- name: 'forgejo.org'
disabled: false

- name: 'codeberg.org'
disabled: false

- name: 'gitiles'
disabled: false

- name: 'dockerhub'
disabled: false

- name: 'apple app store'
disabled: true

- name: 'loc.gov'
disabled: false

- name: 'artic'
disabled: true

- name: 'lingva'
disabled: false

第 8 步:更新 settings.yml 文件

  1. 确保您的 searxng-docker/searxng/settings.yml 文件与以下内容匹配:
searxng-docker/searxng/settings.yml
# 有关详细文档,请参见 https://docs.searxng.org/admin/settings/index.html

use_default_settings: true

general:
debug: false
instance_name: "SearXNG"
privacypolicy_url: false
donation_url: false
contact_url: false
enable_metrics: false

brand:
new_issue_url: ""
docs_url: ""
public_instances: ""
wiki_url: ""
issue_url: ""

search:
safe_search: 0
autocomplete: ""
default_lang: ""
ban_time_on_fail: 5
max_ban_time_on_fail: 120
formats:
- html
- json

server:
# 从命令行参数或环境变量SEARXNG_PORT覆盖
port: 8080
bind_address: "0.0.0.0"

ui:
static_use_hash: true

search:
safe_search: 0
autocomplete: ""
default_lang: ""
formats:
- html
- json # json是必需的
# 删除格式以拒绝访问,使用小写。
# formats: [html, csv, json, rss]
redis:
# 连接redis数据库的URL。被${SEARXNG_REDIS_URL}覆盖。
# https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis
url: redis://redis:6379/0

settings.yml文件中SearXNG的端口应与您的docker-compose.yml文件中SearXNG的端口号匹配。

第 9 步:更新 uwsgi.ini 文件

  1. 确保您的 searxng-docker/searxng/uwsgi.ini 文件与以下内容匹配:
searxng-docker/searxng/uwsgi.ini
[uwsgi]
# 谁将运行代码
uid = searxng
gid = searxng

# 工作进程数(通常为CPU数量)
# 默认值:%k(= CPU核心数,见Dockerfile)
workers = %k

# 每个工作进程的线程数
# 默认值:4(见Dockerfile)
threads = 4

# 在创建的套接字上授予的权限
chmod-socket = 666

# 要使用的插件和解释器配置
single-interpreter = true
master = true
plugin = python3
lazy-apps = true
enable-threads = 4

# 要导入的模块
module = searx.webapp

# 虚拟环境和python路径
pythonpath = /usr/local/searxng/
chdir = /usr/local/searxng/searx/

# 自动将进程名称设置为有意义的名称
auto-procname = true

# 为了隐私禁用请求日志记录
disable-logging = true
log-5xx = true

# 设置请求的最大大小(不包括请求体)
buffer-size = 8192

# 无keep alive
# 参见 https://github.com/searx/searx-docker/issues/24
add-header = Connection: close

# uwsgi提供静态文件
static-map = /static=/usr/local/searxng/searx/static
# 过期时间设置为一天
static-expires = /* 86400
static-gzip-all = True
offload-threads = 4

2. 替代设置

另外,如果您不想修改默认配置,您可以简单地创建一个空的 searxng-docker 文件夹并按照其余的设置说明进行操作。

Docker Compose 设置

将以下环境变量添加到您的 Open WebUI docker-compose.yaml 文件中:

services:
open-webui:
environment:
ENABLE_RAG_WEB_SEARCH: True
RAG_WEB_SEARCH_ENGINE: "searxng"
RAG_WEB_SEARCH_RESULT_COUNT: 3
RAG_WEB_SEARCH_CONCURRENT_REQUESTS: 10
SEARXNG_QUERY_URL: "http://searxng:8080/search?q=<query>"

为SearXNG创建 .env 文件:

# SearXNG
SEARXNG_HOSTNAME=localhost:8080/

接下来,将以下内容添加到SearXNG的 docker-compose.yaml 文件中:

services:
searxng:
container_name: searxng
image: searxng/searxng:latest
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng:rw
env_file:
- .env
restart: unless-stopped
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"

您的堆栈现在可以启动了:

docker compose up -d
note

在首次运行时,您必须从 docker-compose.yaml 文件中的 searxng 服务删除 cap_drop: - ALL,以便成功创建 /etc/searxng/uwsgi.ini。这是必要的,因为 cap_drop: - ALL 指令会移除所有功能,包括创建 uwsgi.ini 文件所需的功能。首次运行后,您应该重新添加 cap_drop: - ALLdocker-compose.yaml 文件中以确保安全。

另外,您可以直接使用 docker run 运行SearXNG:

docker run --name searxng --env-file .env -v ./searxng:/etc/searxng:rw -p 8080:8080 --restart unless-stopped --cap-drop ALL --cap-add CHOWN --cap-add SETGID --cap-add SETUID --cap-add DAC_OVERRIDE --log-driver json-file --log-opt max-size=1m --log-opt max-file=1 searxng/searxng:latest

3. 确认连接

在命令行界面中确认从您的Open WebUI容器实例到SearXNG的连接:

docker exec -it open-webui curl http://host.docker.internal:8080/search?q=this+is+a+test+query&format=json

4. GUI配置

  1. 导航至:管理面板 -> 设置 -> Web搜索
  2. 切换 启用Web搜索
  3. 从下拉菜单将 Web搜索引擎 设置为 searxng
  4. Searxng查询URL 设置为以下示例之一:
  • http://searxng:8080/search?q=<query>(使用容器名称和暴露端口,适用于基于Docker的设置)
  • http://host.docker.internal:8080/search?q=<query>(使用 host.docker.internal DNS名称和主机端口,适用于基于Docker的设置)
  • http://<searxng.local>/search?q=<query>(使用本地域名,适用于本地网络访问)
  • https://<search.domain.com>/search?q=<query>(使用自托管SearXNG实例的自定义域名,适用于公共或私有访问)

请注意 /search?q=<query> 部分是必需的。

  1. 相应调整 搜索结果数量并发请求
  2. 保存更改

SearXNG GUI配置

5. 在聊天中使用Web搜索

要访问Web搜索,请单击消息输入字段旁边的+号。

在这里您可以切换Web搜索的开/关。

Web搜索UI切换

按照这些步骤,您将成功设置SearXNG与Open WebUI,使您能够使用SearXNG引擎执行网络搜索。

注意

您必须在聊天中明确切换此功能的开/关。

这是基于每个会话启用的,例如重新加载页面、切换到另一个聊天将切换为关闭。