从一次额度耗尽说起
我的搜索 API 额度又用完了。Tavily 返回 432,Firecrawl 还剩 500 credits,但这东西每月刷新,月底准光。
不是第一次了。每次快到月底,我都要盘算剩下的 credits 够不够撑到下个月。这种焦虑挺蠢的——搜索本来就不应该是付费资源。但市面上主流方案(Tavily、Firecrawl、SerpAPI)清一色按量计费,唯一的区别是免费层给多给少。
直到我看到 Hermes Agent v0.14.0 支持了 SearXNG 作为搜索后端。SearXNG 是一个开源的元搜索引擎,聚合 Google、Bing、Baidu 等 70+ 引擎,可以自己部署在一台服务器上。成本为零,额度无限。
花了 15 分钟在阿里云上跑起来,切后端,测试通过。再也不用焦虑 API 额度了。

SearXNG 是什么
SearXNG 是一个隐私优先的元搜索引擎。它自己不爬网页,而是把查询转发给上游搜索引擎,聚合结果再返回。支持 HTML 页面和 JSON API,能当浏览器搜索引擎用,也能当程序的后端接口。
核心特点:
- 聚合 70+ 搜索引擎(Google、Bing、百度、搜狗、Wikipedia 等)
- 支持类别搜索(general、news、images、videos)
- 隐私模式——不在服务器端存储查询
- JSON API,适合程序集成
- 纯 Docker 部署,一条命令启动
部署:15 分钟就够了
你需要一台有 Docker 环境的 Linux 设备,NAS、云服务器、树莓派都行。我用的阿里云轻量应用服务器,2C2G 够用。
1. 启动容器
docker pull searxng/searxng:latest
docker run -d \
--name searxng \
--restart=unless-stopped \
-p 8888:8080 \
-v /opt/searxng/settings.yml:/etc/searxng/settings.yml:ro \
-v /opt/searxng/limiter.toml:/etc/searxng/limiter.toml:ro \
-e SEARXNG_BASE_URL="http://your-server-ip:8888/" \
-e SEARXNG_SECRET_KEY="<replace-with-random-hex>" \
searxng/searxng:latest
如果你是新机器,DockerHub 拉取有匿名限速,可以用 GitHub Container Registry 替代:ghcr.io/searxng/searxng。
2. 配置文件
配置文件 settings.yml 是最关键的部分。几个核心配置项:
search:
formats:
- html
- json # JSON API 必须开启
server:
port: 8080
bind_address: "0.0.0.0"
limiter: false # 内网使用无需限流
engines:
- name: baidu
- name: sogou
- name: bing
- name: google
- name: wikipedia
如果需要搜索引擎能访问海外源(Google、Wikipedia 等),在 outgoing.proxies 下配置代理地址即可。注意容器内的 127.0.0.1 指向容器自身,如果代理跑在宿主机上,需使用 Docker bridge 网关地址(通常是 172.17.0.1)。
3. 内网安全:不暴露公网端口
我将 SearXNG 端口不对外开放,只通过 VPN 内网访问。这样防火墙规则简单,也不需要操心认证——物理上就不在公网上。
具体做法:在服务器上搭建 VPN 或 mesh 网络,SearXNG 监听内网 IP,只有 VPN 内的机器能访问。阿里云控制台的防火墙只放行 SSH 和 VPN 通信端口即可。
4. 与 Hermes Agent 集成
如果你是 Hermes Agent 用户,集成就两行:
export SEARXNG_URL=http://your-server-vpn-ip:8888
hermes config set web.search_backend searxng
搜索走 SearXNG,页面提取(web_extract)可以继续用 Firecrawl。两者可以拆分配置。
踩坑记录
部署过程中踩了几个典型的坑,如果你也要自部署,可能会遇到。
坑 1:Docker bridge 网关地址
配置代理时注意,SearXNG 容器里的 127.0.0.1 指向容器自己,不是宿主机。在默认 bridge 网络下,宿主机网关地址是 172.17.0.1。
docker exec searxng ip route | grep default
如果代理跑在宿主机上,settings.yml 里的代理地址应写 http://172.17.0.1:<端口>。
坑 2:默认配置覆盖自定义端口
SearXNG 镜像有 use_default_settings: true,它会加载默认配置,其中 port = 8080。如果你在 settings.yml 里写别的端口,会被覆盖。
最简单的解决方式:不改端口,直接用 Docker 端口映射。容器内始终监听 8080,宿主机上映射成你想要的端口。
坑 3:阿里云轻量服务器的防火墙
阿里云轻量应用服务器的防火墙和 ECS 安全组是两套系统——API 不同,控制台位置也不同。如果不小心用 ECS 的 API 去配,配了也没用。
不过如果选择不通公网,防火墙配置就简单多了——只放行 SSH 和 VPN 通信端口即可。
当前搜索方案格局
自部署 SearXNG 之后,我现在的搜索方案是三层并存:

| 方案 | 用途 | 额度 | 切换方式 |
|---|---|---|---|
| Firecrawl | 主力搜索 + 页面提取 | 500 credits/月 | hermes config set web.search_backend firecrawl |
| SearXNG | 主力搜索(无限) | 无限 | hermes config set web.search_backend searxng |
| AnySearch | 垂直搜索补充 | CLI 工具 | 手动调用 |
Firecrawl 做页面提取,SearXNG 做搜索,两者互补。SearXNG 没有额度概念,想搜多少次搜多少次。
结语
自部署搜索网关这件事,我最大的感受是:很多你每月付费的在线服务,其实都有开源替代品。区别只是你想不想花 15 分钟把它架起来。
SearXNG 配置简单、资源占用低(2C2G 跑得很轻松),配合 mesh VPN 做到绝对安全。如果你也在为 API 搜索额度发愁,不如试试自己搭一个。