SearXNG Docker 部署教程:搭建自己的搜索入口

在 VPS 上部署 SearXNG 与 Valkey,通过 SSH 隧道使用,逐一检查上游引擎、私人入口和配置恢复。

·6 minDocker
BRNCHost:Bursa土耳其游戏服务器,1Gbps端口,DDoS防护
建站开服,云上轻松起步|雨云 RCS · 宝塔 / 1Panel 预装
RackNerd:海外VPS21.99美元每年起
晚安云:香港云服务器2核2G15元每月
野草云:香港200Mbps峰值带宽,不限月流量,30元每月起
大陆优化,连接海外应用|搬瓦工 · CN2 GIA / CTGNet 套餐
WorkBuddy:交代任务,交付文件
腾讯云:锐驰型200Mbps峰值带宽,中国内地2核2G50元每月
DMIT:Premium中国大陆优化线路CN2GIA
LisaHost:原生与住宅IP产品,按套餐选择
Evoxt:最高6.0GHz CPU,2.99美元每月起
京东云:AI进入真实业务

搜一个技术问题时,常常会在几个搜索引擎之间来回切换。SearXNG 可以把多个引擎的结果汇到同一个页面,并按自己的习惯选择来源、语言和分类。它需要向上游引擎发起请求,VPS 的网络出口会直接影响结果是否完整。

本文搭建私人实例,通过 SSH 隧道访问。先把搜索功能和引擎连通性查清楚,再考虑域名入口;不把它直接开放成任何人都能访问的公共搜索站。

采用当前容器结构,留下配置和缓存目录

准备已安装 Docker Engine 与 Compose 的 Linux VPS。当前官方容器模板使用 SearXNG 与 Valkey 两个服务,配置目录为 /etc/searxng,持久缓存目录为 /var/cache/searxng。这里基于这套结构改成仅绑定本机端口,并固定首次获取的镜像。

SearXNG 选服务器时,除了资源余量,还要检查该节点能否连接自己常用的搜索引擎。需要新建私人实例,可以查看雨云云服务器的区域与配置,优惠码 KuZhuJi。选择 Linux 实例后,用本文的查询样例逐一检查上游;地区或线路名称不能保证某个引擎不触发验证码,私人访问仍按下面的隧道方案安排。

mkdir -p ~/apps/searxng/core-config
cd ~/apps/searxng
umask 077
docker pull docker.io/searxng/searxng:latest
printf 'SEARXNG_IMAGE=%s\n' "$(docker image inspect --format '{{index .RepoDigests 0}}' docker.io/searxng/searxng:latest)" > .env
printf 'SEARXNG_SECRET=%s\n' "$(openssl rand -hex 32)" >> .env

确认 .env 中镜像摘要非空,密钥已生成。保存为 compose.yml:

services:
  core:
    image: ${SEARXNG_IMAGE:?请固定镜像摘要}
    restart: unless-stopped
    ports:
      - "127.0.0.1:3014:8080"
    environment:
      SEARXNG_PORT: 8080
      SEARXNG_BIND_ADDRESS: 0.0.0.0
      SEARXNG_SECRET: ${SEARXNG_SECRET:?请生成独立密钥}
      SEARXNG_BASE_URL: http://localhost:3014/
      SEARXNG_VALKEY_URL: valkey://valkey:6379/0
    volumes:
      - ./core-config:/etc/searxng
      - ./core-data:/var/cache/searxng
    depends_on:
      - valkey
  valkey:
    image: valkey/valkey:9-alpine
    restart: unless-stopped
    command: valkey-server --save 30 1 --loglevel warning
    volumes:
      - ./valkey-data:/data

另存 core-config/settings.yml:

use_default_settings: true
server:
  limiter: false
  public_instance: false
search:
  formats:
    - html

这个示例使用默认引擎设置,只启用 HTML 搜索输出。limiter: false 的前提是仅通过受控隧道使用;公共实例必须重新设计访问控制、限流、可信代理和上游使用规则。Valkey 不映射宿主机端口。

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 core valkey

在自己的电脑建立隧道:

ssh -N -L 3014:127.0.0.1:3014 user@VPS_IP

替换账号与地址,在浏览器打开 http://localhost:3014。应用内部监听 0.0.0.0 是为容器端口转发服务;真正限制外部入口的是宿主机侧的 127.0.0.1:3014。

主页可用以后,用三类查询检查上游

先搜一个常见项目名,再搜一段带引号的官方文档标题,最后试一次自己经常使用的语言查询。观察每次是否有结果、是否有引擎报错,以及结果中的链接能否正常打开。

SearXNG 主页能访问,只证明 Web 服务工作。结果少、某些引擎持续超时或要求验证码,可能与 VPS 出口 IP、上游限制、DNS、TLS 或该引擎适配有关。先看页面错误提示和 core 日志,再单独检查失败来源,不要一次更改整个引擎列表。

选择引擎也不必越多越好。保留实际能用、结果相关的来源,关闭持续失败或与日常任务无关的来源,更容易解释一次搜索为什么缺少某类结果。修改 settings.yml 后重启服务,并重跑相同查询,比较的是自己的可用性,而不是推断搜索引擎的整体质量。

私人域名需要另外配置访问控制

如果要长期用域名访问,把 SEARXNG_BASE_URL 改成实际 HTTPS 地址,再让反向代理连接宿主机本机端口。代理应在全部路径执行认证,或把入口限制在 VPN 内;SearXNG 的搜索页不是你的用户登录系统。

修改 Compose 环境变量后,用 docker compose up -d 重建 core,不能仅重启旧容器。容器内代理则使用共同网络中的 core:8080 作为上游。接入域名后,再检查搜索提交、偏好设置和页面内链接是否指向正确地址。

自建入口仍会把查询发送给选中的上游引擎。VPS、反向代理日志和浏览器历史也可能留下查询信息。处理私人搜索时,按自己的用途决定日志保留范围,不能把“自建”直接理解成查询完全不离开服务器。

备份配置,升级时保留原来的可用引擎组合

配置和密钥决定实例行为,缓存则可按用途保存。一次完整目录备份可以这样做:

mkdir -p backups
docker compose stop
sudo tar -czf "backups/searxng-$(date +%Y%m%d-%H%M%S).tar.gz" core-config core-data valkey-data .env compose.yml
sudo chmod 600 backups/*.tar.gz
docker compose start

把备份副本转移到独立位置。恢复演练使用另一个 Compose 项目和本机端口,检查配置可加载、偏好可保存以及原来的常用引擎仍可搜索。升级前保留旧镜像摘要、配置与验证查询;遇到上游故障时,回退镜像也未必能恢复引擎服务,应根据具体错误判断。

容器结构见 SearXNG 官方安装文档,缓存连接配置见 Valkey 设置说明。