SearXNG es un metabuscador gratuito que envía tu consulta a varios motores de búsqueda, combina los resultados y no crea un perfil sobre ti. Para ejecutar tu propio buscador autohospedado, despliega la imagen oficial del contenedor con Docker Compose en un VPS, protégelo con HTTPS y control de acceso, y considera que los motores externos pueden limitar tus solicitudes. Ese es el principal riesgo operativo.
Qué es SearXNG: un metabuscador autohospedado
SearXNG es un metabuscador gratuito: reenvía cada consulta a varios motores de búsqueda, combina los resultados en una página y no rastrea ni crea perfiles de sus usuarios. Como metabuscador, no rastrea ni indexa la web por su cuenta. Reúne lo que devuelven los motores que habilitas y lo sirve desde tu propio servidor. Por eso funciona bien como buscador autohospedado en un VPS pequeño.
Alojarlo por tu cuenta te da tres ventajas. Los motores externos ven la dirección IP de tu servidor, no la de tu laptop, así que las consultas no quedan vinculadas al perfil ni a la cuenta de tu navegador. Tú decides qué motores reciben consultas. También obtienes un endpoint JSON al que pueden llamar scripts y herramientas de IA para buscar en la web sin una API key.
También tiene límites reales. La calidad de los resultados depende de los motores externos, así que un CAPTCHA en uno de ellos reduce tus resultados. Tus consultas siguen llegando a esos motores y el proveedor de tu VPS ve el tráfico. Un buscador privado no ofrece anonimato.
Qué tamaño de VPS necesitas para alojar un buscador
La documentación no publica requisitos mínimos de RAM o CPU, y la plantilla oficial de Compose no establece límites de recursos. Una instancia personal consume poco, así que empieza con un servidor pequeño y ejecuta docker stats después de unos días para comprobar qué necesita.
| Requisito | Qué usar | Notas |
| Runtime de contenedores | Docker con el plugin Compose | Podman también es compatible; la documentación recomienda Docker para la mayoría de los usuarios. |
| Almacén para caché y limitador | Valkey 9 (imagen alpine) | Solo lo necesita el limitador, pero la plantilla lo inicia de forma predeterminada. |
| CPU y RAM | 1-2 vCPU y 2 GB de RAM como punto de partida | Es una referencia de tamaño; revisa docker stats y ajusta los recursos. |
| Dominio | Un nombre DNS que apunte al VPS | Se necesita para obtener un certificado HTTPS confiable. |
Instala SearXNG con Docker Compose
Muchos tutoriales todavía apuntan al repositorio searxng-docker, pero su README ahora indica que fue reemplazado. El método actual usa la plantilla de Compose del repositorio principal del proyecto en GitHub, que es la opción de esta guía. Primero necesitas Docker y Compose. Si no están instalados, sigue nuestra guía para instalar Docker en Ubuntu.
# Create the working directories and fetch the official compose template
mkdir -p ./metasearch/core-config/
cd ./metasearch/
BASE=https://raw.githubusercontent.com/searxng/searxng/master/container
curl -fsSL -O $BASE/docker-compose.yml -O $BASE/.env.example
cp -i .env.example .env
La plantilla define dos servicios. El servicio core ejecuta la imagen oficial de Docker Hub, usa la etiqueta latest a menos que fijes una versión en .env y monta ./core-config/ como directorio de configuración. El servicio valkey proporciona el almacén compatible con Redis que usa el limitador de solicitudes. Esta es la estructura en noviembre de 2026:
name: searxng
services:
core:
container_name: searxng-core
image: docker.io/searxng/searxng:${SEARXNG_VERSION:-latest}
restart: always
ports:
– ${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080}
env_file: ./.env
volumes:
– ./core-config/:/etc/searxng/:Z
– core-data:/var/cache/searxng/
valkey:
container_name: searxng-valkey
image: docker.io/valkey/valkey:9-alpine
command: valkey-server –save 300 1 –save 60 1000 –loglevel warning
restart: always
volumes:
– valkey-data:/data/
volumes:
core-data:
valkey-data:
El puerto predeterminado es 8080: el contenedor escucha en el puerto 8080 y la plantilla lo publica como puerto 8080 del host. Al establecer SEARXNG_PORT en .env, cambias el puerto en ambos lados. Si no defines una dirección del host en .env, el puerto se publica en todas las interfaces de red. Vincúlalo a localhost y permite que solo el reverse proxy y los túneles SSH lleguen a él:
SEARXNG_HOST=127.0.0.1
Inicia el stack y comprueba su estado. Durante el primer inicio, el contenedor crea core-config/settings.yml a partir de una plantilla incluida y reemplaza el secreto provisional por una clave aleatoria. No necesitas generar nada a mano. Para abrir la interfaz web antes de configurar HTTPS, reenvía el puerto mediante SSH:
docker compose up -d
docker compose ps
# on your own machine, then browse to http://127.0.0.1:8080
ssh -L 8080:127.0.0.1:8080 user@your-server-ip
Configura settings.yml de SearXNG: clave secreta, motores y API JSON
El archivo generado comienza con use_default_settings: true, así que solo necesita los valores que quieras cambiar. Estas son las opciones relevantes en un VPS:
- Clave secreta: se crea durante el primer inicio. Para usar una propia, agrega SEARXNG_SECRET a .env (openssl rand -hex 32 genera un buen valor) y no publiques ese archivo en repositorios públicos.
- Motores: sobrescribe un motor por nombre con disabled: true o false, o usa use_default_settings.engines con remove o keep_only. Los valores predeterminados cambian entre versiones, así que revisa Preferences y después Engines.
- URL base: server.base_url es la dirección que usa la instancia para crear enlaces. Establécela como https://search.example.com cuando el proxy esté configurado.
- Formato JSON: search.formats solo incluye html de forma predeterminada, y solicitar un formato que no aparece en la lista devuelve 403 Forbidden. Agrega json si scripts o herramientas de IA llamarán a la API.
- Limitador: establece server.limiter en true y apunta valkey.url a valkey://valkey:6379/0. Está diseñado para instancias públicas; consulta la nota posterior sobre el uso de la API.
- public_instance: déjalo en false para una instancia privada. El valor true activa el proxy de imágenes y la detección de bots mediante tokens de enlace. La app se niega a iniciar si no puede acceder a Valkey.
# add to core-config/settings.yml
search:
formats:
– html
– json
Reinicia el servicio con docker compose restart core. La API JSON usa el endpoint normal de búsqueda con un parámetro de formato: GET /search recibe q (obligatorio), además de categories, language, pageno, time_range y format como parámetros opcionales. No hay una API key que debas crear. El control de acceso depende de lo que coloques delante de la instancia. Ejecuta esto desde el servidor:
curl -s «http://127.0.0.1:8080/search?q=docker&format=json» | head -c 400
Una instancia con JSON habilitado devuelve un objeto con una lista results y otra llamada unresponsive_engines, que después sirve para depurar problemas. Una instancia configurada solo para HTML responde a format=json con 403 Forbidden. Herramientas de flujos de trabajo como n8n pueden llamar a la misma URL desde un nodo de solicitud HTTP. Nuestra guía sobre n8n en un VPS explica cómo alojarlo.
Piénsalo bien antes de combinar el limitador con el uso de la API. Considera bots a los user agents predeterminados de curl, python-requests y el cliente HTTP de Go, y rechaza solicitudes sin encabezados como Accept-Language. Agrega un cliente fijo a pass_ip en core-config/limiter.toml o desactiva el limitador en una instancia privada.
Protege la instancia con HTTPS y restringe el acceso
Una instancia privada es la opción más segura. Cada consulta de una persona que encuentre una instancia abierta sale mediante la IP de tu servidor. Eso provoca los límites de solicitudes y termina convirtiendo tu instalación en un servicio público. Protégela con HTTPS y un inicio de sesión o una lista de direcciones permitidas:
- Mantén el puerto en 127.0.0.1. Docker publica puertos mediante sus propias reglas de firewall, que omiten UFW. Una vinculación con todas las interfaces queda expuesta. Nuestra guía de UFW explica el resto de la configuración del firewall del host.
- Apunta un registro DNS A, como search.example.com, al VPS.
- Agrega un reverse proxy que termine TLS con un certificado de Let’s Encrypt. Nginx Proxy Manager permite hacerlo desde una interfaz web; Nginx con Certbot también funciona. Si el proxy se ejecuta en un contenedor, comparte una red de Docker con el servicio core y reenvía las solicitudes al puerto 8080 del contenedor core.
- Exige autenticación en el proxy: autenticación básica HTTP o una lista de IP permitidas.
- Si el limitador está activo, agrega la dirección del proxy a trusted_proxies en limiter.toml y pasa los encabezados X-Forwarded-For y X-Real-IP para que el limitador vea la IP real del cliente.
- Permite únicamente el tráfico entrante por los puertos 22, 80 y 443, y sigue la lista de comprobación de seguridad para VPS.
No conectes las herramientas de IA a la URL pública; deja que usen la red interna de Docker.
Por qué los motores externos bloquean tu instancia de SearXNG y cómo evitarlo
Esta es la parte que muchos tutoriales omiten. Nada garantiza que todos los motores sigan respondiendo a tu servidor, y algunos dejarán de hacerlo temporalmente.
- ¿Por qué ocurre? La documentación del proyecto indica que retransmite solicitudes de bots y, por ese motivo, también se clasifica como bot. Los motores responden con CAPTCHAs o bloqueos. Los rangos de IP de proveedores de hosting suelen generar más sospechas que las conexiones domésticas, aunque esto proviene de la experiencia de los operadores y no de una regla documentada.
- ¿Qué hace la instancia? Suspende el motor que falla: de forma predeterminada, durante 24 horas después de un error de acceso denegado o un CAPTCHA, una hora después de una respuesta 429, 15 días después de un CAPTCHA de Cloudflare y 7 días después de un Google reCAPTCHA. Que un motor desaparezca durante un día es normal, no un bug.
- ¿Cómo encuentro al responsable? Revisa la lista unresponsive_engines de una respuesta JSON, la página /stats/errors y docker compose logs -f core.
- ¿Qué ayuda? Mantén privada la instancia y limita el volumen a una cantidad propia de una persona. Habilita una mezcla amplia de motores para que un fallo no deje vacía la página y limita los clientes automatizados. También puedes enrutar el tráfico saliente mediante un proxy con outgoing.proxies.
- ¿Funcionará siempre? No. Si una aplicación necesita resultados garantizados, una API de búsqueda de pago encaja mejor que un sistema de metabúsqueda basado en scraping.
Usa SearXNG como backend de búsqueda para MCP, OpenClaw y Open WebUI
Las herramientas de IA que necesitan resultados actuales de la web pueden llamar a la API JSON de la instancia sin que tengas que administrar una API key de búsqueda. Las tres herramientas siguientes requieren que primero habilites el formato json. El tráfico debe permanecer en una red interna o un túnel SSH.
Servidor MCP de SearXNG para Claude y otros clientes MCP
Un servidor MCP convierte la búsqueda web en una herramienta que pueden llamar clientes MCP como Claude. El proyecto externo mcp-searxng (con licencia MIT y disponible en npm con el mismo nombre) es un proceso de Node.js que consulta la API JSON de tu instancia. Su única variable de entorno obligatoria es la URL de la instancia, que debe estar disponible desde el equipo donde se ejecuta el cliente. Por ejemplo, puedes usar 127.0.0.1:8080 mediante un túnel SSH hacia tu VPS. Agrega lo siguiente a la configuración MCP del cliente:
{
«mcpServers»: {
«web-search»: {
«command»: «npx»,
«args»: [«-y», «mcp-searxng»],
«env»: { «SEARXNG_URL»: «http://127.0.0.1:8080» }
}
}
}
Necesita una versión actual de Node.js y también incluye una imagen de Docker.
OpenClaw con SearXNG
OpenClaw documenta un plugin de proveedor de búsqueda web para SearXNG. Instala el plugin con openclaw plugins install @openclaw/searxng-plugin, establece tools.web.search.provider en searxng (o ejecuta openclaw configure –section web) y proporciona al plugin la dirección de tu instancia como baseUrl en plugins.entries.searxng.config.webSearch. El proveedor solicita format=json, así que habilítalo primero. Los agentes trabajan en ciclos, por lo que conviene reducir tools.web.search.maxResults. Nuestro artículo sobre casos de uso de OpenClaw muestra qué hacen los agentes con acceso web.
Open WebUI con SearXNG
En Open WebUI, establece ENABLE_WEB_SEARCH en True, WEB_SEARCH_ENGINE en searxng y SEARXNG_QUERY_URL en el endpoint /search de la instancia. También puedes usar Settings, Admin, Web Search. Reduce WEB_SEARCH_RESULT_COUNT y WEB_SEARCH_CONCURRENT_REQUESTS para disminuir la carga sobre los motores externos. Usa en la URL el nombre del contenedor core y el puerto 8080. Esa dirección solo se resuelve si Open WebUI se une a la red de Docker que Compose creó para este stack (docker network ls muestra la lista). Un error 403 Forbidden en los logs casi siempre indica que falta json en settings.yml.
Configura tu instancia como buscador predeterminado del navegador
La instancia publica una descripción OpenSearch en /opensearch.xml, que Firefox puede agregar desde la barra de direcciones. En Chrome y Edge, agrega manualmente una búsqueda de sitio con la URL https://search.example.com/search?q=%s y establécela como predeterminada.
Actualiza y respalda tu instancia
- Actualiza con docker compose down, docker compose pull y docker compose up -d. Para permanecer en una versión conocida, fija una versión en .env en lugar de usar latest. De vez en cuando, compara copias nuevas de docker-compose.yml y .env.example con tus archivos.
- Respalda core-config/ y .env. Contienen settings.yml, limiter.toml y la clave secreta, así que guárdalos en un repositorio privado o en un backup cifrado. Valkey solo conserva contadores temporales del limitador y no necesita respaldo. Nuestro artículo sobre estrategias de backup explica cómo programar y probar restauraciones.
Por qué ejecutar SearXNG en un VPS disponible en Contabo
El buscador consume pocos recursos, así que cabe en un Cloud VPS modesto junto con tus otras apps autohospedadas. Las aplicaciones vecinas que consumen mucha RAM determinan el plan que necesitas. Algunos ejemplos son Open WebUI con un ejecutor de modelos o n8n con muchos flujos de trabajo. En esos casos ayuda la cantidad de RAM por euro que ofrece Core VPS. Un precio mensual fijo también evita sorpresas en la factura de un servicio que dejarás activo durante años. Elige un Cloud VPS con 8 GB de RAM o más si quieres alojar en la misma máquina las herramientas de IA de esta guía. Después consulta nuestras apps open source populares para autohospedar y encuentra más servicios que puedes ejecutar junto a SearXNG.
Preguntas frecuentes
¿Qué es SearXNG?
SearXNG es un metabuscador gratuito. Reenvía tu consulta a varios motores de búsqueda, combina los resultados en una página y no rastrea ni crea perfiles de los usuarios. No rastrea la web por su cuenta, así que puedes ejecutarlo en tu propio servidor y controlar qué motores consulta.
¿SearXNG es privado?
Es privado porque no conserva perfiles de usuario y los motores externos ven la IP de tu servidor en lugar de la tuya. No es anónimo: los motores siguen recibiendo tus consultas y tu proveedor de hosting ve el tráfico. Mantén la instancia protegida mediante autenticación.
¿Cómo ejecuto SearXNG con Docker?
Descarga docker-compose.yml y .env.example oficiales desde el directorio container del proyecto, copia el ejemplo como .env, vincula el puerto a 127.0.0.1 y ejecuta docker compose up -d. El contenedor escucha en el puerto 8080 y crea settings.yml con una clave secreta aleatoria durante el primer inicio.
¿Cómo habilito la API JSON de SearXNG?
Agrega json a search.formats en core-config/settings.yml, reinicia el contenedor core y solicita /search?q=term&format=json. Sin esta opción, la instancia responde con 403 Forbidden. No hay una API key, así que protege el endpoint mediante tu reverse proxy o mantenlo en una red interna.
¿Puedo usar SearXNG con servidores MCP, OpenClaw u Open WebUI?
Sí, los tres leen la API JSON. Habilita json en settings.yml, apunta la configuración de la URL de instancia de cada herramienta a tu instalación y mantén el tráfico en una red interna o un túnel SSH.
¿Puedo usar una instancia pública de SearXNG en lugar de alojar una propia?
Sí, para búsquedas ocasionales. Para scripts, agentes o cualquier tarea de la que dependas, una instancia privada es la opción más segura: las instancias públicas suelen limitar las solicitudes, muchas tienen JSON deshabilitado y sus operadores pueden ver tus consultas.
Aviso: Las especificaciones, funciones y precios de los productos mencionados en este artículo pueden cambiar y variar según la región, el periodo de facturación y las promociones activas. Consulta el sitio web oficial de cada proveedor o marca para confirmar las cifras, los precios y los tipos de cambio vigentes.