基于Whoogle自建无广告、无追踪的搜索引擎

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 基于Whoogle自建无广告、无追踪的搜索引擎

1.png

我在周刊项目[1]第 003 期 (08-30~09-03)[2]中介绍了一个开源的元搜索引擎项目whoogle-search[3],这个项目有几个吸引我的特性:


  • 没有广告以及赞助内容

  • 不追踪个人 IP

  • Tor & HTTP/SOCKS 支持

  • 设置 No JS&Cookie


  • 易部署

  • 更多特性去项目地址查看

到目前我差不多用了三个月,完全满足我日常使用需求,也很少用Google了,这次将Whoogle正式部署到了我的k3s集群,中间踩了不少坑,输出这篇文章以作记录。


部署


所谓元数据搜索引擎就是基于其他搜索引擎的基础上做一些基础功能,whoogle-search就是在Google搜索结果的基础上增加了上述功能,所以对于检索质量来说是和谷歌一致的。


如果你有自己的服务器(海外优先),我推荐你使用Whoogle作为自己的搜索引擎。如果没有服务器,也没关系,目前有很多免费资源供开发者日常使用,如:


  • heroku[4]

  • Repl.it[5]

  • Fly.io[6]

单机部署


单机部署的话非常简单,推荐直接使用Docker,一行命令搞定:

docker run -d -it -p 5000:5000 --restart=always --name whoogle-search benbusby/whoogle-search:latest

如果你有域名且希望上https,可以考虑结合Caddy使用Letsencrypt来实现。


集群部署


我个人的话在自己购买的几台服务器上有部署一套k3s集群(开源、极轻量的 Kubernetes 发行版),所以我准备直接在集群上部署whoogle-search并绑定域名上https,这件事花了我一整天的时间才做完,写这篇文章的目的也完全是为了记录我踩的坑,接下来直接放出可行的解决方案。


k3s集群相关依赖版本如下:


  • k3s[7]: v1.21.3+k3s1

  • traefik[8]: v2.4.8

  • cert-manager[9]: v1.6.1

k3s集群安装搭建这里先不提,后面等我玩熟了会出一篇文章聊聊,提一句,如果你不熟悉k8s但又感兴趣的话,可以看看我之前学习k8s过程中产出的开源笔记:


  • github[10]

  • 网页访问[11]:k8s 学习之路

先安装cert-manager

kubectl create namespace cert-manager
kubectl apply --validate=false -f  https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml
# 查看状态
kubectl get pods --namespace cert-manager
# 输出
NAME                                      READY   STATUS    RESTARTS   AGE
cert-manager-55658cdf68-4m5r5             1/1     Running   0          25h
cert-manager-cainjector-967788869-x5cpk   1/1     Running   0          25h
cert-manager-webhook-6668fbb57d-4cv2c     1/1     Running   0          25h

一旦运行成功,我们将使用ClusterIssuer资源类型来支持Letsencrypt为我们颁发证书,创建文件letsencrypt.yaml,输入内容:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    email: <your>@<email>.<com> # input your email
    privateKeySecretRef:
      name: letsencrypt-issuer-account-key
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - http01:
          ingress:
            ingressTemplate:
              metadata:
                annotations:
                  kubernetes.io/ingress.class: traefik

在终端执行:

kubectl apply -f letsencrypt.yaml
# 查看状态
kubectl get clusterissuers
# 输出
NAME                 READY   AGE
letsencrypt-issuer   True    114m
# 更详细的信息可查看
kubectl describe clusterissuers letsencrypt
# 输出
Status:
  Acme:
    Last Registered Email:
    Uri:                    https://acme-v02.api.letsencrypt.org/acme/acct/
  Conditions:
    Last Transition Time:  2021-12-01T07:08:43Z
    Message:               The ACME account was registered with the ACME server
    Observed Generation:   1
    Reason:                ACMEAccountRegistered
    Status:                True
    Type:                  Ready
Events:                    <none>

接下来我们直接在k3s部署whoogle,创建文件whoogle.yaml,输入内容:

apiVersion: v1
kind: Service
metadata:
  name: whoogle
spec:
  ports:
  - name: whoogle-5000-tcp
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: whoogle
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoogle
  labels:
    app: whoogle
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoogle
  template:
    metadata:
      labels:
        app: whoogle
    spec:
      containers:
        - name: whoogle
          image: benbusby/whoogle-search:latest
          resources:
            limits:
              cpu: '1'
              memory: 512M
            requests:
              cpu: '1'
              memory: 512M
          ports:
              - containerPort: 5000

在终端执行:

kubectl apply -f ./whoogle.yaml
# 查看 pod 状态
kubectl get pods
# 输出
NAME                       READY   STATUS    RESTARTS   AGE
whoogle-7c95b49ddd-dqgs7   1/1     Running   0          25h
# 查看 svc 状态
kubectl get svc
# 输出
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
whoogle      ClusterIP   10.42.163.248   <none>        5000/TCP   25h

