Saltar al contenido principal
Esta guía describe cómo desplegar Matcher en entornos de desarrollo y producción.

Docker Compose (desarrollo)


Docker Compose es el enfoque recomendado para desarrollo local y pruebas.

1. Clonar el repositorio

git clone https://github.com/LerianStudio/matcher.git
cd matcher

2. Configurar el entorno

Crea un archivo de entorno local:
cp config/.env.example config/.env
Actualiza config/.env con valores apropiados para tu entorno. Consulta Variables de entorno para más detalles.

3. Iniciar servicios

Inicia los servicios de infraestructura requeridos:
docker-compose up -d postgres redis rabbitmq
Espera hasta que todos los servicios reporten un estado saludable:
docker-compose ps
Inicia Matcher:
docker-compose up -d matcher
Para iniciar todos los servicios a la vez:
docker-compose up -d

4. Verificar la instalación

Confirma que Matcher está ejecutándose:
curl http://localhost:8080/health
Respuesta esperada:
{
  "status": "healthy",
  "services": {
    "postgres": "healthy",
    "redis": "healthy",
    "rabbitmq": "healthy"
  }
}

Servicios de Docker Compose

El docker-compose.yml por defecto incluye:
ServicioPuertoPropósito
matcher8080API de Matcher
postgres5432Base de datos PostgreSQL
redis6379Caché Redis
rabbitmq5672, 15672RabbitMQ (AMQP e interfaz de gestión)

Desarrollo con recarga en caliente

Para desarrollo activo, usa:
make dev
Esto inicia Matcher con recarga en vivo habilitada usando Air.

Kubernetes / Helm (producción)


Los despliegues de producción deben usar el chart oficial de Helm.

Prerrequisitos

  • Kubernetes 1.28+
  • Helm 3.12+
  • kubectl configurado para el clúster destino

1. Agregar el repositorio de Helm

helm repo add lerian https://charts.lerian.studio
helm repo update

2. Crear un namespace

kubectl create namespace matcher

3. Configurar valores

Crea un archivo values.yaml con tu configuración de despliegue:
replicaCount: 2

image:
 repository: lerianstudio/matcher
 tag: "latest"
 pullPolicy: IfNotPresent

service:
 type: ClusterIP
 port: 8080

ingress:
 enabled: true
 className: nginx
 hosts:
 - host: matcher.example.com
 paths:
 - path: /
 pathType: Prefix
 tls:
 - secretName: matcher-tls
 hosts:
 - matcher.example.com

postgresql:
 external: true
 host: postgres.example.com
 port: 5432
 database: matcher
 username: matcher
 existingSecret: matcher-db-credentials
 existingSecretKey: password

redis:
 external: true
 host: redis.example.com
 port: 6379
 existingSecret: matcher-redis-credentials

rabbitmq:
 external: true
 host: rabbitmq.example.com
 port: 5672
 username: matcher
 existingSecret: matcher-rabbitmq-credentials

auth:
 enabled: true
 serviceAddress: https://auth.example.com

observability:
 enabled: true
 otelExporterEndpoint: http://otel-collector:4317

resources:
 requests:
 cpu: 500m
 memory: 512Mi
 limits:
 cpu: 2000m
 memory: 2Gi

4. Crear secrets

Crea Kubernetes secrets para credenciales sensibles:
kubectl create secret generic matcher-db-credentials \
 --from-literal=password=tu-contraseña-de-db \
 -n matcher

kubectl create secret generic matcher-redis-credentials \
 --from-literal=password=tu-contraseña-de-redis \
 -n matcher

kubectl create secret generic matcher-rabbitmq-credentials \
 --from-literal=password=tu-contraseña-de-rabbitmq \
 -n matcher

5. Instalar el chart

helm install matcher lerian/matcher \
 --namespace matcher \
 --values values.yaml

6. Verificar el despliegue

kubectl get pods -n matcher
kubectl get svc -n matcher
kubectl logs -f deployment/matcher -n matcher

Actualización

Para actualizar un despliegue existente:
helm repo update
helm upgrade matcher lerian/matcher \
 --namespace matcher \
 --values values.yaml

Variables de entorno


Matcher se configura completamente a través de variables de entorno.

Aplicación

