Linux things 🐧

un blog sur les technologies des logiciels libres et autres digressions

SearXNG : un meta moteur de recherche

de la recherche anonyme

Sat, 31 Aug 2024 17:00:50 +0200
# searxng   # recherche   # nomad  

[Update 09.24]

Introduction

Il y a quelque temps j’ai découvert via Korben son article sur un moteur de recherche opensource propulsé à l’IA. J’ai rapidement testé sur mon PC de gamer mais j’ai quelques bémols :

  • Si je veux utiliser Perplexica en permanence il faut alors que mon PC soit allumé H24, ce qui peut poser des problèmes de facture d’électricité. On parle ici d’un PC avec une carte graphique ASRock AMD Radeon RX 7800 XT et d’un processeur AMD Ryzen 7 7700X ; à chaque recherche le GPU sera sollicité par ollama.
  • La configuration pour une utilisation non locale mais via Tailscale (pour pouvoir être utilisé par mon mobile) est pénible à configurer et nécessite de modifier les fichiers de configuration docker
  • Les résultats ne sont pas forcément suffisament pertinent pour le moment, cela me parait un outil complémentaire à un moteur de recherche.

Par contre cela m’a permis de redécouvrir SearXNG utilisé par Perplexica. Korben se plante car SearXNG ne fonctionne pas du tout en P2P, il doit confondre avec YaCy en Java. Pour un usage personnel ™ je banni tous les logiciels en Java (lourdeur, usine à gaz, consommateur de RAM, 💩) mais j’ai décidé de mettre en place SearXNG (en Python).

SearXNG

Ce projet est un meta moteur de recherche, c’est à dire qu’il utilise les moteurs de recherche existant, type Google, Bing, Brave, etc. Lors d’une recherche sur une instance SearXNG celle-ci interroge ces moteurs et affiche les résultats à l’utilisateur. Ainsi à aucun moment l’utilisateur se connecte aux serveurs de Google et autres. Ils n’ont aucun moyen de savoir qui a fait la recherche ni obtenir des meta données par du fingerprinting. Ils ne voient que l’IP de l’instance SearXNG 🥷

Pour un libriste l’idéal serait d’utiliser un vrai moteur de recherche libre mais cela demande d’énormes ressources coté serveurs afin de générer et maintenir un index. Qwant s’y est d’ailleurs cassé les dents et utilise en grande partie Bing 🤡
Il existe bien un vrai moteur de recherche opensource, Stract (codé en Rust, je précise car si c’était en PHP on pourrait avoir quelques doutes) mais pour l’instant il n’est pas encore assez pertinent ce qui n’est pas surprenant, mais à surveiller.

Faute de mieux l’idéal est l’utilisation d’un meta moteur qui fera les recherches sur tous les autres moteurs de manière anonyme, afin de diminuer fortement la surface de profiling. J’utilisais il y a peu Startpage société Européenne mais il y a peu d’options de paramétrages notamment sur l’usage de tel ou tel autre moteur.

Nomad

J’ai pu rapidement mettre en place SearXNG sur mon infra Nomad et le service tourne physiquement sur mon NUC chez moi. Les scripts sont disponibles sur Codeberg mais voici quelques explications.

Caddy

Tout d’abord la configuration du reverse proxy Caddy (chez Scaleway) par des labels, qui va reverse mon sous-domaine vers le conteneur sur le NUC.

searxng-caddy.hcl

job "searxng-caddy" {
  datacenters = ["dc1"]
  type = "service" 
  group "app" {
     count = 1

     task "searxng-caddy" {
     		driver = "docker"

			constraint {
			 attribute = "${attr.unique.hostname}"
			 value     = "node1"
			}

            template {
                data = <<EOH
				        # as service 'searxng' is registered in Consul
				        # we want to grab its 'allocport' tag
				        {{- range $tag, $services := service "searxng" | byTag -}}
				        {{if $tag | contains "allocport"}}
				            {{$allocId := index ($tag | split "=") 1}}
				            SERVICE_PORT="{{ $allocId }}"
				        {{end}}
				        {{end}}
                EOH
                destination = "secrets/file.env"
                env         = true
            }

			config {
				image = "fredix/sleep"

				labels = {
					"caddy" = "search.fredix.xyz"
					"caddy.reverse_proxy" = "http://searxng.service.consul:${SERVICE_PORT}"
					# remove the following line when you have verified your setup
					# Otherwise you risk being rate limited by let's encrypt
					"caddy.tls.ca" = "https://acme-v02.api.letsencrypt.org/directory"
					"caddy.header" = "Strict-Transport-Security max-age=31536000"					
				}
			}

			resources {
			   cpu = 10
			   memory = 10
			}
	
			service {
				 name = "searxng-caddy"
			   tags = ["global", "app"]
			   provider = "consul"

			}
     	}
  }
}