此时whoogle服务已经正常启动,接下来要做的就是利用traefikcert-manager进行域名绑定和https,这个过程我踩了好几个坑,如果你也遇到了Waiting for HTTP-01 challenge propagation: wrong status code '404', expected '200',可以参考我的配置示例,创建文件whoogle-ingress-tls.yaml,输入配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoogle-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
    cert-manager.io/cluster-issuer: "letsencrypt-issuer"
    traefik.ingress.kubernetes.io/frontend-entry-points: http, https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
spec:
  tls:
    - secretName: s-demo-cn
      hosts:
        - s-demo-cn
  rules:
    - host: s-demo-cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoogle
                port:
                  number: 5000

等待片刻,在终端执行以下命令查看状态:

kubectl apply -f whoogle-ingress-tls.yaml
# 查看 ingress
kubectl get ingress
# 输出
NAME              CLASS    HOSTS             ADDRESS            PORTS     AGE
whoogle-ingress   <none>   s.demo.cn          1.2.3.4           80, 443   123m
# 查看证书
kubectl get cert
# 输出
NAME                  READY   SECRET                AGE
s-demo-cn             True    s-demo-cn            125m
# 查看密钥
kubectl describe secret s-demo-cn
# 输出
Name:         s-demo-cn
Namespace:    default
Labels:       <none>
Annotations:  cert-manager.io/alt-names: s.demo.cn
              cert-manager.io/certificate-name: s-demo-cn
              cert-manager.io/common-name: s.demo.cn
              cert-manager.io/ip-sans:
              cert-manager.io/issuer-group: cert-manager.io
              cert-manager.io/issuer-kind: ClusterIssuer
              cert-manager.io/issuer-name: letsencrypt-issuer
              cert-manager.io/uri-sans:
Type:  kubernetes.io/tls
Data
====
tls.crt:  5603 bytes
tls.key:  1675 bytes
# 如果有问题,可以查看详情进行排查
kubectl describe certificate s-demo-cn
kubectl describe certificaterequest s-demo-cn
kubectl describe challenges s-demo-cn

至此,问题解决,留此记录,本文主要提供了一种在k3s集群下利用traefik&cert-manager让服务https化的方法。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
JavaScript 定位技术 API
百度离线地图API v3.0开发解决方案
百度离线地图API v3.0开发解决方案
746 0
|
2月前
|
应用服务中间件 API nginx
网站统计——利用开源的网站流量分析统计工具
网站统计——利用开源的网站流量分析统计工具
47 0
|
5月前
|
存储 弹性计算 关系型数据库
100W用户、8000W流量在线贺卡应用架构如何优化?
100W用户、8000W流量在线贺卡应用架构如何优化?
|
10月前
|
Kubernetes 网络协议 Linux
百度搜索:蓝易云【【K8S&RockyLinux】基于开源操作系统搭建K8S高可用集群教程。】
这是一个简要的教程,用于基于Rocky Linux搭建Kubernetes高可用集群。请注意,具体步骤可能因Kubernetes版本、网络插件选择和环境配置而有所不同。在实际搭建过程中,请参考相关文档和官方指南,并根据您的需求进行适当的调整和配置。
655 0
|
JavaScript 数据管理 应用服务中间件
如何搭建一个极简的广告系统?
如何搭建一个极简的广告系统?
1573 0
网站:推荐几款好用的在线短链生成工具
短链技术目前对网站推广非常的有用,有了它就可以把非常长的网址缩短。这样分享推广起来非常方便。今天小编给大家推荐几款不错的在线短链生成网站,感兴趣的朋友可以下载试一试!
网站:推荐几款好用的在线短链生成工具
|
存储 缓存 搜索推荐
郁金香搜索引擎的方案
先介绍学心理学的时候记住的两个把妹秘籍:   1>巴甫洛夫把妹法:巴甫洛夫的狗的反射试验上学的时候大家都应该学过,天天给狗喂食的时候摇铃,后来不喂食只摇铃狗还是分泌唾液。应用到把妹这个非常有实际意义的事情上面就是:每天给妹子送早晨,等人家形成了习惯,突然不送了,人家就开始觉得不自在了,开始各种想这个男孩纸~~   2>吊桥效应:在吊桥上,由于危险的情境,人们会不自觉地心跳加快,错把由这种情境引起的心跳加快理解为对方使自己心动,才产生的生理反应,故而对对方滋生出爱情的情愫。   心理学是门很实用的学问吧[偷笑][偷笑]。
郁金香搜索引擎的方案
|
新零售 存储 数据采集
新功能: 阿里云爬虫风险管理利器 - 实时日志分析 (一)
阿里云反爬管理与日志服务打通,对外开放访问与机器人攻击日志。提供近实时的网站具体的日志自动采集存储、并提供基于日志服务的查询分析、报表报警、下游计算对接与投递的能力。
3486 0
|
应用服务中间件 nginx JavaScript