SearXNG es un metabuscador libre que consulta más de 70 servicios de búsqueda por ti y te devuelve los resultados sin rastrearte ni guardar tu historial. En esta guía lo levantas con un único docker-compose.yml acompañado de Valkey, generas la secret_key obligatoria, ajustas el archivo settings.yml para elegir motores y formatos, y lo publicas con HTTPS tras un proxy inverso. La misma explicación está disponible en inglés.

Puntos clave

  • SearXNG es un metabuscador de código abierto (licencia GNU AGPLv3), heredero del proyecto searx, que agrega resultados de más de 70 servicios de búsqueda como Google, Bing, DuckDuckGo o Wikipedia sin perfilar al usuario.
  • El proyecto acumula alrededor de 32.000 estrellas en GitHub, señal de lo asentado que está en el mundo del self-hosting.
  • El contenedor escucha en el puerto 8080 y se apoya en Valkey (el sustituto de Redis compatible con su API) para el limitador de peticiones y la caché.
  • La secret_key es obligatoria: se genera con openssl rand -hex 32, que produce 64 caracteres hexadecimales (32 bytes) de aleatoriedad.
  • Fija una versión concreta de la imagen como searxng/searxng:2026.7.11 en lugar de :latest; SearXNG usa un esquema de versión rodante basado en la fecha, así que fijarla te evita saltos inesperados.

¿Qué es SearXNG y por qué usar un metabuscador privado?

SearXNG es un metabuscador: en lugar de tener su propio índice de la web, reenvía tu consulta a decenas de buscadores externos, recoge sus respuestas, las combina y te muestra una única lista de resultados. La diferencia frente a usar Google directamente es la privacidad. Cuando buscas a través de tu instancia de SearXNG, los buscadores de destino ven las peticiones del servidor, no las tuyas: no hay cookies de seguimiento, ni perfil publicitario, ni historial guardado. Tú controlas la máquina, así que nadie más registra qué buscas.

El proyecto nació en 2021 como bifurcación de searx, con el objetivo de modernizar el código y añadir funciones. Se distribuye bajo licencia GNU AGPLv3 y consulta más de 70 servicios de búsqueda, que puedes activar o desactivar uno a uno. Además de la web general, cubre categorías como imágenes, vídeos, noticias, mapas, ciencia o repositorios de código, cada una con sus propios motores.

Hay dos maneras de disfrutarlo: usar una de las muchas instancias públicas que mantiene la comunidad o montar la tuya. La instancia propia es la opción sensata si te tomas en serio la privacidad, porque en una pública dependes de la honradez de quien la administra. Con Docker, levantar la tuya es cuestión de minutos, y encaja de forma natural en un homelab junto al resto de servicios de redes y acceso remoto seguro que ya tengas.

¿Cómo es el docker-compose.yml con Valkey?

Necesitas una máquina Linux con Docker y el plugin Compose; si aún no los tienes, sigue primero la guía para instalar Docker en Ubuntu 24.04. El repositorio histórico searxng-docker quedó archivado en marzo de 2026 y la forma recomendada hoy es una pila con dos servicios: el propio SearXNG y una base de datos Valkey. Valkey es el bifurcado de Redis que adoptó el proyecto tras el cambio de licencia de este último, y hace de limitador de peticiones y caché. Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml:

services:
  searxng:
    image: searxng/searxng:2026.7.11
    container_name: searxng
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./searxng:/etc/searxng:rw
    environment:
      SEARXNG_BASE_URL: "https://buscar.midominio.com/"
      SEARXNG_SECRET: "cambia_esta_clave_por_una_larga"
      UWSGI_WORKERS: "4"
      UWSGI_THREADS: "4"
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/healthz"]
      interval: 30s
      timeout: 5s
      retries: 3
    depends_on:
      - valkey

  valkey:
    image: valkey/valkey:9-alpine
    container_name: searxng-valkey
    restart: unless-stopped
    command: valkey-server --save 30 1 --loglevel warning
    volumes:
      - valkey-data:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 30s
      timeout: 5s
      retries: 5

