configName de la conexión, nunca por su host.
Fetcher es dueño de la credencial desde el momento en que llega. Cifra la contraseña antes de almacenarla y nunca la devuelve.
Qué guarda una conexión
El Manager rechaza un modo TLS inválido para el tipo declarado. Cada driver de base de datos acepta un conjunto distinto de modos, y Fetcher valida el modo contra el tipo antes de almacenar el registro.
Ciclo de vida
1
Crear
POST /v1/management/connections con el cuerpo de la conexión y una cabecera X-Product-Name. La cabecera nombra el producto que es dueño de la conexión. Una creación exitosa responde 201 Created.2
Probar
POST /v1/management/connections/{id}/test abre una conexión real al datasource y reporta la latencia de ida y vuelta. Ejecútalo antes de que cualquier job dependa de la conexión.3
Descubrir
GET /v1/management/connections/{id}/schema devuelve las tablas y los campos que Fetcher encuentra en el datasource en vivo. Consulta Descubrimiento de esquemas.4
Usar
Referencia la conexión por su
configName en el mapa mappedFields de un job de extracción.5
Actualizar o eliminar
PATCH aplica una actualización parcial y deja intactos los campos omitidos. DELETE es una eliminación lógica: el registro conserva una marca de tiempo de eliminación. Ambas operaciones responden 409 Conflict mientras aún corren jobs contra la conexión.Credenciales cifradas
Fetcher deriva cuatro claves independientes de la única clave maestra
APP_ENC_KEY, mediante HKDF-SHA256. Una de esas claves protege las credenciales de datasource.
La contraseña llega al almacenamiento cifrada con AES-256-GCM, y el registro almacenado conserva el APP_ENC_KEY_VERSION que la protegió. Esa versión es lo que hace tratable la rotación de claves: un registro declara qué clave lo abre.
La versión de clave vacía tiene significado. Marca un datasource interno — uno que un operador declara mediante variables de entorno DATASOURCE_{NAME}_* en lugar de la API. Fetcher construye esas conexiones en memoria al arrancar y no guarda ningún registro de ellas en reposo. El gestor de secretos del propio operador es el dueño de la credencial. Consulta Configuración.
Probar una conexión
La operación de prueba hace trabajo real. Construye el conector, abre el datasource, ejecuta la verificación de conectividad propia del driver y cierra el conector en todos los casos — con éxito o con fallo. La respuesta lleva
latencyMs, la ida y vuelta observada en milisegundos. Úsalo como señal sobre el camino de red entre Fetcher y el datasource, no como benchmark de la base de datos.
El endpoint tiene un límite de tasa de 10 pruebas por minuto por conexión. Un llamador que pasa ese presupuesto recibe 429 Too Many Requests con una indicación de espera. El límite vive en el Manager, no en el Engine, así que un host embebido define su propia política.
Una prueba fallida te dice que la conexión falló. No te dice por qué en términos del driver. Fetcher descarta el error subyacente, porque ese texto puede llevar un DSN o una credencial.
El 409 con jobs activos
La regla existe para mantener una extracción en curso consistente con la conexión contra la que planificó. Un cambio de host o de credencial a mitad de la extracción dejaría a un job leyendo de un datasource que nadie pidió. El Engine aplica la barrera mediante un puerto opcional, no mediante una dependencia dura del almacenamiento de jobs. El Manager responde la pregunta desde su repositorio de jobs. Un host embebido la responde como sea que lleve el registro del trabajo — un conjunto en memoria, un lock distribuido o un “no” fijo. Un host que no provee nada no obtiene barrera, y las mutaciones siguen adelante.
Seguridad de host en modo multi-tenant
Con
MULTI_TENANT_ENABLED=true, Fetcher valida el host de cada conexión provista por un tenant antes de marcar. La validación corre en dos capas:
- Al parsear la solicitud, una verificación sin DNS rechaza de plano una IP literal bloqueada.
- En la fábrica de datasources, una verificación con resolución rechaza los hostnames bloqueados como
localhosty los nombres de metadatos de nube, y después rechaza toda dirección a la que resuelva el hostname.
400.
Un fallo de resolución DNS deliberadamente no es un bloqueo. Convertir “no resuelve” en un rechazo construiría un oráculo de reconocimiento y haría fallar conexiones legítimas durante un problema transitorio de DNS. En su lugar, el driver expone su propio error de conexión.
Operaciones de migración
Existen dos operaciones solo para conexiones anteriores al alcance por producto:
GET /v1/management/connections/unassignedlista las conexiones sin producto.POST /v1/management/connections/{id}/assignasocia una al producto de la cabeceraX-Product-Name.
Próximos pasos
Descubrimiento de esquemas
Lee el esquema de un datasource, guárdalo en caché y valida un job contra él.
Arquitectura
El Manager, el Worker y el Engine que ambos ejecutan.

