de la recherche anonyme
Sat, 31 Aug 2024 17:00:50 +0200[Update 09.24]
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 :
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).
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.
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.
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
.
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.
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 :
!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)