Instalación de MeiliSearch en un VPS: Búsqueda rápida y potente para tus aplicaciones
TL;DR
En esta guía, configuraremos y pondremos en marcha MeiliSearch, un motor de búsqueda de código abierto de alto rendimiento, paso a paso en tu servidor virtual o dedicado. Aprenderás a instalar MeiliSearch usando Docker, a configurarlo para un acceso seguro vía HTTPS con Caddy, y a establecer un mantenimiento básico y copias de seguridad para asegurar un funcionamiento fiable de la búsqueda para tus aplicaciones web.
- Configuración de un servidor de búsqueda seguro y de alto rendimiento en un VPS.
- Uso de Docker para una instalación sencilla y fiable de MeiliSearch.
- Configuración de HTTPS con gestión automática de certificados a través de Caddy.
- Fundamentos de la protección del servidor con Fail2ban y UFW.
- Creación de un script simple para la copia de seguridad de datos de MeiliSearch.
- Recomendaciones para elegir la configuración óptima de VPS para tareas de búsqueda.
Qué configuramos y por qué
En el mundo moderno, la velocidad de acceso a la información es críticamente importante. Para cualquier aplicación web, tienda en línea, blog o sistema de gestión de contenido, la presencia de una búsqueda rápida y relevante es un factor clave en la experiencia del usuario. Esta es precisamente la tarea que resuelve MeiliSearch, un motor de búsqueda potente y ligero de código abierto, escrito en Rust.
MeiliSearch proporciona una API RESTful que permite integrarlo fácilmente en cualquier aplicación. Se distingue por su alta velocidad de indexación y búsqueda, la relevancia de los resultados "out of the box" gracias a algoritmos de clasificación inteligentes, y el soporte para búsqueda facetada, filtrado y morfología. Al final, el lector obtendrá un servidor MeiliSearch completamente funcional, listo para recibir datos y procesar solicitudes de búsqueda de sus aplicaciones.
Existen diferentes enfoques para implementar la búsqueda: el uso de servicios en la nube (por ejemplo, Algolia, Elastic Cloud) o el despliegue autoalojado (self-hosted) de soluciones como Elasticsearch, Solr o MeiliSearch. Los servicios en la nube son convenientes, pero pueden ser costosos con grandes volúmenes de datos o solicitudes, y también imponen limitaciones en el control sobre la infraestructura. El despliegue autoalojado en un VPS o servidor dedicado, por el contrario, proporciona control total, flexibilidad y a menudo menores costos operativos a largo plazo. MeiliSearch, en este contexto, destaca por su facilidad de instalación, bajos requisitos de recursos en comparación con Elasticsearch y excelente rendimiento, lo que lo convierte en una opción ideal para el despliegue en tu propio VPS.
Qué configuración de VPS se necesita para esta tarea
La elección de la configuración de VPS adecuada para MeiliSearch depende del volumen de datos que planeas indexar y de la carga de búsqueda esperada. MeiliSearch utiliza los recursos de manera eficiente, pero se requieren ciertos mínimos para un funcionamiento estable.
Requisitos mínimos:
- CPU: 1-2 núcleos. MeiliSearch escala bien con el número de núcleos, especialmente durante la indexación.
- RAM: 2 GB. Esto será suficiente para volúmenes de datos pequeños y medianos (hasta varios millones de documentos) y una carga moderada. MeiliSearch carga el índice en la memoria RAM para una búsqueda rápida.
- Disco: 20-40 GB NVMe SSD. La velocidad del disco es crítica para la indexación y la escritura de datos. NVMe supera significativamente a SATA SSD.
- Red: 100 Mbps. Esto es suficiente para la mayoría de las aplicaciones.
Plan de VPS recomendado para empezar (válido para 2026):
Para la mayoría de los proyectos donde el volumen de datos no excede los 10-20 millones de documentos y se esperan hasta varios cientos de solicitudes de búsqueda por minuto, la configuración óptima de VPS será la siguiente:
- CPU: 2-4 vCPU (por ejemplo, Intel Xeon E5 o AMD EPYC).
- RAM: 4-8 GB. Esto proporcionará un margen para un índice más grande y el sistema operativo.
- Disco: 50-100 GB NVMe SSD. Suficiente para almacenar el índice y los archivos del sistema.
- Red: 1 Gbps. Asegurará una rápida transferencia de datos entre la aplicación y MeiliSearch.
Puedes adquirir un VPS con las características indicadas, para asegurar un funcionamiento estable de MeiliSearch con margen para el crecimiento.
Cuándo se necesita un servidor dedicado, no un VPS:
Un servidor dedicado se vuelve necesario cuando:
- El volumen de datos a indexar supera cientos de millones o miles de millones de documentos.
- Se requiere un rendimiento muy alto para miles de solicitudes de búsqueda por segundo.
- La aplicación tiene requisitos estrictos de latencia y rendimiento estable, que un VPS no puede garantizar debido a los "vecinos ruidosos".
- Se necesita control total sobre el hardware, incluyendo procesadores específicos (por ejemplo, con gran caché) o arreglos RAID.
En tales casos, vale la pena considerar un servidor dedicado adecuado.
Ubicación: en qué influye
La ubicación del servidor afecta la latencia entre tu aplicación principal y MeiliSearch, así como entre los usuarios y tu aplicación. Es aconsejable ubicar el VPS con MeiliSearch lo más cerca posible de la aplicación principal para minimizar las latencias durante la indexación y la búsqueda. Si tu aplicación está en Europa, elige un centro de datos europeo. Si la audiencia objetivo está en Norteamérica, el servidor también debería estar allí.
Preparación del servidor
Antes de instalar MeiliSearch, es necesario realizar una configuración básica de seguridad y actualizar el sistema operativo. Utilizaremos Ubuntu Server 24.04 LTS, la versión actual y soportada para 2026.
1. Conexión por SSH y creación de usuario con sudo:
Después de obtener los datos de acceso al VPS, conéctate a él como usuario root:
ssh root@TU_DIRECCIÓN_IP
Crea un nuevo usuario para el trabajo diario (por ejemplo, meiliuser) y añádelo al grupo sudo:
adduser meiliuser
usermod -aG sudo meiliuser
Instala las claves SSH para el nuevo usuario. Copia tu clave SSH pública desde tu máquina local:
# En tu máquina local
ssh-copy-id meiliuser@TU_DIRECCIÓN_IP
Deshabilita el inicio de sesión SSH para root y el inicio de sesión con contraseña, dejando solo el inicio de sesión por clave para meiliuser. Edita el archivo /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Encuentra y modifica las siguientes líneas:
PermitRootLogin no
PasswordAuthentication no
Reinicia el servicio SSH:
sudo systemctl restart sshd
Sal de la sesión de root e inicia sesión como meiliuser.
2. Actualización del sistema:
Siempre comienza actualizando la base de paquetes y los paquetes instalados:
sudo apt update # Actualiza la lista de paquetes disponibles
sudo apt upgrade -y # Actualiza todos los paquetes instalados a las últimas versiones
sudo apt autoremove -y # Elimina dependencias innecesarias
3. Instalación de utilidades básicas y Fail2ban:
Instalaremos las utilidades necesarias y Fail2ban para proteger SSH contra ataques de fuerza bruta:
sudo apt install -y curl wget git htop fail2ban unzip
Fail2ban está configurado por defecto para proteger SSH. Para activarlo, basta con instalarlo. Para una configuración más detallada, puedes crear el archivo /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local
Añade el siguiente contenido:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
Reinicia Fail2ban:
sudo systemctl restart fail2ban
4. Configuración del firewall UFW:
Habilita UFW (Uncomplicated Firewall) y permite solo los puertos necesarios:
sudo ufw allow OpenSSH # Permite SSH (puerto 22)
sudo ufw allow http # Permite HTTP (puerto 80)
sudo ufw allow https # Permite HTTPS (puerto 443)
sudo ufw enable # Habilita el firewall
sudo ufw status verbose # Verifica el estado del firewall
Confirma la activación del firewall pulsando y.
Instalación del software — paso a paso
Instalaremos MeiliSearch utilizando Docker, ya que es el método más flexible y recomendado, proporcionando aislamiento y una gestión de versiones sencilla. Versiones actuales para 2026: Docker Engine 26.x, MeiliSearch 1.9.x, Caddy 2.8.x.
1. Instalación de Docker Engine:
Instala los paquetes necesarios para Docker:
sudo apt install -y ca-certificates curl gnupg lsb-release
Añade la clave GPG oficial de Docker:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Añade el repositorio de Docker a las fuentes de APT:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Actualiza la lista de paquetes e instala Docker Engine, Docker CLI y containerd:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Añade el usuario actual al grupo docker para ejecutar comandos Docker sin sudo:
sudo usermod -aG docker meiliuser
Sal de SSH y vuelve a iniciar sesión para que los cambios de grupo surtan efecto. Verifica la instalación de Docker:
docker run hello-world # Ejecuta un contenedor de prueba de Docker
2. Instalación de MeiliSearch con Docker Compose:
Crea un directorio para MeiliSearch y el archivo docker-compose.yml:
mkdir ~/meilisearch
cd ~/meilisearch
nano docker-compose.yml
Pega el siguiente contenido en docker-compose.yml. Especifica la versión actual de MeiliSearch (por ejemplo, v1.9) y tu propia MEILI_MASTER_KEY:
version: '3.8'
services:
meilisearch:
image: getmeili/meilisearch:v1.9 # Usamos la versión actual de MeiliSearch
container_name: meilisearch
ports:
- "127.0.0.1:7700:7700" # Vinculamos a la interfaz local, el acceso será a través de Caddy
volumes:
- ./data.ms:/meili_data # Directorio para almacenar los datos del índice
environment:
- MEILI_MASTER_KEY=TU_CLAVE_MAESTRA_SECRETA # Asegúrate de reemplazarlo con una clave compleja
- MEILI_ENV=production # Indicamos que este es un entorno de producción
- MEILI_HTTP_ADDR=0.0.0.0:7700 # MeiliSearch escuchará en todas las interfaces dentro del contenedor
restart: always # Reinicio automático del contenedor en caso de fallo
Inicia MeiliSearch con Docker Compose:
docker compose up -d # Inicia el contenedor de MeiliSearch en segundo plano
Verifica que el contenedor esté en ejecución:
docker ps # Muestra los contenedores en ejecución
Deberías ver el contenedor meilisearch, ejecutándose en el puerto 7700 (vinculado a 127.0.0.1).
3. Instalación de Caddy (proxy inverso y HTTPS):
Caddy es un servidor web potente y fácil de usar que configura automáticamente HTTPS con Let's Encrypt. Es ideal para proxyficar solicitudes a MeiliSearch.
Añade la clave GPG de Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
Añade el repositorio de Caddy:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
Actualiza la lista de paquetes e instala Caddy:
sudo apt update
sudo apt install -y caddy
Verifica el estado de Caddy:
sudo systemctl status caddy # Verificamos que Caddy esté en ejecución y funcionando
Configuración
Ahora que MeiliSearch y Caddy están instalados, es necesario configurar Caddy para que actúe como proxy de las solicitudes a MeiliSearch y proporcione acceso HTTPS.
1. Configuración de Caddyfile:
Edite el archivo de configuración principal de Caddy — Caddyfile:
sudo nano /etc/caddy/Caddyfile
Elimine todo el contenido predeterminado e inserte lo siguiente, reemplazando your-domain.com por su nombre de dominio (por ejemplo, search.mydomain.com) y ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ por la misma clave que utilizó en docker-compose.yml:
your-domain.com {
# Obtención automática de certificado SSL de Let's Encrypt
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Ejemplo para Cloudflare. Use su proveedor de DNS o deje tls si usa registros A/AAAA
}
# Protección de API con clave (capa de seguridad adicional)
header Authorization "Bearer ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ"
# Proxy de solicitudes a MeiliSearch, ejecutándose en el puerto local 7700
reverse_proxy 127.0.0.1:7700 {
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-Proto {scheme}
}
# Configuración de registro (opcional)
log {
output file /var/log/caddy/meilisearch_access.log
format json
}
# Manejo de errores (opcional)
handle_errors {
respond "{http.error.status_code} {http.error.status_text}" {http.error.status_code}
}
}
Importante: Para la obtención automática de un certificado TLS utilizando un proveedor de DNS (como en el ejemplo de Cloudflare), necesitará instalar el plugin de Caddy correspondiente y configurar las variables de entorno. Si utiliza registros A/AAAA y su dominio es accesible desde el exterior, basta con especificar tls sin opciones adicionales, y Caddy obtendrá el certificado automáticamente. Si utiliza un plugin de DNS, asegúrese de que las variables de entorno (por ejemplo, CLOUDFLARE_API_TOKEN) estén configuradas en el archivo de servicio de Caddy o a través de variables del sistema.
Para Caddy con Cloudflare DNS, instale el plugin:
# Ejemplo de instalación del plugin de Caddy para Cloudflare DNS.
# Este paso puede variar según su proveedor de DNS.
# Si no usa un plugin de DNS, omita este paso.
sudo apt install -y caddy-dns-cloudflare # O otro plugin, por ejemplo caddy-dns-digitalocean
Si utiliza un plugin de DNS, añada las variables de entorno al archivo de servicio de Caddy. Edite el archivo /etc/systemd/system/caddy.service.d/override.conf (créelo si no existe):
sudo systemctl edit caddy
Añada las siguientes líneas (reemplace con su token):
[Service]
Environment="CLOUDFLARE_API_TOKEN=ВАШ_API_ТОКЕН_CLOUDFLARE"
Guarde el archivo y reinicie Caddy:
sudo systemctl daemon-reload # Recargamos systemd para que vea los cambios en el servicio
sudo systemctl restart caddy # Reiniciamos Caddy para aplicar la configuración y obtener el certificado
sudo systemctl status caddy # Verificamos el estado de Caddy
Asegúrese de que Caddy se haya iniciado correctamente y haya obtenido el certificado SSL. No debería haber errores relacionados con TLS en los registros.
2. Verificación de la operatividad:
Utilice curl para verificar la disponibilidad de MeiliSearch a través de Caddy:
curl -I https://your-domain.com/health # Verificamos el estado de salud de MeiliSearch
Si todo está configurado correctamente, debería recibir una respuesta con el estado HTTP 200 OK. También puede verificar la versión de MeiliSearch:
curl -X GET 'https://your-domain.com/version' \
-H 'Authorization: Bearer ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ'
Debería ver una respuesta JSON con la información de la versión de MeiliSearch.
3. Apertura de puertos en el firewall (si no se hizo antes):
Asegúrese de que los puertos 80 y 443 estén abiertos en UFW:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload