Saltar a contenido

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, INSERT en las tablas involucradas

1. Aplicar schema en MySQL

Ejecutar el archivo meilisearch_triggers.sql que crea la tabla de cola y todos los triggers:

mysql -u root -p rosgan < meilisearch_triggers.sql

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

cp .env.example .env
vi .env

Ver Variables de entorno para la referencia completa.

3. Build y push de la imagen

docker build -t mundoit/meilisearch-sync:latest .
docker push mundoit/meilisearch-sync:latest

4. Deploy con el script

chmod +x update-sync.sh
./update-sync.sh

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

./update-sync.sh

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.