Deployment
Requisitos
- Docker instalado en el servidor
- MySQL accesible desde el container (IP directa o red Docker)
- Meilisearch corriendo y accesible desde el container
- Usuario MySQL con permisos
SELECT,DELETE,INSERTen las tablas involucradas
1. Aplicar schema en MySQL
Ejecutar el archivo meilisearch_triggers.sql que crea la tabla de cola y todos los triggers:
Verificar que la tabla y los triggers quedaron creados:
-- Tabla
SHOW CREATE TABLE meilisearch_sync_queue;
-- Triggers
SHOW TRIGGERS LIKE 'HAC_CERTIFICADO';
SHOW TRIGGERS LIKE 'ATRIBUTOS_VALORES';
SHOW TRIGGERS LIKE 'REG_CUENTA_ESTABLECIMIENTO';
2. Configurar .env
Ver Variables de entorno para la referencia completa.
3. Build y push de la imagen
4. Deploy con el script
El script hace pull de la imagen, baja el container anterior, y levanta el nuevo:
#!/bin/bash
set -e
IMAGE="mundoit/meilisearch-sync:latest"
CONTAINER="rosgan_meili_sync"
ENV_FILE=".env"
docker pull $IMAGE
docker rm -f $CONTAINER 2>/dev/null || true
docker run -d \
--name $CONTAINER \
--restart always \
--env-file $ENV_FILE \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
$IMAGE
Sin --network
El worker se conecta a MySQL y Meilisearch por IP directa configurada en el .env. Si están en containers Docker en la misma máquina, agregá --network nombre_red al docker run.
5. Verificar
# Ver que levantó
docker ps | grep rosgan_meili_sync
# Ver logs del startup
docker logs rosgan_meili_sync
# Seguir logs en vivo
docker logs -f rosgan_meili_sync
Logs esperados al iniciar
2026-03-12 17:00:00 [INFO] Worker iniciado | modo=daemon | db=192.168.0.10:3306/rosgan | intervalo=10s | ventana_atributos=1min
2026-03-12 17:00:00 [INFO] Conectando pool MySQL → 192.168.0.10:3306 ...
2026-03-12 17:00:00 [INFO] Pool MySQL OK
2026-03-12 17:00:00 [INFO] meilisearch_sync_queue accesible — 0 pendientes
2026-03-12 17:00:00 [INFO] Verificando Meilisearch → http://192.168.0.10:7700 ...
2026-03-12 17:00:00 [INFO] Meilisearch health: 200 {"status":"available"}
2026-03-12 17:00:00 [INFO] Modo daemon: iniciando loop...
2026-03-12 17:00:00 [INFO] [ciclo 1] Cola vacía — próximo en 10s
Si el startup se queda colgado después del primer log, el problema es conectividad a MySQL. Verificar:
docker exec rosgan_meili_sync python3 -c "
import socket
s = socket.create_connection(('DB_HOST', 3306), timeout=5)
print('OK')
s.close()
"
Poblado inicial
Para indexar todos los lotes de un remate por primera vez (antes de que los triggers empiecen a funcionar):
# Insertar manualmente todos los IDs en la cola
INSERT IGNORE INTO meilisearch_sync_queue (certificado_id)
SELECT id_certificado FROM HAC_CERTIFICADO
WHERE remate_id = 1846 AND cert_estado_id = 3;
El worker los procesará en el próximo ciclo en batches de WORKER_BATCH_SIZE.
Actualización de la imagen
Zero downtime: el script levanta el nuevo container inmediatamente después de bajar el anterior. El gap máximo es de unos segundos — los triggers siguen escribiendo en la cola durante ese tiempo y el worker los procesa al arrancar.