volumes:
  valkey-data:

Repasa lo importante. El servicio searxng publica el puerto 8080 y monta la carpeta local ./searxng en /etc/searxng, que es donde vivirá la configuración. La variable SEARXNG_BASE_URL debe apuntar a la URL pública final (con la barra al terminar) para que los enlaces internos y la paginación funcionen; SEARXNG_SECRET inyecta la clave secreta, que cambiarás sí o sí. El bloque cap_drop/cap_add recorta los privilegios del contenedor a lo mínimo imprescindible, una buena práctica de seguridad. El healthcheck consulta el endpoint /healthz, que SearXNG expone precisamente para eso. El servicio valkey guarda su estado en el volumen con nombre valkey-data y responde al ping para marcarse como sano.

Antes de arrancar, genera una clave secreta de verdad y copia su salida en SEARXNG_SECRET:

mkdir searxng-docker
cd searxng-docker
mkdir searxng
openssl rand -hex 32
docker compose up -d
docker compose ps
docker compose logs -f searxng

En el primer arranque, si la carpeta ./searxng está vacía, la imagen genera un settings.yml por defecto dentro de ella. Cuando ambos contenedores figuren como healthy, abre http://192.168.1.10:8080 (sustituye la IP por la de tu servidor) y ya tendrás la página de búsqueda funcionando.

¿Qué es el archivo settings.yml y la secret_key?

Toda la configuración de SearXNG vive en settings.yml, dentro de la carpeta que has montado. La opción más cómoda es dejar que el contenedor cree su versión por defecto en el primer arranque y editar después solo lo que importa. Un settings.yml mínimo y sensato se parece a esto:

use_default_settings: true

server:
  secret_key: "pega_aqui_el_resultado_de_openssl_rand_hex_32"
  limiter: true
  image_proxy: true

search:
  safe_search: 0
  autocomplete: "duckduckgo"
  formats:
    - html
    - json

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

La línea use_default_settings: true le dice a SearXNG que parta de su configuración base y aplique encima solo tus cambios, de modo que no tienes que copiar el archivo entero. La secret_key es el valor más crítico: firma las cookies de sesión y las peticiones internas, y si la dejas con el valor de ejemplo ultrasecretkey, SearXNG se niega a arrancar. Pega ahí la salida de openssl rand -hex 32. El bloque server.limiter: true activa el limitador que frena a los robots abusivos, y necesita Valkey para funcionar; por eso valkey.url apunta al contenedor valkey en el puerto 6379. El image_proxy: true hace que las miniaturas pasen por tu servidor en vez de descargarse desde el origen, otro punto a favor de la privacidad.

Cada vez que toques settings.yml, reinicia el contenedor con docker compose restart searxng para que relea la configuración. Si algo falla, docker compose logs searxng suele señalar la línea exacta del error de YAML.

¿Cómo elegir motores y el formato de resultados?

Los motores son el corazón de un metabuscador: cada uno consulta un servicio externo. En settings.yml puedes desactivar los que no quieras o cambiar sus opciones dentro de la sección engines. Por ejemplo, para apagar un motor concreto añades un bloque con su nombre y disabled: true:

engines:
  - name: wikidata
    disabled: true
  - name: brave
    disabled: false

Merece la pena revisar qué motores te dan buenos resultados en tu zona y cuáles fallan a menudo; SearXNG marca los lentos y los caídos en la página /stats, muy útil para depurar. En la interfaz web, cada usuario puede además activar o desactivar motores desde Preferencias sin tocar el servidor, y esas preferencias se guardan en una cookie local.

El formato de resultados también se controla en search.formats. Por defecto SearXNG sirve solo html; si añades json, como en el ejemplo anterior, habilitas una API que devuelve los resultados en JSON. Eso es lo que aprovechan otras herramientas para consultar tu instancia mediante programación (por ejemplo, un asistente de IA que necesite buscar en la web). Ten presente que abrir la API pública puede atraer abuso: combínala siempre con el limitador y, si la expones, con autenticación.

¿Cómo publicarlo con un proxy inverso y HTTPS?

Escuchar en el 8080 por HTTP está bien para probar en la red local, pero para usar SearXNG a diario conviene ponerlo tras un proxy inverso con TLS. El proxy termina el HTTPS, reenvía las peticiones al contenedor y te permite servir el buscador en un dominio limpio como buscar.midominio.com. Recuerda que ese dominio, con la barra final, tiene que coincidir con el SEARXNG_BASE_URL que fijaste en el Compose.

Tienes dos caminos según cómo gestiones tu infraestructura. Si prefieres una interfaz gráfica y pedir certificados de Let’s Encrypt a golpe de clic, usa Nginx Proxy Manager: creas un host proxy que apunta al contenedor searxng en el puerto 8080 y activas el certificado. Si en cambio automatizas todo como código y descubres los servicios por etiquetas, encaja mejor Traefik, donde defines la ruta con etiquetas en el propio docker-compose.yml. En ambos casos, conecta el proxy y SearXNG a la misma red de Docker y no publiques el puerto 8080 directamente al exterior: que solo el proxy sea la puerta de entrada.

Como toque final, si Valkey te sabe a poco y quieres entender la pieza de caché que hay debajo, la guía de instalar Redis con Docker explica los mismos conceptos de persistencia y contraseña que Valkey hereda de su antecesor.

Preguntas frecuentes

¿Necesita SearXNG obligatoriamente Valkey o Redis?

Para lo básico, no: SearXNG arranca y busca sin ninguna base de datos. Lo que sí necesita a Valkey es el limitador de peticiones (server.limiter: true), que protege tu instancia de los robots y del abuso. Sin Valkey tendrías que poner limiter: false, dejando el buscador más expuesto. Como Valkey es ligero y va en el mismo docker-compose.yml, lo razonable es incluirlo siempre. Valkey es el bifurcado de Redis que el proyecto adoptó tras el cambio de licencia, y habla el mismo protocolo, así que una instalación previa de Redis también sirve.

¿Por qué SearXNG no arranca y se queja de la secret_key?

Es el tropiezo más habitual. SearXNG se niega a iniciarse si la secret_key sigue con el valor de ejemplo ultrasecretkey o está vacía, porque una clave predecible comprometería la seguridad de las sesiones. La solución es generar una clave real con openssl rand -hex 32 y colocarla en la variable SEARXNG_SECRET del Compose o en server.secret_key dentro de settings.yml. Tras cambiarla, reinicia el contenedor y revisa docker compose logs searxng para confirmar que ya no aparece el aviso.

¿Puedo usar mi instancia de SearXNG como API para otras aplicaciones?

Sí. Si añades json a search.formats en settings.yml, SearXNG expone una API que devuelve los resultados en ese formato, ideal para que un script, un panel o un asistente de IA busquen en la web a través de tu instancia. La contrapartida es el abuso: una API abierta invita a que terceros la exploten. Mantén siempre el limitador activo, no publiques el puerto sin un proxy delante y, si de verdad la abres a Internet, protégela con autenticación básica o una lista de acceso en el proxy inverso.

Conclusión

Con un único docker-compose.yml, su contenedor de Valkey y un settings.yml bien ajustado tienes tu propio metabuscador privado: consultas decenas de servicios a la vez sin que nadie registre tus búsquedas. Recuerda las tres reglas que marcan la diferencia: genera una secret_key real con openssl rand -hex 32, fija la versión de la imagen en lugar de usar :latest y no expongas el puerto 8080 sin un proxy inverso con HTTPS por delante. A partir de aquí, publícalo con Nginx Proxy Manager o Traefik y tendrás una búsqueda web que responde solo ante ti.

Fuentes

  1. Documentación oficial de instalación con Docker de SearXNG
  2. Repositorio de SearXNG en GitHub
  3. Imagen de SearXNG en Docker Hub

Ruta: Redes y acceso remoto seguro con Docker