VariablePor defectoDescripción
ENV_NAMEdevelopmentNombre del entorno de ejecución
LOG_LEVELinfoNivel de verbosidad del log
SERVER_ADDRESS:8080Dirección del servidor HTTP
HTTP_BODY_LIMIT_BYTES104857600Tamaño máximo de solicitud

Base de datos (PostgreSQL)

VariablePor defectoDescripción
POSTGRES_HOSTlocalhostHost de la base de datos
POSTGRES_PORT5432Puerto de la base de datos
POSTGRES_USERmatcherNombre de usuario
POSTGRES_PASSWORD-Contraseña
POSTGRES_DBmatcherNombre de la base de datos
POSTGRES_SSLMODEdisableModo SSL
POSTGRES_MAX_OPEN_CONNS25Máximo de conexiones abiertas
POSTGRES_MAX_IDLE_CONNS10Máximo de conexiones inactivas

Caché (Redis)

VariablePor defectoDescripción
REDIS_HOSTlocalhost:6379Dirección de Redis
REDIS_PASSWORD-Contraseña
REDIS_DB0Índice de base de datos
REDIS_POOL_SIZE10Tamaño del pool

Mensajería (RabbitMQ)

VariablePor defectoDescripción
RABBITMQ_HOSTlocalhostHost del broker
RABBITMQ_PORT5672Puerto del broker
RABBITMQ_USERguestNombre de usuario
RABBITMQ_PASSWORDguestContraseña
RABBITMQ_VHOST/Host virtual

Autenticación

VariablePor defectoDescripción
AUTH_ENABLEDtrueHabilitar autenticación
AUTH_SERVICE_ADDRESS-URL del servicio de autenticación
DEFAULT_TENANT_ID-ID de tenant por defecto
DEFAULT_TENANT_SLUG-Slug de tenant por defecto

Observabilidad

VariablePor defectoDescripción
OTEL_ENABLEDfalseHabilitar OpenTelemetry
OTEL_SERVICE_NAMEmatcherNombre del servicio de trazas
OTEL_EXPORTER_ENDPOINT-Endpoint del exportador OTLP

TLS

VariablePor defectoDescripción
SERVER_TLS_CERT_FILE-Ruta del certificado TLS
SERVER_TLS_KEY_FILE-Ruta de la clave privada TLS

Verificar la instalación


Valida que Matcher esté operando correctamente.

Verificación de salud

curl http://localhost:8080/health

Verificación de disponibilidad

curl http://localhost:8080/ready

Verificación de la API

curl -X POST http://localhost:8080/v1/contexts \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Contexto de prueba",
   "type": "1:1"
 }'

Solución de problemas


Problemas comunes

  • Causa: PostgreSQL no está ejecutándose o no es accesible.
  • Resolución:
  1. Verifica que PostgreSQL esté ejecutándose: docker-compose ps postgres
  2. Revisa los valores de conexión en .env
  3. Prueba la conectividad: nc -zv localhost 5432
  4. Revisa los logs: docker-compose logs postgres
  • Causa: Redis no está ejecutándose o las credenciales son incorrectas.
  • Resolución:
  1. Verifica que Redis esté ejecutándose: docker-compose ps redis
  2. Confirma REDIS_PASSWORD
  3. Prueba la conectividad: redis-cli -h localhost ping
  • Causa: RabbitMQ todavía está inicializando o falta el host virtual.
  • Resolución:
  1. Espera hasta que RabbitMQ esté saludable
  2. Accede a la interfaz de gestión en http://localhost:15672
  3. Verifica RABBITMQ_VHOST
  • Causa: El servicio de autenticación no es accesible o el token es inválido.
  • Resolución:
  1. Verifica AUTH_SERVICE_ADDRESS
  2. Deshabilita la autenticación para desarrollo: AUTH_ENABLED=false
  3. Revisa los logs del servicio de autenticación
  • Causa: Las migraciones de base de datos no pudieron aplicarse.
  • Resolución:
  1. Verifica el estado de migración: make migrate-status
  2. Revisa los logs de migración
  3. Aplica las migraciones manualmente: make migrate-up
  4. Inspecciona la tabla schema_migrations si es necesario

Ver logs

docker-compose logs -f matcher
kubectl logs -f deployment/matcher -n matcher

Modo de depuración

Habilita el logging de depuración para mayor visibilidad:
LOG_LEVEL=debug docker-compose up matcher

Próximos pasos