SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor

Searx o SearXNG: quale installare oggi?

Searx non riceve commit dal codice da aprile 2023: verifica lo stato del progetto e scopri cosa cambia per configurare una nuova istanza SearXNG.

Searx o SearXNG: quale installare?

Searx e SearXNG sono due progetti diversi con nomi quasi identici, ma solo uno dei due riceve ancora correzioni. Installa SearXNG. Il progetto Searx originale non riceve commit dal codice da aprile 2023 e il relativo README riassume la situazione in una sola riga: «Searx non è più mantenuto».

Questo crea un problema pratico, non teorico. I due progetti condividono uno screenshot, gran parte del file di configurazione e metà del nome, quindi una guida scritta per uno sembra applicabile anche all'altro. Non è così. Il file delle impostazioni si trova in un'altra posizione, la protezione contro i bot è nuova e il nome del pacchetto non è più disponibile nelle versioni correnti di Ubuntu. Di seguito trovi le differenze, i comandi per verificare autonomamente lo stato e l'elenco delle modifiche rilevanti per chi deve avviare un'istanza.

Che cos'è Searx e da dove proviene SearXNG

Searx è un metamotore di ricerca. Non mantiene un proprio indice. Riceve la query, la inoltra ad altri servizi di ricerca come Bing, DuckDuckGo o Wikipedia, quindi combina i risultati in un'unica pagina. Il vantaggio è che questi servizi vedono l'indirizzo del server invece del tuo. Il costo è la manutenzione. Ogni motore è un piccolo modulo di codice che analizza l'HTML o l'API di un servizio esterno, quindi smette di funzionare ogni volta che il servizio upstream cambia. L'affidabilità di un metamotore di ricerca dipende dalla disponibilità delle persone che correggono i relativi moduli.

Il repository searx è stato creato nell'ottobre 2013. Nell'aprile 2021 un ex maintainer ha avviato SearXNG come fork del progetto. La sigla "NG" significa next generation. Il README di searx descrive i due progetti affiancati, e questa descrizione resta il riepilogo più chiaro della separazione:

SearxNG è un fork di searx, creato da un ex maintainer di searx.
SearxNG usa rolling release, aggiorna più frequentemente le dipendenze e corregge più rapidamente i motori.

Il disaccordo alla base del fork riguardava la diagnostica. Searx considerava i dati di utilizzo come informazioni che un'istanza non dovrebbe conservare, e le impostazioni predefinite lo dichiarano esplicitamente: enable_stats: False # activate /stats page - note: it may leak usage data. SearXNG ha scelto l'approccio opposto e include enable_metrics: true nelle impostazioni predefinite. Queste metriche alimentano le barre dei tempi di risposta e le pagine di errore che consentono di individuare e correggere rapidamente un motore non funzionante. Entrambe le posizioni sono difendibili. Solo una ha continuato a rilasciare codice.

Searx è morto? Come verificarlo in autonomia

«Morto» non è uno stato riportato da GitHub, quindi leggi i due segnali disponibili e valuta la situazione. Il primo indica se il repository è archiviato e quando ha ricevuto l’ultimo push.

curl -s https://api.github.com/repos/searx/searx | jq -r '.archived, .pushed_at'
curl -s https://api.github.com/repos/searxng/searxng | jq -r '.archived, .pushed_at'

Il 10 ottobre 2026 il primo comando stampa false e 2026-05-14T10:02:22Z. Il secondo stampa false e un timestamp recente, di solito relativo all’ultimo giorno o agli ultimi due giorni. Nota il primo valore. Il repository searx non è archiviato e nessuno lo ha bloccato, motivo per cui la domanda continua a ripresentarsi.

pushed_at, preso da solo, è un segnale debole, perché cambia anche quando viene eseguito un push su un ramo qualsiasi, inclusa una modifica di una sola riga nella documentazione. Leggi invece l’elenco dei commit.

curl -s 'https://api.github.com/repos/searx/searx/commits?per_page=5' \
  | jq -r '.[] | .commit.committer.date[:10] + "  " + (.commit.message | split("\n")[0])'

Al 10 ottobre 2026 il comando stampa:

