Saltar al contenido principal
Matcher automatiza la conciliación financiera entre múltiples fuentes de datos, eliminando el trabajo de conciliación manual y proporcionando un registro de auditoría completo para cada transacción. Configurar Matcher significa establecer la base para la gestión de excepciones, los informes de cumplimiento y la visibilidad operacional. Esta guía le explica cómo desplegar Matcher en entornos de desarrollo y producción.
Matcher está disponible para clientes con licencia; su repositorio se mantiene internamente. Las instrucciones siguientes asumen que ya tienes acceso a los archivos del proyecto Matcher necesarios.

Docker Compose (desarrollo)


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

1. Acceder al proyecto Matcher

Desde el directorio del proyecto Matcher:
cd matcher

2. Configurar el entorno

El archivo docker-compose.yml incluye valores predeterminados adecuados para desarrollo local. Puedes sobrescribir cualquier valor definiendo variables de entorno en tu shell o creando un archivo .env en la raíz del proyecto. Consulta Variables de entorno para detalles sobre las configuraciones disponibles.
Una variable obligatoria no tiene valor predeterminado: SYSTEMPLANE_SECRET_MASTER_KEY. Consulta config/.config-map.example en el repositorio para instrucciones de generación.

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 la aplicación de Matcher:
docker-compose up -d app
Para iniciar todos los servicios a la vez:
docker-compose up -d

4. Verificar la instalación

Confirma que Matcher está ejecutándose listando los contextos de configuración (la llamada retorna un array vacío en una instalación nueva):
curl -H "Authorization: Bearer $TOKEN" http://localhost:4018/v1/contexts
Si la llamada es exitosa, la API de Matcher y sus dependencias (PostgreSQL, Redis, RabbitMQ, object storage) están accesibles.

Servicios de Docker Compose

El docker-compose.yml por defecto incluye:
ServicioPuertoPropósito
postgres5432Base de datos PostgreSQL primaria
postgres-replica5433Réplica de lectura PostgreSQL
redis6379Caché Valkey (compatible con Redis)
rabbitmq5672, 15672RabbitMQ (AMQP e interfaz de gestión)
seaweedfs8333, 9333Almacenamiento de objetos compatible con S3
app4018API de Matcher

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. Crear un namespace

kubectl create namespace matcher

2. 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: 4018

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

3. 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

4. Instalar el chart

helm install matcher oci://registry-1.docker.io/lerianstudio/matcher-helm \
 --version 2.1.1 \
 --namespace matcher \
 --values values.yaml

5. 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 upgrade matcher oci://registry-1.docker.io/lerianstudio/matcher-helm \
 --version 2.1.1 \
 --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
DEPLOYMENT_MODElocalModo de despliegue (local, byoc, saas)
SERVER_ADDRESS:4018Dirección de bind del servidor HTTP
HTTP_BODY_LIMIT_BYTES33554432Tamaño máximo del cuerpo de solicitud (bytes)

CORS

VariablePor defectoDescripción
CORS_ALLOWED_ORIGINShttp://localhost:3000Orígenes permitidos
CORS_ALLOWED_METHODSGET,POST,PUT,PATCH,DELETE,OPTIONSMétodos HTTP permitidos
CORS_ALLOWED_HEADERSOrigin,Content-Type,Accept,Authorization,X-Request-IDHeaders de solicitud permitidos

Base de datos (PostgreSQL)

VariablePor defectoDescripción
POSTGRES_HOSTlocalhostHost de la base de datos primaria
POSTGRES_PORT5432Puerto de la base de datos primaria
POSTGRES_USERmatcherNombre de usuario
POSTGRES_PASSWORDmatcher_dev_passwordContraseña
POSTGRES_DBmatcherNombre de la base de datos
POSTGRES_SSLMODEdisableModo SSL
POSTGRES_TLS_REQUIREDfalseExigir TLS en el bootstrap
POSTGRES_MAX_OPEN_CONNS25Máximo de conexiones abiertas
POSTGRES_MAX_IDLE_CONNS5Máximo de conexiones inactivas
POSTGRES_CONN_MAX_LIFETIME_MINS30Tiempo máximo de vida de la conexión (minutos)
POSTGRES_CONN_MAX_IDLE_TIME_MINS5Tiempo máximo inactivo de la conexión (minutos)
POSTGRES_CONNECT_TIMEOUT_SEC10Timeout de conexión (segundos)
POSTGRES_QUERY_TIMEOUT_SEC30Timeout de consulta (segundos)
MIGRATIONS_PATHmigrationsRuta de archivos de migración