nomad job run searxng-caddy.hcl

Comme expliqué dans mon procédent article sur Nomad c’est assez simple et rapide à déployer. Caddy utilise Consul qui va résolver le domaine searxng.service.consul vers l’IP Tailscale du conteneur. Grâce au template il récupère le port du conteneur cible searxng.

Le conteneur

searxng.hcl

job "searxng" {
  datacenters = ["dc1"]
  type = "service" 
  group "home" {
     count = 1

     network {
     	mode = "bridge"
			port "http" {
			     to     = 8080 # container port the app runs on
			     host_network = "tailscale"
			  }
			port "redis" {
				  to     = 6379 # container port the app runs on
				}			          
      }

     task "searxng" {
     		driver = "docker"

			constraint {
			 attribute = "${attr.unique.hostname}"
			 value     = "nuc"
			}

			env {
				BASE_URL = "https://search.fredix.xyz"
				INSTANCE_NAME = "https://search.fredix.xyz"
				SEARXNG_LIMITER = "true"
				SEARXNG_PUBLIC_INSTANCE = "true"
				SEARXNG_REDIS_URL = "redis://localhost:6379/0"
			}
			config {
			   image = "searxng/searxng"
				volumes = [
				"/data/volumes/searxng:/etc/searxng"
				]				
			   ports = [
			      "http"
			   ]
			}

			resources {
			   cpu = 1000
			   memory = 1000
			}

			service {
			   name = "searxng"
			   provider = "consul"
			   port = "http"
			   
			   tags = ["allocport=${NOMAD_HOST_PORT_http}"]
			}
     	}

     task "redis" {
     		driver = "docker"

				constraint {
				 attribute = "${attr.unique.hostname}"
				 value     = "nuc"
				}

				config {
				   image = "redis"
				   ports = [
				      "redis"
				   ]			   								
				}

				resources {
				   cpu = 500
				   memory = 500
				}

				service {
					name     = "redis-searxng"
					provider = "consul"
					port     = "redis"
				}      
     	}

   }
}

nomad job run searxng.hcl

J’ai du mettre en place Redis car une instance publique semble en avoir besoin. Cependant si vous faites tourner SearXNG en mode privé il ne devrait pas être nécessaire, voir la doc consacrée à Docker.

Libération

Et voilà c’est en place, mon instance search.fredix.xyz fonctionne et vous pouvez l’utiliser à moins que vous n’ayez peur que je vrille en Big Brother (les recherches ne sont pas dans les logs). Dans ce cas vous pouvez utiliser une autre instance publique si vous n’avez pas envie de vous auto-héberger (voir l’annuaire sur searx.space).
La réponse à la recherche est plutôt rapide et la pertinence excellente évidement. A savoir que vous pouvez choisir les moteurs que SearXNG utilisera de 2 manières :

  • Soit vous allez dans les préférences utlisateur via la roue dentée en haute à droite, puis dans l’onglet Moteurs vous pouvez activer désactiver les moteurs de recherche (ne pas oublier de cliquer sur le bouton Enregistrer en bas de page). Ça utilisera un cookie, il n’y a évidemment pas de compte à créer.
  • Soit plus simplement vous pouvez préfixer une recherche par un raccourci, par exemple !go toto forcera SearXNG à n’utiliser que Google uniquement pour cette recherche.

Mon instance est configurée comme moteur de recherche par défaut sur mes navigateurs Vivaldi et Firefox (ajouter comme URL de recherche https://search.fredix.xyz/?q=%s), c’est une étape indispensable pour la protection contre les GAFAM ✊

(Ce texte a été écrit avec VNote)