2026-05-14  [doc] add hister reference
2023-09-07  Searx is no longer maintained
2023-04-05  Fix quoting issue in search_operator plugin (#3479)
2023-04-04  Bump pallets-sphinx-themes from 2.0.2 to 2.0.3 (#3450)
2023-04-04  Update searx.data - update_wikidata_units.py (#3454)

Leggilo dal basso verso l’alto. Lo sviluppo ordinario si interrompe ad aprile 2023. Il commit di settembre 2023 corrisponde all’inserimento dell’avviso nel README da parte dei manutentori. L’unico commit successivo riguarda la documentazione, perché l’autore originale è passato a Hister, uno strumento di ricerca che indicizza le pagine e i file scelti dall’utente invece di interrogare altri motori. È un’idea diversa e utile se ciò che cerchi realmente è un motore di ricerca personale per i tuoi contenuti.

Il secondo segnale riguarda il packaging, da cui dipendono in modo implicito molti tutorial datati.

  • PyPI contiene venti searx release, dalla 0.1.2 di gennaio 2014 alla 0.17.0 di luglio 2020, e sono ancora tutte scaricabili. pip install searx ha esito positivo e installa l’ultima di queste, la 0.17.0, che contiene codice risalente a nove mesi prima della creazione del fork.
  • Debian ha distribuito searx 1.1.0 in Debian 12 (bookworm) e lo include ancora in unstable. Il pacchetto è stato rimosso da testing a ottobre 2023, quindi Debian 13 (trixie) non contiene alcun pacchetto searx.
  • Ubuntu lo ha distribuito l’ultima volta in 22.04, nella versione 1.0.0. Su Ubuntu 24.04, sudo apt install searx termina con E: Unable to locate package searx.
  • searx.space, la directory delle istanze pubbliche a cui il progetto ha sempre indirizzato gli utenti, ora elenca istanze SearXNG.

Ecco quindi la situazione reale. Il codice è pubblico, funziona ancora e puoi clonarlo e avviarlo oggi. Non riceverai però correzioni del motore né aggiornamenti di sicurezza, che per un motore di metaricerca costituiscono l’intero scopo della manutenzione. I motori diventano obsoleti secondo tempi stabiliti da altri. Un’istanza non mantenuta restituisce ogni mese meno risultati, senza che nessuno debba intervenire sul server.

Cosa cambia nel fork per una nuova istanza

Il file delle impostazioni è stato spostato e ora viene usato come overlay

Con Searx modificavi searx/settings.yml all'interno dell'albero dei sorgenti. In SearXNG il file si trova in /etc/searxng/settings.yml e il processo lo individua tramite la variabile d'ambiente SEARXNG_SETTINGS_PATH. Il modello che l'installer copia in quella posizione è breve:

use_default_settings: true

general:
  debug: false
  instance_name: "SearXNG"

search:
  safe_search: 2
  autocomplete: 'duckduckgo'
  formats:
    - html

server:
  # Is overwritten by ${SEARXNG_SECRET}
  secret_key: "ultrasecretkey"
  limiter: true
  image_proxy: true

valkey:
  # URL to connect valkey database. Is overwritten by ${SEARXNG_VALKEY_URL}.
  url: valkey://localhost:6379/0

use_default_settings: true è la riga che cambia il modo di lavorare. Con questa impostazione, il file contiene solo gli override e ogni chiave omessa viene recuperata dai valori predefiniti inclusi nel pacchetto. Senza questa impostazione, il file deve descrivere l'intera configurazione, motore per motore. È così che si finisce con un'istanza che si avvia senza errori ma non trova nulla. Incollare in questo percorso un vecchio file delle impostazioni di Searx produce una configurazione completa con nomi di chiavi diversi, quindi il processo segue il secondo percorso e lo gestisce in modo errato.

La chiave segreta arresta il processo

sudo -H sed -i -e "s/ultrasecretkey/$(openssl rand -hex 16)/g" \
              "/etc/searxng/settings.yml"

Esegui questo comando una volta, dopo aver copiato il modello. Se lo salti, SearXNG registra una riga nel log ed esce con stato 1, perché webapp.py confronta la chiave con il valore del modello prima di fornire qualsiasi servizio:

server.secret_key is not changed. Please use something else instead of ultrasecretkey.

Il controllo viene saltato quando general.debug è true, quindi un'istanza può funzionare in una sessione di debug e poi rifiutarsi di avviarsi sotto systemd o in un container. Un container che si riavvia in loop con quella riga in docker compose logs indica l'attivazione di questo controllo, non un'immagine danneggiata.

Il limiter è nuovo e richiede Valkey

Searx non aveva un rate limiting interno all'applicazione. Le istanze Searx pubbliche usavano servizi separati davanti all'applicazione: filtron per filtrare le richieste e morty per fare da proxy al contenuto dei risultati. Nessuno dei due repository ha ricevuto un commit da gennaio 2023: l'ultimo commit di filtron risale a quel mese, mentre quello di morty risale ad aprile 2021.

SearXNG gestisce direttamente queste funzioni. Il rate limiting e il rilevamento dei bot sono affidati al limiter, attivato con server.limiter. Nei valori predefiniti distribuiti è false, mentre nel modello dell'installer è true, e richiede un database Valkey per memorizzare i contatori. Valkey è un fork di Redis e Ubuntu 24.04 lo include nei pacchetti:

sudo apt install -y valkey-server
server:
  limiter: true

valkey:
  url: valkey://localhost:6379/0

Le guide scritte prima di questo cambio di nome configurano invece un blocco redis:, quindi copia il nome della chiave dalla documentazione aggiornata del limiter. La configurazione di dettaglio si trova in un secondo file, /etc/searxng/limiter.toml, e server.public_instance: true attiva il rilevamento più severo dei bot richiesto da un'istanza pubblica, incluso il metodo con token nel link. Il risultato visibile è che alcune richieste ricevono HTTP 429 invece dei risultati, comprese le tue richieste se usi uno script per interrogare l'istanza. Questo comportamento ha una pagina dedicata: perché un'istanza SearXNG risponde con 429 Too Many Requests.

I motori si sospendono autonomamente e i timeout sono lunghi

Quando un servizio upstream risponde con un CAPTCHA o con una pagina di rate limiting, SearXNG solleva un'eccezione tipizzata e smette di interrogare quel motore per un intervallo prestabilito, invece di riprovare fino a provocare un blocco. I valori predefiniti sono inclusi in searx/settings.yml sotto search.suspended_times. Questi sono i 6 valori pubblicati a ottobre 2026:

GraficoSearXNG default engine suspension times, in seconds
I dati alla base di questo grafico
[
  {
    "label": "SearxEngineAccessDenied",
    "suspend_seconds": "180"
  },
  {
    "label": "SearxEngineCaptcha",
    "suspend_seconds": "3,600"
  },
  {
    "label": "SearxEngineTooManyRequests",
    "suspend_seconds": "180"
  },
  {
    "label": "cf_SearxEngineCaptcha",
    "suspend_seconds": "1,296,000"
  },
  {
    "label": "cf_SearxEngineAccessDenied",
    "suspend_seconds": "86,400"
  },
  {
    "label": "recaptcha_SearxEngineCaptcha",
    "suspend_seconds": "604,800"
  }
]

Una risposta di semplice accesso negato sospende il motore per 180 secondi. Un CAPTCHA lo sospende per 3,600 secondi. Un CAPTCHA di Cloudflare lo sospende per 1,296,000 secondi, cioè quindici giorni, mentre un Google reCAPTCHA lo sospende per 604,800 secondi, cioè una settimana. I valori lunghi sono intenzionali, perché riprovare dopo che un servizio ha già segnalato l'indirizzo è il modo in cui l'IP dell'istanza può essere bloccato definitivamente.

Mentre un motore è sospeso, la pagina dei risultati lo salta e lo segnala nel riquadro laterale intitolato "Messaggi dai motori di ricerca"; inoltre /stats/errors elenca gli elementi che hanno fallito. Un'istanza appena configurata che restituisce pochi risultati mostra di solito questo problema, non un'installazione danneggiata.

L'API JSON è disattivata per impostazione predefinita

Il valore predefinito distribuito è formats: [html] e non contiene altro, quindi l'API richiesta da ogni script resta chiusa finché non la abiliti.

curl -s -o /dev/null -w '%{http_code}\n' \
  'http://127.0.0.1:8888/search?q=test&format=json'

Il comando stampa 403, perché la route di ricerca chiama flask.abort(403) quando il formato richiesto non è elencato in search.formats. Aggiungi il formato e riavvia il servizio:

search:
  formats:
    - html
    - json

Il file delle impostazioni di searx non contiene affatto la chiave formats, quindi il suo output JSON era semplicemente disponibile senza configurazioni aggiuntive. Ogni script e frammento di codice di quell'epoca presume la stessa cosa, e il risultato dell'errore è un 403 senza spiegazioni. Se stai integrando un'istanza negli strumenti esistenti, fornire a un agente un endpoint SearXNG con cui cercare inizia da questa impostazione.

Perché i tutorial copiati e incollati su Searx non funzionano

Ognuna di queste righe compare in guide che continuano a comparire tra i primi risultati, ma su un'installazione attuale non funziona o fornisce indicazioni fuorvianti.

  • sudo apt install searx su Ubuntu 24.04 si interrompe su E: Unable to locate package searx, perché il pacchetto è stato distribuito l'ultima volta in 22.04.
  • pip install searx termina correttamente e installa la versione 0.17.0 di luglio 2020. Non viene indicato che è precedente al fork.
  • git clone https://github.com/asciimoo/searx funziona ancora, perché GitHub reindirizza il vecchio nome del proprietario. Esegue il checkout del ramo predefinito attuale, in cui un commit della documentazione di maggio 2026 si trova sopra codice applicativo che non cambia da aprile 2023.
  • Le procedure che modificano searx/settings.yml nell'albero dei sorgenti non producono alcun effetto su SearXNG, che legge /etc/searxng/settings.yml.
  • Le procedure che installano filtron o morty ricostruiscono componenti già inclusi in SearXNG.
  • Un URL redis: per il limitatore è indietro di una ridenominazione rispetto alla chiave valkey: attuale.

Anche le guide su SearXNG diventano obsolete, e l'URL del clone è il modo più rapido per datarle. I file Compose si trovavano in precedenza in un repository searxng-docker separato. Ora quel repository è archiviato, il suo ultimo push risale a marzo 2026 e i file sono stati spostati in container/ nel repository principale. La procedura rapida attuale per i container, riportata nella documentazione, è:

mkdir -p ./searxng/core-config/
cd ./searxng/
curl -fsSL \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp -i .env.example .env
nano .env
docker compose up -d

Modifica .env prima dell'ultimo comando. L'immagine associa le variabili d'ambiente alle chiavi di configurazione, quindi SEARXNG_SECRET diventa server.secret_key e SEARXNG_BASE_URL diventa server.base_url. L'installazione dello script sull'host segue un percorso diverso, ma produce lo stesso risultato:

git clone https://github.com/searxng/searxng.git searxng
cd searxng
sudo -H ./utils/searxng.sh install all

Questa procedura crea l'utente searxng, l'ambiente virtuale in /usr/local/searxng e il servizio uWSGI, che rappresenta la configurazione di riferimento nella documentazione di SearXNG. La procedura dettagliata per questo percorso è installare SearXNG sul proprio VPS.

Istanza pubblica o istanza propria

Un'istanza pubblica è un server gestito da altri che termina la connessione TLS (transport layer security), quindi il software presente su quel server legge la query in chiaro. La documentazione ufficiale di SearXNG espone chiaramente il problema della fiducia: è necessario fidarsi dell'amministratore e non è possibile sapere se le richieste vengono registrate, aggregate o inoltrate a terze parti. L'elenco dei dati visibili è breve e completo. Lo stack dell'operatore può vedere il testo della query, l'ora, l'indirizzo IP da cui arriva la richiesta, lo user agent del browser e il cookie delle preferenze che contiene le impostazioni. L'operatore controlla anche il codice, quindi qualsiasi patch applichi viene eseguita per ogni ricerca effettuata su quell'istanza.

Un'impostazione predefinita facilita la registrazione accidentale. Searx inviava le ricerche tramite POST. SearXNG include method: "GET", specificando nel commento che POST evita di inserire le query di ricerca nella cronologia del browser, ma causa problemi di usabilità. Con GET la query si trova nella riga della richiesta, quindi viene registrata per impostazione predefinita nel log degli accessi del reverse proxy e nella cronologia del browser. È il normale comportamento di un web server. È utile saperlo prima di scegliere su quale server effettuare le ricerche.

Eseguire una propria istanza sposta la fiducia, invece di eliminarla. Controlli il codice e i log e, se preferisci non pubblicare affatto un hostname o un certificato TLS per una singola macchina personale, raggiungerla tramite un servizio onion v3 mantiene l'istanza fuori dal DNS pubblico, consentendoti comunque di accedervi da qualsiasi luogo. In cambio, i motori upstream vedono un unico indirizzo per tutte le tue ricerche e, su un'istanza per un singolo utente, ogni query è riconducibile a te invece di confondersi tra le richieste di una folla di utenti. Un'istanza pubblica molto utilizzata ti offre quella folla e ti solleva dalla gestione dei log. Scegli la proprietà che ritieni più importante e, se prima vuoi esaminare l'elenco completo dei rischi, capire se SearXNG è sicuro da usare ti guida nella valutazione. La cronologia della posizione richiede la stessa attenzione, ma con rischi maggiori, perché un telefono che comunica la propria posizione per tutto il giorno rivela più informazioni di qualsiasi log delle ricerche; confrontare i tracker di posizione self-hosted è il punto di partenza se vuoi conservare questi dati su un server che controlli.

Una nota pratica per un VPS. Gli intervalli di indirizzi dei datacenter vengono segnalati più rapidamente rispetto alle connessioni domestiche, quindi una nuova istanza può incontrare CAPTCHA su alcuni motori già nelle prime ricerche. È il comportamento di sospensione descritto sopra, non un errore di configurazione. Se gli stessi motori continuano a risultare bloccati anche dopo la scadenza della sospensione, leggere l'errore effettivo prima di modificare qualsiasi cosa ti evita di procedere per tentativi.

Se esegui già un'istanza Searx

Nulla si rompe il giorno in cui leggi questa guida. Il server continua a funzionare fino a quando una modifica upstream non causa un nuovo errore in un altro motore; da quel momento il problema resta. Pianifica la migrazione e non trasferire il file di configurazione. Parti dal template SearXNG, quindi aggiungi nuovamente soltanto le impostazioni che hai modificato intenzionalmente: il nome dell'istanza, safe_search, i motori abilitati o disabilitati indicandone il nome e le impostazioni predefinite dell'interfaccia. Nel fork i nomi e le opzioni dei motori sono cambiati. Verifica quindi ogni voce nella documentazione corrente, senza presumere che la chiave esista ancora. Le regole Filtron e un URL morty non hanno un equivalente, perché queste funzioni sono state spostate all'interno dell'applicazione.

Esegui la nuova istanza su una porta diversa mentre quella precedente è ancora attiva. Il funzionamento è corretto quando la pagina iniziale restituisce 200, una ricerca restituisce risultati da più di un motore e /stats/errors è vuoto oppure mostra errori che sai interpretare. Quindi sposta il reverse proxy sulla nuova istanza e arresta il servizio precedente.

FAQ

Searx è morto nel 2026?

Il repository non è archiviato, quindi nulla impedisce di clonarlo, ma il progetto non è mantenuto. L'ultimo commit di codice risale ad aprile 2023 e il README contiene la frase "Searx is no longer maintained." Verificalo con curl -s https://api.github.com/repos/searx/searx | jq -r '.pushed_at', quindi leggi i messaggi dei commit recenti, perché una data di push può dipendere anche da una modifica alla documentazione. Per un motore di metaricerca, l'assenza di manutenzione significa che i risultati peggiorano autonomamente, perché ogni modulo del motore dipende da un sito upstream che continua a cambiare.

Posso ancora installare Searx con apt o pip?

Non sui sistemi attuali, e comunque non in modo utile dove sarebbe possibile. Ubuntu ha incluso searx nei repository l'ultima volta in 22.04, alla versione 1.0.0, quindi sudo apt install searx su 24.04 restituisce E: Unable to locate package searx. Debian ha distribuito la versione 1.1.0 in Debian 12 e l'ha rimossa da testing a ottobre 2023, quindi Debian 13 non include alcun pacchetto. PyPI distribuisce ancora tutte le release di searx, ma l'ultima è la 0.17.0 di luglio 2020, precedente persino al fork. Installa invece SearXNG.

Il mio vecchio file settings.yml di searx funzionerà in SearXNG?

No. Copia i valori, non il file. SearXNG legge /etc/searxng/settings.yml e richiede use_default_settings: true all'inizio del file, quindi il tuo file agisce come override dei valori predefiniti forniti con il software. Un vecchio file di searx è una configurazione completa con nomi delle chiavi diversi; inoltre non contiene limiter, né il blocco valkey, né l'elenco formats. Parti dal modello disponibile in utils/templates/etc/searxng/settings.yml e riaggiungi le modifiche una alla volta.

Perché la mia istanza SearXNG restituisce meno risultati di un'istanza pubblica?

Alcuni motori sono sospesi. Quando un motore risponde con un CAPTCHA o con una pagina di limitazione della frequenza, SearXNG smette di interrogarlo per un periodo fisso: da 180 secondi per un semplice rifiuto fino a 1,296,000 secondi per un CAPTCHA di Cloudflare. La pagina dei risultati lo indica nella sezione "Messages from the search engines" e /stats/errors elenca gli errori con le relative cause. Gli indirizzi dei datacenter vengono segnalati prima rispetto alle connessioni domestiche, quindi il problema si manifesta rapidamente su una nuova istanza VPS.

Devo usare un'istanza SearXNG pubblica o eseguirne una mia?

Esegui una tua istanza se vuoi controllare il codice e i log e accetti che i motori upstream vedano un unico indirizzo per tutte le tue ricerche. Usa un'istanza pubblica se per te è più importante mescolare le query con quelle di altri utenti che sapere quali dati vengono registrati. Su un'istanza pubblica, il gestore può vedere il testo della query, l'ora, il tuo indirizzo IP e il tuo user agent, oltre a poter modificare il codice in qualsiasi momento. Una policy di logging dichiarata non può essere verificata dall'esterno.