从一次额度耗尽说起
我的搜索 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 分钟就够了
你需要一台有公网 IP 的 Linux 服务器,和 Docker 环境。我用的阿里云轻量应用服务器,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
outgoing:
proxies:
all://:
- http://172.17.0.1:7890
注意到 proxies 部分了吗?这是国内部署最关键的配置。Google、Wikipedia 等国外搜索引擎需要代理才能访问。
3. 内网安全:不暴露公网端口
我选择不通公网——SearXNG 的 8888 端口不对外开放,只通过 VPN 内网访问。这样防火墙规则简单,也不需要操心认证。
我用的是 EasyTier,一个开源 mesh VPN 方案,在阿里云和本地机器之间拉起一个加密的虚拟网络。SearXNG 在内网地址 10.144.144.2:8888 上监听,只有 mesh 网络内的机器能访问。
这样做的好处:不需要 HTTPS、不需要反向代理、不需要认证配置——物理上就不在公网上。
4. 与 Hermes Agent 集成
如果你是 Hermes Agent 用户,集成就两行:
export SEARXNG_URL=http://10.144.144.2:8888
hermes config set web.search_backend searxng
搜索走 SearXNG,页面提取(web_extract)可以继续用 Firecrawl。两者可以拆分配置。
踩坑记录
部署过程中踩了四个坑,如果你也要自部署,可能会遇到。
坑 1:Docker bridge 代理地址

SearXNG 容器里的 127.0.0.1 指向容器自己,不是宿主机。在 Docker bridge 网络下,宿主机地址是 172.17.0.1。
# 验证容器的默认网关
docker exec searxng ip route | grep default
# → default via 172.17.0.1 dev eth0
settings.yml 里的代理地址得写 http://172.17.0.1:7890。
坑 2:默认配置覆盖自定义端口
SearXNG 镜像有 use_default_settings: true,它会加载默认配置,其中 port = 8080。如果你在 settings.yml 里写别的端口,会被覆盖。
最简单的解决方式:不改端口,直接用 Docker 端口映射。容器内始终监听 8080,宿主机上映射成你想要的端口。
坑 3:阿里云轻量服务器的防火墙
阿里云轻量应用服务器的防火墙和 ECS 安全组是两套系统——API 不同,控制台位置也不同。如果不小心用 ECS 的 API 去配,配了也没用。
不过既然我选择了不通公网,这一步基本跳过:防火墙只放行 SSH(22)、EasyTier(23000)和 Nanobot(20128)三个端口就够了。
坑 4:宿主机上的 Mihomo
如果代理软件直接跑在宿主机(而非 Docker 容器里),需要确保它的 allow-lan: true 和 bind-address: '*' 已开启。否则 Docker bridge 网络下的容器无法通过 172.17.0.1:7890 访问代理。
当前搜索方案格局
自部署 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 搜索额度发愁,不如试试自己搭一个。