各位老友们好,我是 Chlorine。今天继续水文。

其实本期正确的标题应该是:

《如何基于 1Panel 和 OpenResty 在内地服务器上搭建开源私有化的搜索引擎》

这样或许对 SEO 好点,但是小氯对于这件事一向是摆烂(你对什么事情不摆烂啊喂),所以直接加入 hello 宇宙就好了。

前言

众所周知,全球的搜索引擎巨头们都对用户隐私有着非常高的尊重,从不收集你的历史记录、搜索记录、位置、时间、联系信息、联系人、使用数据、财务信息、健康状况、诊断信息、购买项目、设备标识符、敏感信息等你不希望它们收集的东西,也不会使用你的数据去分析你的偏好或者产出内容农场。同时它们对于广告也有着非常好的管控,每一次的搜索结果都不会含有任何广告,尤其是在中国大陆拥有最大影响力的百度,确保了你良好的搜索体验。而且它们也尊重竞争对手的权利,不会对竞争对手的搜索结果 SEO 做任何的打压。这种负责任的做法获得了全球计算机爱好者和广大用户的一致好评。好的,请还在笑的老友收一收,茶都洒到衣服上了。

在隐私保护方面,可能也就是 DuckDuckGo 能做得好点。不过 DuckDuckGo 在大陆地区因为某些原因访问并不顺畅,而且这毕竟还是把数据交给第三方,肯定会有老友感觉不大舒服的。

不过没关系,小氯曾经说:开源社区是万能的。如果所有搜索引擎的巨头都做不好这一点,那么我们自托管一个开源的就好了。那么,有请今天的主角——SearXNG。

SearXNG

我不大清楚 SearXNG 的名字是怎么来的,可能和 SearX 有关。

SearXNG 是一个用 Python 写的元搜索引擎。That is,它自己并不提供搜索引擎的职能,而是通过分析和综合各大搜索引擎的结果来进行高效的查找(当然,用我们的小服务器去爬整个互联网也是不现实的)。SearXNG 不收集任何用户数据,一切的偏好全部以 Cookie 的形式存在于本地,同时采用各种方式来避免任何在搜索过程中暴露个人信息的行为。

如果各位老友没有条件自部署,也可以去 https://searx.space 找几个已经部署好的实例尝尝鲜。

前置说明

请注意,如果您的已有条件和需求不满足下面所述,那小氯推荐您还是先别看文章了,还是先去紫荆公寓的公共空间喝杯茶更能体现对您生命的尊重。

条件:

  • 一台自己的服务器
  • 一个能够顺利访问世界互联网的 endpoint
  • 一台电脑
  • 手,脑子

需求:

  • 希望部署一个私有化的搜索引擎
  • 不希望使用 SearXNG 原生的 Caddy 作为反代(本文使用 1Panel 面板和 OpenResty,其他反代服务器应该可以类推,但是这需要您自己来做)

好的,我们开始。

拉取 Git 仓库

[!tip]
如果您有能够可视化上传的面板的话,在本地编辑也没问题。我就是这么干的。

首先随便选个目录,比如 /usr/local。按理说在哪应该都无所谓,但是我推荐就在这里,防止出现什么奇奇怪怪的问题。

官方的仓库有点问题,小氯给大家准备了一个修复版的,具体改动是:

  • 删除了 Caddy 相关配置
  • 创建了 uwsgi.ini 以避免 # cp: can't create '/etc/searxng/uwsgi.ini': Permission denied 报错(官方居然把这个文件加到 .gitignore 了,难绷)
  • 直接增加了出站代理设置
  • 默认关闭 limiter 限制(个人实例一般不用,如果希望打开,修改 settings.ymllimiter 键为 true
cd /usr/local
git clone https://github.com/yoghurtlee-thu/searxng-docker-fixed.git

如果访问不畅,可以使用 SSH 或者是我准备的国内镜像:

cd /usr/local
git clone https://gitee.com/yoghurtlee-thu/searxng-docker-fixed.git

完事之后,用你喜欢的编辑器打开仓库,进行一点小小的编辑。

设置访问密钥

执行命令:

sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml

如果出现报错就试一试:

sed -i"" -e "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml

Windows 用户可以使用(官方的,我没试过):

$randomBytes = New-Object byte[] 32
(New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($randomBytes)
$secretKey = -join ($randomBytes | ForEach-Object { "{0:x2}" -f $_ })
(Get-Content searxng/settings.yml) -replace 'ultrasecretkey', $secretKey | Set-Content searxng/settings.yml

然后打开 settings.yml,如果发现原本的 ultrasecretkey 变成了一串乱七八糟的字符,那么就成功了。

编辑环境变量

编辑 .env 文件,将 # SEARXNG_HOSTNAME=<host> 那一行取消注释,<host> 改为你希望绑定的域名。不需要带 HTTP 或者 HTTPS。

修改 docker-compose.yml

找到第 32 行,就是我写注释的那个位置。把左边的端口改成你喜欢的。

增加代理

由于某些原因,境内服务器能访问的搜索引擎比较有限。为了让我们的信息获取渠道更加多样,我们需要配置一下代理。别问我哪来的代理,问就是光荣而伟大的孙哥。

settings.yml 中的第 32 行,把两个 http://ip:port 改成你的 endpoint 即可。

这里我照抄了官方配置,更多信息请参考这里。

启!动!

编辑完文件后,就可以开始启动了。

在目录下以 sudo 模式执行:

docker-compose up -d

等待部署完成即可。友情提示,如果有代理推荐打开,可以避免一些问题,但是一般没事。

完成后打开你的部署地址,如果看到:

An image to describe post

恭喜你,部署成功。现在试着搜索一下吧。可以在首选项那里进行各种配置。

不过有点难绷的一点是,我搜索我自己的站点没有任何结果,但是在 Google、Bing 和 DuckDuckGo 上页面的权重都是第一。而且我使用别的 SearXNG 实例搜索,结果是不一样的。我很难理解这一点。

设置反代

略。

设置密码

我们部署的是私人实例,为了防止被一些 unwanted visitor 使用,我们可以使用一个密码来进行保护。当然,不开也行。只要你不分享你的域名,同时禁止掉爬虫,基本上只可能通过 DNS 扫描来扫出来有这么个域名(还无法知道这个域名是干什么的)。

在 1Panel 上设置密码相当容易,在网站-网站设置-密码访问中设置就可以。

设置默认搜索引擎

这么好的引擎,不用起来怎么能行。这里我只讲 Arc(Chrome 系,比如 Chrome、Edge 等基本同理)和 LibreWolf(Firefox 系基本同理)的方法。

Arc

在地址栏键入 arc://settings 进入设置界面,点击「搜索引擎」选项卡。滑到「网站搜索」,按如下格式填写:

An image to describe post

添加后右面三个点,选择设为默认即可。

LibreWolf

快捷键 ⌘ + , 进入设置界面,在搜索选项卡配置。方法与 Arc 基本一样。

小氯温馨提示:这种注重隐私的搜索引擎,和 LibreWolf 这种注重隐私的浏览器更配哦。

总结

总体而言 SearXNG 还是相当不错的,我目前已经将它设置为全平台通用的默认引擎了。

大体响应速度是 2-3s,还算可以接受。不过感觉有时候结果不是很准,所以我现在把它和 DuckDuckGo 混用。

再次感谢伟大的开源社区。祝各位老友互联网之旅愉快。