Réplica de base de datos (PostgreSQL)

VariablePor defectoDescripción
POSTGRES_REPLICA_HOSTHost de la réplica
POSTGRES_REPLICA_PORTPuerto de la réplica
POSTGRES_REPLICA_USERUsuario de la réplica
POSTGRES_REPLICA_PASSWORDContraseña de la réplica
POSTGRES_REPLICA_DBNombre de la base de datos réplica
POSTGRES_REPLICA_SSLMODEModo SSL de la réplica
POSTGRES_REPLICA_TLS_REQUIREDfalseExigir TLS para la réplica

Caché (Redis)

VariablePor defectoDescripción
REDIS_HOSTlocalhost:6379Dirección de Redis (host:puerto)
REDIS_MASTER_NAMENombre del master Sentinel
REDIS_PASSWORDContraseña
REDIS_DB0Índice de base de datos
REDIS_PROTOCOL3Versión del protocolo RESP
REDIS_TLSfalseHabilitar TLS
REDIS_TLS_REQUIREDfalseExigir TLS en el bootstrap
REDIS_CA_CERTRuta del certificado CA
REDIS_POOL_SIZE10Tamaño del pool de conexiones
REDIS_MIN_IDLE_CONNS2Mínimo de conexiones inactivas
REDIS_READ_TIMEOUT_MS3000Timeout de lectura (milisegundos)
REDIS_WRITE_TIMEOUT_MS3000Timeout de escritura (milisegundos)
REDIS_DIAL_TIMEOUT_MS5000Timeout de conexión (milisegundos)

Mensajería (RabbitMQ)

VariablePor defectoDescripción
RABBITMQ_URIamqpEsquema URI (amqp o amqps)
RABBITMQ_HOSTlocalhostHost del broker
RABBITMQ_PORT5672Puerto del broker
RABBITMQ_USERmatcher_adminNombre de usuario
RABBITMQ_PASSWORDmatcher_dev_passwordContraseña
RABBITMQ_VHOST/Host virtual
RABBITMQ_HEALTH_URLhttp://localhost:15672URL de la API de gestión para health checks
RABBITMQ_ALLOW_INSECURE_HEALTH_CHECKfalsePermitir health check HTTP (sin TLS)
RABBITMQ_TLS_REQUIREDfalseExigir TLS en el bootstrap

Autenticación

VariablePor defectoDescripción
PLUGIN_AUTH_ENABLEDfalseHabilitar autenticación
PLUGIN_AUTH_ADDRESSURL del servicio de autenticación
AUTH_JWT_SECRETSecreto de firma JWT

Almacenamiento de objetos (compatible con S3)

VariablePor defectoDescripción
OBJECT_STORAGE_ENDPOINThttp://localhost:8333URL del endpoint S3
OBJECT_STORAGE_REGIONus-east-1Región S3
OBJECT_STORAGE_BUCKETmatcher-exportsBucket para exportaciones
OBJECT_STORAGE_ACCESS_KEY_IDID de clave de acceso
OBJECT_STORAGE_SECRET_ACCESS_KEYClave de acceso secreta
OBJECT_STORAGE_USE_PATH_STYLEtrueUsar direccionamiento path-style
OBJECT_STORAGE_ALLOW_INSECURE_ENDPOINTfalsePermitir endpoint HTTP (sin TLS)
OBJECT_STORAGE_TLS_REQUIREDfalseExigir TLS en el bootstrap

Observabilidad

VariablePor defectoDescripción
ENABLE_TELEMETRYfalseHabilitar OpenTelemetry
OTEL_RESOURCE_SERVICE_NAMEmatcherNombre del servicio para trazas/métricas
OTEL_LIBRARY_NAMEgithub.com/LerianStudio/matcherNombre de la biblioteca de instrumentación
OTEL_RESOURCE_SERVICE_VERSION1.1.0Versión del servicio
OTEL_RESOURCE_DEPLOYMENT_ENVIRONMENTdevelopmentEtiqueta del entorno de despliegue
OTEL_EXPORTER_OTLP_ENDPOINTlocalhost:4317Endpoint del colector OTLP
DB_METRICS_INTERVAL_SEC15Intervalo de recolección de métricas de DB

TLS

VariablePor defectoDescripción
SERVER_TLS_CERT_FILERuta del certificado TLS
SERVER_TLS_KEY_FILERuta de la clave privada TLS
TLS_TERMINATED_UPSTREAMfalseConfiar en terminación TLS upstream (ej: load balancer)
TRUSTED_PROXIESRangos CIDR de proxies de confianza

