SearXNG è un meta-motore di ricerca open-source che aggrega i risultati di decine di motori (Google, Bing, DuckDuckGo, Brave Search e molti altri), restituendoli attraverso un’interfaccia pulita, priva di pubblicità e completamente sotto il nostro controllo. A differenza dei motori di ricerca tradizionali, SearXNG non memorizza alcuna informazione sulle ricerche effettuate e non costruisce profili utente, rendendolo uno strumento ideale per chi vuole riprendere il controllo della propria privacy online.
La Privacy delle Nostre Ricerche
Per comprendere il valore di un servizio come SearXNG, è utile capire come i motori di ricerca tradizionali riescono a identificare e profilare chi li utilizza, e come SearXNG sia in grado di neutralizzare ciascuna di queste tecniche di profilazione.
| Tecnica di tracciamento | Come funziona | Come SearXNG protegge |
|---|---|---|
| Cookie e sessioni | Cookie persistenti riconoscono lo stesso browser nel tempo, ricostruendo l’intera cronologia delle ricerche | Nessun cookie viene impostato. Le preferenze (lingua, tema, motori attivi) restano nel browser locale o codificate nell’URL |
| Browser fingerprinting | Risoluzione schermo, font, sistema operativo, fuso orario, WebGL e altri parametri compongono un’impronta digitale unica del browser | Il browser non comunica mai con i motori di ricerca: le richieste partono dal server come semplici chiamate HTTP, senza alcun dato sul dispositivo |
| Profilazione delle ricerche | Le query, i click e il tempo su ogni pagina costruiscono un profilo interessi che personalizza i risultati, creando una filter bubble | Nessuna cronologia viene memorizzata e i risultati non sono personalizzati, garantendo risposte neutrali |
| Tracciamento dei link | I click sui risultati passano attraverso URL di redirect del motore, e l’header Referer rivela al sito di destinazione i termini cercati | Link diretti senza redirect intermedi. L’header Referer può essere rimosso, interrompendo la catena di tracciamento |
| Account e login | Quando si utilizza un motore con il proprio account (es. Google), tutte le ricerche, i click e la cronologia vengono associati direttamente al profilo utente, rendendo la profilazione immediata e completa | SearXNG non richiede alcun account e non interagisce con i motori come utente autenticato: le query vengono inviate come richieste anonime, senza alcuna sessione di login |
| Indirizzo IP | Il motore registra l’IP di ogni richiesta, ricavando posizione geografica e collegando ricerche nel tempo | Le query partono dal server SearXNG, non dal browser dell’utente. Con Gluetun il traffico passa attraverso un tunnel VPN, nascondendo anche l’IP del server |
Come Funziona la Configurazione
Lo stack che andremo a realizzare è composto da tre container che condividono lo stesso network attraverso Gluetun, il quale crea un tunnel VPN WireGuard e instrada tutto il traffico in uscita attraverso di esso. SearXNG e Valkey non hanno una propria interfaccia di rete: utilizzano quella di Gluetun tramite network_mode: "service:gluetun".
Come possiamo vedere dal diagramma sotto, tutte le interazioni tra l’utente e i motori di ricerca passano attraverso Gluetun, che fa da ponte tra il browser e il resto dello stack. Quando effettuiamo una ricerca:
- il browser si collega a Gluetun sulla porta 8080
- Gluetun inoltra la richiesta a SearXNG, che elabora la query
- SearXNG interroga i vari motori di ricerca attraverso la rete WireGuard a cui Gluetun è connesso (in questo caso ProtonVPN). In questo modo i motori di ricerca non vedono mai l’IP del nostro server, ma solo quello del nodo VPN di uscita.
WireGuard · :8080"] SearXNG["SearXNG
Meta-motore di ricerca"] Valkey["Valkey 8
Cache rate-limiting"] end end subgraph Motori di Ricerca Google["Google"] Bing["Bing"] DDG["DuckDuckGo"] Others["...altri"] end VPN["Provider VPN
ProtonVPN"] User -- "porta 8080" --> Gluetun Gluetun -- "network_mode" --> SearXNG SearXNG -- "cache e limiter" --> Valkey SearXNG -- "query" --> Gluetun Gluetun -- "tunnel WireGuard" --> VPN VPN --> Google VPN --> Bing VPN --> DDG VPN --> Others
Processo di Installazione
Dopo aver installato Docker Engine
e Docker Compose, è possibile procedere con l’installazione di SearXNG. La configurazione proposta utilizza un file Docker Compose per definire i tre servizi necessari (SearXNG, Gluetun e Valkey) e un file .env per le variabili d’ambiente sensibili.
Per il funzionamento di Gluetun è però necessario disporre di un account presso un provider VPN compatibile, in questa guida utilizziamo ProtonVPN con protocollo WireGuard, ma Gluetun supporta numerosi provider .
Creiamo il File Docker Compose
Il file docker-compose.yml qui sotto configura l’intero stack. Una volta avviato, il servizio sarà raggiungibile sulla porta 8080, modificabile in base alle proprie esigenze. Non sarà necessario interagire direttamente con Gluetun o Valkey, in quanto lavorano in autonomia a supporto di SearXNG.
services:
searxng:
image: docker.io/searxng/searxng:latest
container_name: searxng
restart: unless-stopped
network_mode: "service:gluetun"
depends_on:
gluetun:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./searxng/config:/etc/searxng
- ./searxng/data:/var/cache/searxng
environment:
- SEARXNG_BASE_URL=https://search.sitodemo.cc/
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
restart: always
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- 8080:8080 # SearXNG
volumes:
- ./gluetun:/gluetun
environment:
VPN_SERVICE_PROVIDER: protonvpn
VPN_TYPE: wireguard
WIREGUARD_PRIVATE_KEY: ${WIREGUARD_PRIVATE_KEY}
SERVER_COUNTRIES: ${VPN_COUNTRY}
TZ: Europe/Rome
UPDATER_PERIOD: 8h
healthcheck:
test: ["CMD-SHELL", "cat /tmp/gluetun/ip || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
redis:
image: docker.io/valkey/valkey:8-alpine
container_name: searxng-redis
command: valkey-server --save 30 1 --loglevel warning
restart: always
volumes:
- ./redis:/data
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
network_mode: "service:gluetun"
depends_on:
gluetun:
condition: service_healthyServizio SearXNG
Il container SearXNG è il cuore dello stack e si occupa di ricevere le ricerche, interrogare i motori e restituire i risultati aggregati. La policy restart: unless-stopped consente al container di riavviarsi automaticamente in caso di errore, ma di restare fermo se viene arrestato manualmente. La direttiva depends_on garantisce che SearXNG venga avviato solo quando Gluetun è attivo e Valkey è in esecuzione. Da notare che in questo container non è presente la sezione ports: poiché utilizza network_mode: "service:gluetun", le porte sono esposte dal container Gluetun.
Il volume ./searxng/config contiene i file di configurazione di SearXNG (come settings.yml e limiter.toml), mentre ./searxng/data rende persistente la cache. La variabile SEARXNG_BASE_URL deve essere impostata con l’URL pubblico attraverso cui si accede al servizio. Le capability vengono ridotte al minimo con cap_drop: ALL e riaggiunte solo quelle strettamente necessarie al funzionamento del container.
Servizio Gluetun
Gluetun è il container che gestisce il tunnel VPN WireGuard e funge da gateway di rete per l’intero stack. La policy restart: always assicura che il container venga riavviato in qualsiasi circostanza, poiché un’interruzione della VPN comprometterebbe la connettività di tutti i servizi collegati. La capability NET_ADMIN e il device /dev/net/tun sono necessari per creare l’interfaccia tunnel. La porta 8080 è esposta su Gluetun anziché su SearXNG, poiché è Gluetun a possedere lo stack di rete condiviso da tutti i container.
L’healthcheck verifica che il tunnel sia attivo controllando la presenza del file /tmp/gluetun/ip, che Gluetun scrive solo dopo aver stabilito la connessione. Questo permette agli altri container di sapere quando la VPN è pronta, grazie alla condizione service_healthy nel depends_on. Le variabili di ambiente configurano il provider VPN, il tipo di protocollo e le credenziali, che vengono lette dal file .env.
Servizio Valkey
Valkey è un datastore compatibile con Redis, utilizzato da SearXNG come cache e per gestire il rate-limiting delle richieste verso i motori di ricerca. Il comando --save 30 1 abilita la persistenza su disco ogni 30 secondi se è stata effettuata almeno una scrittura, evitando di perdere la cache al riavvio del container. Come SearXNG, anche Valkey utilizza network_mode: "service:gluetun" e comunica con gli altri servizi sulla rete interna di Gluetun, senza esporre alcuna porta sull’host.
Bind Mount VS Named Volume
La configurazione proposta utilizza bind mount (cartelle locali come./searxng/config, ./redis, ecc.) anziché named volume di Docker. L’unico volume che ha motivo di restare un bind mount è ./searxng/config, in quanto contiene i file di configurazione di SearXNG (settings.yml, limiter.toml) che potremmo voler modificare direttamente e salvare. Gli altri volumi elencati servono solo per garantire la persistenza dei dati e possono essere sostituiti da un named volume.
Creiamo il File .env
Il file .env contiene le credenziali sensibili per la connessione VPN, così da evitare di scrivere chiavi private direttamente nel file Docker Compose (ed evitare anche l’erronea condivisione). La variabile WIREGUARD_PRIVATE_KEY è la chiave privata WireGuard fornita dal provider VPN, mentre VPN_COUNTRY indica il paese del nodo di uscita. È possibile specificare più paesi separandoli con una virgola e Gluetun selezionerà automaticamente un server tra quelli disponibili. In questa guida utilizziamo un singolo paese, la Svizzera, in quanto è una nazione con una legislazione particolarmente attenta alla privacy e alla protezione dei dati personali.
WIREGUARD_PRIVATE_KEY=your_wireguard_private_key
VPN_COUNTRY=Switzerland