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:2. Configurar el entorno
El archivodocker-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: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):Servicios de Docker Compose
Eldocker-compose.yml por defecto incluye:
| Servicio | Puerto | Propósito |
|---|---|---|
postgres | 5432 | Base de datos PostgreSQL primaria |
postgres-replica | 5433 | Réplica de lectura PostgreSQL |
redis | 6379 | Caché Valkey (compatible con Redis) |
rabbitmq | 5672, 15672 | RabbitMQ (AMQP e interfaz de gestión) |
seaweedfs | 8333, 9333 | Almacenamiento de objetos compatible con S3 |
app | 4018 | API de Matcher |
Desarrollo con recarga en caliente
Para desarrollo activo, usa:Kubernetes / Helm (producción)
Los despliegues de producción deben usar el chart oficial de Helm.
Prerrequisitos
- Kubernetes 1.28+
- Helm 3.12+
kubectlconfigurado para el clúster destino
1. Crear un namespace
2. Configurar valores
Crea un archivovalues.yaml con tu configuración de despliegue:
3. Crear secrets
Crea Kubernetes secrets para credenciales sensibles:4. Instalar el chart
5. Verificar el despliegue
Actualización
Para actualizar un despliegue existente:Variables de entorno
Matcher se configura completamente a través de variables de entorno.
Aplicación
| Variable | Por defecto | Descripción |
|---|---|---|
ENV_NAME | development | Nombre del entorno de ejecución |
LOG_LEVEL | info | Nivel de verbosidad del log |
DEPLOYMENT_MODE | local | Modo de despliegue (local, byoc, saas) |
SERVER_ADDRESS | :4018 | Dirección de bind del servidor HTTP |
HTTP_BODY_LIMIT_BYTES | 33554432 | Tamaño máximo del cuerpo de solicitud (bytes) |
CORS
| Variable | Por defecto | Descripción |
|---|---|---|
CORS_ALLOWED_ORIGINS | http://localhost:3000 | Orígenes permitidos |
CORS_ALLOWED_METHODS | GET,POST,PUT,PATCH,DELETE,OPTIONS | Métodos HTTP permitidos |
CORS_ALLOWED_HEADERS | Origin,Content-Type,Accept,Authorization,X-Request-ID | Headers de solicitud permitidos |
Base de datos (PostgreSQL)
| Variable | Por defecto | Descripción |
|---|---|---|
POSTGRES_HOST | localhost | Host de la base de datos primaria |
POSTGRES_PORT | 5432 | Puerto de la base de datos primaria |
POSTGRES_USER | matcher | Nombre de usuario |
POSTGRES_PASSWORD | matcher_dev_password | Contraseña |
POSTGRES_DB | matcher | Nombre de la base de datos |
POSTGRES_SSLMODE | disable | Modo SSL |
POSTGRES_TLS_REQUIRED | false | Exigir TLS en el bootstrap |
POSTGRES_MAX_OPEN_CONNS | 25 | Máximo de conexiones abiertas |
POSTGRES_MAX_IDLE_CONNS | 5 | Máximo de conexiones inactivas |
POSTGRES_CONN_MAX_LIFETIME_MINS | 30 | Tiempo máximo de vida de la conexión (minutos) |
POSTGRES_CONN_MAX_IDLE_TIME_MINS | 5 | Tiempo máximo inactivo de la conexión (minutos) |
POSTGRES_CONNECT_TIMEOUT_SEC | 10 | Timeout de conexión (segundos) |
POSTGRES_QUERY_TIMEOUT_SEC | 30 | Timeout de consulta (segundos) |
MIGRATIONS_PATH | migrations | Ruta de archivos de migración |
Réplica de base de datos (PostgreSQL)
| Variable | Por defecto | Descripción |
|---|---|---|
POSTGRES_REPLICA_HOST | — | Host de la réplica |
POSTGRES_REPLICA_PORT | — | Puerto de la réplica |
POSTGRES_REPLICA_USER | — | Usuario de la réplica |
POSTGRES_REPLICA_PASSWORD | — | Contraseña de la réplica |
POSTGRES_REPLICA_DB | — | Nombre de la base de datos réplica |
POSTGRES_REPLICA_SSLMODE | — | Modo SSL de la réplica |
POSTGRES_REPLICA_TLS_REQUIRED | false | Exigir TLS para la réplica |
Caché (Redis)
| Variable | Por defecto | Descripción |
|---|---|---|
REDIS_HOST | localhost:6379 | Dirección de Redis (host:puerto) |
REDIS_MASTER_NAME | — | Nombre del master Sentinel |
REDIS_PASSWORD | — | Contraseña |
REDIS_DB | 0 | Índice de base de datos |
REDIS_PROTOCOL | 3 | Versión del protocolo RESP |
REDIS_TLS | false | Habilitar TLS |
REDIS_TLS_REQUIRED | false | Exigir TLS en el bootstrap |
REDIS_CA_CERT | — | Ruta del certificado CA |
REDIS_POOL_SIZE | 10 | Tamaño del pool de conexiones |
REDIS_MIN_IDLE_CONNS | 2 | Mínimo de conexiones inactivas |
REDIS_READ_TIMEOUT_MS | 3000 | Timeout de lectura (milisegundos) |
REDIS_WRITE_TIMEOUT_MS | 3000 | Timeout de escritura (milisegundos) |
REDIS_DIAL_TIMEOUT_MS | 5000 | Timeout de conexión (milisegundos) |
Mensajería (RabbitMQ)
| Variable | Por defecto | Descripción |
|---|---|---|
RABBITMQ_URI | amqp | Esquema URI (amqp o amqps) |
RABBITMQ_HOST | localhost | Host del broker |
RABBITMQ_PORT | 5672 | Puerto del broker |
RABBITMQ_USER | matcher_admin | Nombre de usuario |
RABBITMQ_PASSWORD | matcher_dev_password | Contraseña |
RABBITMQ_VHOST | / | Host virtual |
RABBITMQ_HEALTH_URL | http://localhost:15672 | URL de la API de gestión para health checks |
RABBITMQ_ALLOW_INSECURE_HEALTH_CHECK | false | Permitir health check HTTP (sin TLS) |
RABBITMQ_TLS_REQUIRED | false | Exigir TLS en el bootstrap |
Autenticación
| Variable | Por defecto | Descripción |
|---|---|---|
PLUGIN_AUTH_ENABLED | false | Habilitar autenticación |
PLUGIN_AUTH_ADDRESS | — | URL del servicio de autenticación |
AUTH_JWT_SECRET | — | Secreto de firma JWT |
Almacenamiento de objetos (compatible con S3)
| Variable | Por defecto | Descripción |
|---|---|---|
OBJECT_STORAGE_ENDPOINT | http://localhost:8333 | URL del endpoint S3 |
OBJECT_STORAGE_REGION | us-east-1 | Región S3 |
OBJECT_STORAGE_BUCKET | matcher-exports | Bucket para exportaciones |
OBJECT_STORAGE_ACCESS_KEY_ID | — | ID de clave de acceso |
OBJECT_STORAGE_SECRET_ACCESS_KEY | — | Clave de acceso secreta |
OBJECT_STORAGE_USE_PATH_STYLE | true | Usar direccionamiento path-style |
OBJECT_STORAGE_ALLOW_INSECURE_ENDPOINT | false | Permitir endpoint HTTP (sin TLS) |
OBJECT_STORAGE_TLS_REQUIRED | false | Exigir TLS en el bootstrap |
Observabilidad
| Variable | Por defecto | Descripción |
|---|---|---|
ENABLE_TELEMETRY | false | Habilitar OpenTelemetry |
OTEL_RESOURCE_SERVICE_NAME | matcher | Nombre del servicio para trazas/métricas |
OTEL_LIBRARY_NAME | github.com/LerianStudio/matcher | Nombre de la biblioteca de instrumentación |
OTEL_RESOURCE_SERVICE_VERSION | 1.1.0 | Versión del servicio |
OTEL_RESOURCE_DEPLOYMENT_ENVIRONMENT | development | Etiqueta del entorno de despliegue |
OTEL_EXPORTER_OTLP_ENDPOINT | localhost:4317 | Endpoint del colector OTLP |
DB_METRICS_INTERVAL_SEC | 15 | Intervalo de recolección de métricas de DB |
TLS
| Variable | Por defecto | Descripción |
|---|---|---|
SERVER_TLS_CERT_FILE | — | Ruta del certificado TLS |
SERVER_TLS_KEY_FILE | — | Ruta de la clave privada TLS |
TLS_TERMINATED_UPSTREAM | false | Confiar en terminación TLS upstream (ej: load balancer) |
TRUSTED_PROXIES | — | Rangos CIDR de proxies de confianza |
Limitación de tasa
| Variable | Por defecto | Descripción |
|---|---|---|
RATE_LIMIT_ENABLED | true | Habilitar limitación de tasa global |
RATE_LIMIT_MAX | 100 | Máximo de solicitudes por ventana |
RATE_LIMIT_EXPIRY_SEC | 60 | Ventana de limitación de tasa (segundos) |
EXPORT_RATE_LIMIT_MAX | 10 | Máximo de solicitudes de exportación por ventana |
EXPORT_RATE_LIMIT_EXPIRY_SEC | 60 | Ventana de limitación de exportación (segundos) |
DISPATCH_RATE_LIMIT_MAX | 50 | Máximo de solicitudes de despacho por ventana |
DISPATCH_RATE_LIMIT_EXPIRY_SEC | 60 | Ventana de limitación de despacho (segundos) |
ADMIN_RATE_LIMIT_MAX | 30 | Máximo de solicitudes admin por ventana |
ADMIN_RATE_LIMIT_EXPIRY_SEC | 60 | Ventana de limitación admin (segundos) |
Swagger
| Variable | Por defecto | Descripción |
|---|---|---|
SWAGGER_ENABLED | false | Habilitar Swagger UI |
SWAGGER_HOST | — | Sobrescribir host de la spec de Swagger |
SWAGGER_SCHEMES | https | Esquemas de la spec de Swagger (separados por coma) |
Idempotencia
| Variable | Por defecto | Descripción |
|---|---|---|
IDEMPOTENCY_RETRY_WINDOW_SEC | 300 | Ventana para reintentar solicitudes idempotentes fallidas (segundos) |
IDEMPOTENCY_SUCCESS_TTL_HOURS | 168 | Tiempo de caché de claves de idempotencia completadas (horas) |
IDEMPOTENCY_HMAC_SECRET | — | Secreto HMAC para firmar claves de idempotencia (mín 32 bytes) |
Deduplicación
| Variable | Por defecto | Descripción |
|---|---|---|
DEDUPE_TTL_SEC | 3600 | TTL de claves de deduplicación (segundos) |
Outbox
| Variable | Por defecto | Descripción |
|---|---|---|
OUTBOX_RETRY_WINDOW_SEC | 300 | Enfriamiento antes de reintentar eventos fallidos (segundos) |
OUTBOX_DISPATCH_INTERVAL_SEC | 2 | Intervalo de polling del dispatcher (segundos) |
Workers
| Variable | Por defecto | Descripción |
|---|---|---|
EXPORT_WORKER_ENABLED | true | Habilitar worker de exportación |
EXPORT_WORKER_POLL_INTERVAL_SEC | 5 | Intervalo de polling del worker de exportación (segundos) |
EXPORT_WORKER_PAGE_SIZE | 1000 | Filas por página de exportación |
EXPORT_PRESIGN_EXPIRY_SEC | 3600 | Expiración de URL pre-firmada para exportaciones (segundos) |
CLEANUP_WORKER_ENABLED | true | Habilitar worker de limpieza |
CLEANUP_WORKER_INTERVAL_SEC | 3600 | Intervalo del worker de limpieza (segundos) |
CLEANUP_WORKER_BATCH_SIZE | 100 | Tamaño del lote de limpieza |
CLEANUP_WORKER_GRACE_PERIOD_SEC | 3600 | Período de gracia antes de la limpieza (segundos) |
WEBHOOK_TIMEOUT_SEC | 30 | Timeout de despacho de webhook (segundos) |
CALLBACK_RATE_LIMIT_PER_MIN | 60 | Máximo de callbacks por sistema externo por minuto |
Programador
| Variable | Por defecto | Descripción |
|---|---|---|
SCHEDULER_INTERVAL_SEC | 60 | Intervalo de polling del programador cron (segundos) |
Archivado
| Variable | Por defecto | Descripción |
|---|---|---|
ARCHIVAL_WORKER_ENABLED | false | Habilitar worker de archivado de logs de auditoría |
ARCHIVAL_WORKER_INTERVAL_HOURS | 24 | Intervalo de ejecución del archivado (horas) |
ARCHIVAL_HOT_RETENTION_DAYS | 90 | Días para mantener datos en almacenamiento caliente |
ARCHIVAL_WARM_RETENTION_MONTHS | 24 | Meses para mantener datos en almacenamiento tibio |
ARCHIVAL_COLD_RETENTION_MONTHS | 84 | Meses para mantener datos en almacenamiento frío |
ARCHIVAL_BATCH_SIZE | 5000 | Filas por lote de archivado |
ARCHIVAL_STORAGE_BUCKET | matcher-archives | Bucket S3 para archivos |
ARCHIVAL_STORAGE_PREFIX | archives/audit-logs | Prefijo de clave S3 para archivos |
ARCHIVAL_STORAGE_CLASS | GLACIER | Clase de almacenamiento S3 para archivos |
ARCHIVAL_PARTITION_LOOKAHEAD | 3 | Cantidad de particiones anticipadas |
ARCHIVAL_PRESIGN_EXPIRY_SEC | 3600 | Expiració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.| Variable | Por defecto | Descripción |
|---|---|---|
FETCHER_ENABLED | false | Habilitar discovery con Fetcher |
FETCHER_URL | http://localhost:4006 | URL del servicio Fetcher |
FETCHER_ALLOW_PRIVATE_IPS | false | Permitir rangos de IP privados |
FETCHER_HEALTH_TIMEOUT_SEC | 5 | Timeout del health check del Fetcher (segundos) |
FETCHER_REQUEST_TIMEOUT_SEC | 30 | Timeout de solicitud al Fetcher (segundos) |
FETCHER_DISCOVERY_INTERVAL_SEC | 60 | Intervalo de polling de discovery (segundos) |
FETCHER_SCHEMA_CACHE_TTL_SEC | 300 | TTL del caché de schema (segundos) |
FETCHER_EXTRACTION_POLL_INTERVAL_SEC | 5 | Intervalo de polling de extracción (segundos) |
FETCHER_EXTRACTION_TIMEOUT_SEC | 600 | Timeout de extracción (segundos) |
FETCHER_MAX_EXTRACTION_BYTES | 2147483648 | Tamaño máximo del payload de extracción (bytes, 2 GiB por defecto) |
FETCHER_BRIDGE_INTERVAL_SEC | 30 | Intervalo de polling del bridge worker (segundos) |
FETCHER_BRIDGE_BATCH_SIZE | 50 | Extracciones por tenant por ciclo de bridge |
FETCHER_BRIDGE_TENANT_CONCURRENCY | 4 | Tenants concurrentes en el ciclo de bridge |
FETCHER_BRIDGE_STALE_THRESHOLD_SEC | 3600 | Umbral de extracción obsoleta (segundos) |
FETCHER_BRIDGE_RETRY_MAX_ATTEMPTS | 5 | Máximo de reintentos por extracción |
FETCHER_CUSTODY_RETENTION_SWEEP_INTERVAL_SEC | 900 | Intervalo de barrido de custodia (segundos) |
FETCHER_CUSTODY_RETENTION_GRACE_PERIOD_SEC | 3600 | Período de gracia antes de eliminar custodia (segundos) |
APP_ENC_KEY | — | Clave maestra codificada en Base64 compartida con Fetcher |
Credenciales M2M
| Variable | Por defecto | Descripción |
|---|---|---|
M2M_TARGET_SERVICE | fetcher | Nombre del servicio destino para búsqueda de credenciales |
M2M_CREDENTIAL_CACHE_TTL_SEC | 300 | TTL del caché Redis para credenciales M2M (segundos) |
AWS_REGION | — | Región AWS para Secrets Manager |
Infraestructura
| Variable | Por defecto | Descripción |
|---|---|---|
INFRA_CONNECT_TIMEOUT_SEC | 30 | Timeout de conexión de infraestructura en el inicio (segundos) |
HEALTH_CHECK_TIMEOUT_SEC | 5 | Timeout legado por verificación (segundos) |
HEALTH_CHECK_TIMEOUT_MS | 800 | Timeout 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:
Solución de problemas
Problemas comunes
Conexión rechazada a PostgreSQL
Conexión rechazada a PostgreSQL
- Causa: PostgreSQL no está ejecutándose o no es accesible.
- Resolución:
- Verifica que PostgreSQL esté ejecutándose:
docker-compose ps postgres - Revisa los valores de conexión en
.env - Prueba la conectividad:
nc -zv localhost 5432 - Revisa los logs:
docker-compose logs postgres
Tiempo de espera de conexión a Redis
Tiempo de espera de conexión a Redis
- Causa: Redis no está ejecutándose o las credenciales son incorrectas.
- Resolución:
- Verifica que Redis esté ejecutándose:
docker-compose ps redis - Confirma
REDIS_PASSWORD - Prueba la conectividad:
redis-cli -h localhost ping
Colas de RabbitMQ no creadas
Colas de RabbitMQ no creadas
- Causa: RabbitMQ todavía está inicializando o falta el host virtual.
- Resolución:
- Espera hasta que RabbitMQ esté saludable
- Accede a la interfaz de gestión en http://localhost:15672
- Verifica
RABBITMQ_VHOST
Errores de autenticación
Errores de autenticación
- Causa: El servicio de autenticación no es accesible o el token es inválido.
- Resolución:
- Verifica
PLUGIN_AUTH_ADDRESS - Deshabilita la autenticación para desarrollo:
PLUGIN_AUTH_ENABLED=false - Revisa los logs del servicio de autenticación
Migración fallida
Migración fallida
- Causa: Las migraciones de base de datos no pudieron aplicarse.
- Resolución:
- Verifica el estado de migración:
make migrate-status - Revisa los logs de migración
- Aplica las migraciones manualmente:
make migrate-up - Inspecciona la tabla
schema_migrationssi es necesario
Errores de migración de base de datos al actualizar desde main
Errores de migración de base de datos al actualizar desde main
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
Modo de depuración
Habilita el logging de depuración para mayor visibilidad:Próximos pasos
Inicio rápido
Ejecuta tu primera conciliación.
Configuración
Configura contextos, fuentes y reglas de conciliación.