Limitación de tasa

VariablePor defectoDescripción
RATE_LIMIT_ENABLEDtrueHabilitar limitación de tasa global
RATE_LIMIT_MAX100Máximo de solicitudes por ventana
RATE_LIMIT_EXPIRY_SEC60Ventana de limitación de tasa (segundos)
EXPORT_RATE_LIMIT_MAX10Máximo de solicitudes de exportación por ventana
EXPORT_RATE_LIMIT_EXPIRY_SEC60Ventana de limitación de exportación (segundos)
DISPATCH_RATE_LIMIT_MAX50Máximo de solicitudes de despacho por ventana
DISPATCH_RATE_LIMIT_EXPIRY_SEC60Ventana de limitación de despacho (segundos)
ADMIN_RATE_LIMIT_MAX30Máximo de solicitudes admin por ventana
ADMIN_RATE_LIMIT_EXPIRY_SEC60Ventana de limitación admin (segundos)

Swagger

VariablePor defectoDescripción
SWAGGER_ENABLEDfalseHabilitar Swagger UI
SWAGGER_HOSTSobrescribir host de la spec de Swagger
SWAGGER_SCHEMEShttpsEsquemas de la spec de Swagger (separados por coma)

Idempotencia

VariablePor defectoDescripción
IDEMPOTENCY_RETRY_WINDOW_SEC300Ventana para reintentar solicitudes idempotentes fallidas (segundos)
IDEMPOTENCY_SUCCESS_TTL_HOURS168Tiempo de caché de claves de idempotencia completadas (horas)
IDEMPOTENCY_HMAC_SECRETSecreto HMAC para firmar claves de idempotencia (mín 32 bytes)

Deduplicación

VariablePor defectoDescripción
DEDUPE_TTL_SEC3600TTL de claves de deduplicación (segundos)

Outbox

VariablePor defectoDescripción
OUTBOX_RETRY_WINDOW_SEC300Enfriamiento antes de reintentar eventos fallidos (segundos)
OUTBOX_DISPATCH_INTERVAL_SEC2Intervalo de polling del dispatcher (segundos)

Workers

VariablePor defectoDescripción
EXPORT_WORKER_ENABLEDtrueHabilitar worker de exportación
EXPORT_WORKER_POLL_INTERVAL_SEC5Intervalo de polling del worker de exportación (segundos)
EXPORT_WORKER_PAGE_SIZE1000Filas por página de exportación
EXPORT_PRESIGN_EXPIRY_SEC3600Expiración de URL pre-firmada para exportaciones (segundos)
CLEANUP_WORKER_ENABLEDtrueHabilitar worker de limpieza
CLEANUP_WORKER_INTERVAL_SEC3600Intervalo del worker de limpieza (segundos)
CLEANUP_WORKER_BATCH_SIZE100Tamaño del lote de limpieza
CLEANUP_WORKER_GRACE_PERIOD_SEC3600Período de gracia antes de la limpieza (segundos)
WEBHOOK_TIMEOUT_SEC30Timeout de despacho de webhook (segundos)
CALLBACK_RATE_LIMIT_PER_MIN60Máximo de callbacks por sistema externo por minuto

Programador

VariablePor defectoDescripción
SCHEDULER_INTERVAL_SEC60Intervalo de polling del programador cron (segundos)

Archivado

VariablePor defectoDescripción
ARCHIVAL_WORKER_ENABLEDfalseHabilitar worker de archivado de logs de auditoría
ARCHIVAL_WORKER_INTERVAL_HOURS24Intervalo de ejecución del archivado (horas)
ARCHIVAL_HOT_RETENTION_DAYS90Días para mantener datos en almacenamiento caliente
ARCHIVAL_WARM_RETENTION_MONTHS24Meses para mantener datos en almacenamiento tibio
ARCHIVAL_COLD_RETENTION_MONTHS84Meses para mantener datos en almacenamiento frío
ARCHIVAL_BATCH_SIZE5000Filas por lote de archivado
ARCHIVAL_STORAGE_BUCKETmatcher-archivesBucket S3 para archivos
ARCHIVAL_STORAGE_PREFIXarchives/audit-logsPrefijo de clave S3 para archivos
ARCHIVAL_STORAGE_CLASSGLACIERClase de almacenamiento S3 para archivos
ARCHIVAL_PARTITION_LOOKAHEAD3Cantidad de particiones anticipadas
ARCHIVAL_PRESIGN_EXPIRY_SEC3600Expiración de URL pre-firmada para archivos (segundos)

Fetcher / Discovery

Estas configuraciones controlan Discovery, que se conecta a bases de datos externas a través de Fetcher, el servicio interno de extracción de datos de Lerian. Consulte Discovery para saber cómo funciona.
VariablePor defectoDescripción
FETCHER_ENABLEDfalseHabilitar discovery con Fetcher
FETCHER_URLhttp://localhost:4006URL del servicio Fetcher
FETCHER_ALLOW_PRIVATE_IPSfalsePermitir rangos de IP privados
FETCHER_HEALTH_TIMEOUT_SEC5Timeout del health check del Fetcher (segundos)
FETCHER_REQUEST_TIMEOUT_SEC30Timeout de solicitud al Fetcher (segundos)
FETCHER_DISCOVERY_INTERVAL_SEC60Intervalo de polling de discovery (segundos)
FETCHER_SCHEMA_CACHE_TTL_SEC300TTL del caché de schema (segundos)
FETCHER_EXTRACTION_POLL_INTERVAL_SEC5Intervalo de polling de extracción (segundos)
FETCHER_EXTRACTION_TIMEOUT_SEC600Timeout de extracción (segundos)
FETCHER_MAX_EXTRACTION_BYTES2147483648Tamaño máximo del payload de extracción (bytes, 2 GiB por defecto)
FETCHER_BRIDGE_INTERVAL_SEC30Intervalo de polling del bridge worker (segundos)
FETCHER_BRIDGE_BATCH_SIZE50Extracciones por tenant por ciclo de bridge
FETCHER_BRIDGE_TENANT_CONCURRENCY4Tenants concurrentes en el ciclo de bridge
FETCHER_BRIDGE_STALE_THRESHOLD_SEC3600Umbral de extracción obsoleta (segundos)
FETCHER_BRIDGE_RETRY_MAX_ATTEMPTS5Máximo de reintentos por extracción
FETCHER_CUSTODY_RETENTION_SWEEP_INTERVAL_SEC900Intervalo de barrido de custodia (segundos)
FETCHER_CUSTODY_RETENTION_GRACE_PERIOD_SEC3600Período de gracia antes de eliminar custodia (segundos)
APP_ENC_KEYClave maestra codificada en Base64 compartida con Fetcher

Credenciales M2M

VariablePor defectoDescripción
M2M_TARGET_SERVICEfetcherNombre del servicio destino para búsqueda de credenciales
M2M_CREDENTIAL_CACHE_TTL_SEC300TTL del caché Redis para credenciales M2M (segundos)
AWS_REGIONRegión AWS para Secrets Manager

Infraestructura

VariablePor defectoDescripción
INFRA_CONNECT_TIMEOUT_SEC30Timeout de conexión de infraestructura en el inicio (segundos)
HEALTH_CHECK_TIMEOUT_SEC5Timeout legado por verificación (segundos)
HEALTH_CHECK_TIMEOUT_MS800Timeout por verificación (milisegundos, preferido)
Para configuraciones de despliegue multi-tenant, ver Modo Multi-Tenant. Para gestión de configuración en runtime, ver Configuración en Runtime (Systemplane).

Verificar la instalación


Valida que Matcher esté operando correctamente ejercitando la API:
curl -X POST http://localhost:4018/v1/contexts \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Contexto de prueba",
   "type": "1:1"
 }'
Una respuesta exitosa confirma que la API y sus dependencias (base de datos, caché, message broker, object storage) están accesibles. Las sondas de liveness y readiness de Kubernetes se configuran a nivel de cluster por la orquestación; no necesitas llamarlas directamente.

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 PLUGIN_AUTH_ADDRESS
  2. Deshabilita la autenticación para desarrollo: PLUGIN_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
Al actualizar desde la rama main, las migraciones 000020 y 000021 se ejecutan automáticamente. La migración 000020 renombra las claves de configuración del systemplane para estandarización entre productos. La migración 000021 convierte la columna external_system de un tipo enum a VARCHAR(255), permitiendo identificadores arbitrarios de sistema externo. Si las migraciones fallan, verifica la tabla schema_migrations y asegúrate de que no existan cambios manuales en conflicto.

Ver logs

docker-compose logs -f app
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 app

Próximos pasos


Inicio rápido

Ejecuta tu primera conciliación.

Configuración

Configura contextos, fuentes y reglas de conciliación.