Cadenas de conexión
Formato, TLS, reglas de rol y contraseña para los endpoints de Kisenon.
Cada endpoint de Kisenon expone una URI postgresql:// estándar:
postgresql://<role>:<pwd>@<endpoint_id>.<region>.kisenon.com:5432/<database>?sslmode=requireComponentes
| Campo | Significado |
|---|---|
<role> | Un rol de Postgres creado en la rama. La tarjeta del endpoint muestra el rol app autocreado; puedes crear más mediante SQL. |
<pwd> | La contraseña del rol. Mostrada una sola vez en su creación; rótala mediante SQL. |
<endpoint_id> | Estable por endpoint, p. ej. 5e0c7d1a-8b2f-4e36-9a41-c7d2e8f03b15. Enrutado por SNI. |
<region> | El slug de región de tu proyecto — usc1 hoy (US Central, GCP). Derivado, no codificado; consulta Regiones. |
kisenon.com | El apex del plano de datos. Enruta mediante TLS SNI a tu endpoint. |
5432 | Puerto estándar de Postgres. |
<database> | Predeterminado main; crea más con CREATE DATABASE. |
?sslmode=require | TLS es obligatorio. require cifra, pero la mayoría de los drivers no comprueban el certificado del servidor en ese modo — consulta Verificar el certificado del servidor. |
TLS
Los endpoints terminan TLS con un certificado de Let's Encrypt para
*.<region>.kisenon.com, así que no se necesita una CA personalizada.
La cadena de conexión que entrega Kisenon — el formato Connection string
de la consola, keon connection-string y la API — usa sslmode=require. La
conexión va cifrada, pero con require la mayoría de los drivers no
comprueban el certificado del servidor. Sigue siendo el valor por defecto
porque es el único que aceptan todos los drivers.
Verificar el certificado del servidor
Para que tu driver compruebe la cadena del certificado y el nombre de host, usa los parámetros de tu driver. Los formatos por driver de la consola ya lo hacen.
| Driver | Parámetros |
|---|---|
psql y otras herramientas de libpq (libpq 16+) | sslmode=verify-full&sslrootcert=system |
| Python: psycopg 3, psycopg2, SQLAlchemy, Django | sslmode=verify-full&sslrootcert=system (consulta los wheels binarios más abajo) |
Node.js: pg, Drizzle, postgres.js | sslmode=verify-full |
| Prisma 6 y 7 | sslmode=verify-full&sslaccept=strict |
| Go: pgx v5.7.0+, lib/pq v1.12.0+ | sslmode=verify-full&sslrootcert=system |
| Go: versiones anteriores de pgx o lib/pq | sslmode=verify-full |
| Java: JDBC, Spring | sslmode=verify-full&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory |
| .NET: Npgsql, EF Core | SSL Mode=VerifyFull |
@kisenon/serverless | Nada que añadir: se conecta por HTTPS/WebSocket e ignora sslmode. |
Lo que suele dar problemas:
- libpq anterior a 16 no entiende
sslrootcert=system. Usa ahísslmode=requirecomo alternativa deliberada: cifrado, sin verificar. - Nunca le pases
sslrootcert=systema un driver de Node.js.pg(y Prisma 7, que lo usa) intenta leer un archivo llamadosystemy falla; postgres.js lo envía al servidor, que rechaza la conexión. - Los wheels binarios de Python (
psycopg[binary],psycopg2-binary) incluyen su propio OpenSSL, cuyo almacén de confianza del sistema está vacío, así quesslrootcert=systemfalla concertificate verify failed. Apúntalo al bundle de tu sistema operativo conSSL_CERT_FILE— en Debian/Ubuntu,SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt. La ruta es distinta en otros sistemas. - Windows no tiene un almacén de confianza PEM, así que
sslrootcert=systemfalla concertificate verify faileden cualquier cliente basado en libpq —psql, psycopg, la gemapgde Ruby. Apuntasslrootcerta un archivo de CA. Desde Python, usa certifi:pip install certifiy luegosslrootcert=certifi.where()(funciona en cualquier sistema operativo; por eso lo usan los formatos Python de la consola). Parapsqlo Rails, descarga el bundle de Mozilla desdehttps://curl.se/ca/cacert.pemy pasa su ruta:sslrootcert=C:\certs\cacert.pem. - Prisma 6 no comprueba el certificado a menos que se defina
sslaccept=strict, diga lo que digasslmode. - postgres.js no comprueba el certificado con
sslmode=require. - JDBC con
sslmode=verify-fulla secas busca~/.postgresql/root.crt;sslfactory=org.postgresql.ssl.DefaultJavaSSLFactoryhace que use el almacén de confianza de la JVM en su lugar.
Cómo el proxy enruta a tu endpoint
El proxy del plano de datos decide a qué endpoint pertenece una conexión a partir de dos señales, en orden:
- La opción de arranque
neon.endpoint_id, si el cliente envía una. - El nombre de host SNI de TLS (
<endpoint_id>.<region>.kisenon.com) como respaldo.
El campo de nombre de usuario no se consulta para el enrutamiento — elige cualquier rol que tu rama defina. Las cadenas de conexión generadas por la consola llevan el endpoint en el nombre de host, de modo que enrutan por SNI automáticamente y no necesitas configurar nada extra.
Pasa neon.endpoint_id explícitamente solo cuando tu cliente no puede presentar
el endpoint en SNI — por ejemplo una pila TLS que no envía una extensión Server
Name, o un túnel que reescribe el host. La mayoría de los controladores de Postgres
envían SNI por defecto, así que esto rara vez es necesario.
Agrupación de conexiones (pooling)
El pooling está GA y activado por defecto — cada endpoint tiene un host agrupado junto a su host directo (desde 2026-07-18).
El host agrupado es <endpoint_id>-pooler.<region>.kisenon.com — el mismo
endpoint, con -pooler insertado en la etiqueta de host — en el puerto 5432
con sslmode=require:
postgresql://<role>:<pwd>@<endpoint_id>-pooler.<region>.kisenon.com:5432/<database>?sslmode=requireEl panel Connect de la consola y la respuesta de la API te entregan ambos un
connection_uri_pooled junto al connection_uri directo.
El pooler funciona en modo de agrupación por transacción (un sidecar de PgBouncer por cómputo). Eso es ideal para muchas conexiones de corta duración — funciones serverless, runtimes edge, agentes — donde cada transacción puede tomar prestada una conexión de servidor y devolverla de inmediato.
Usa la conexión directa (sin agrupar, :5432) en su lugar cuando necesites:
LISTEN/NOTIFY.- Bloqueos consultivos a nivel de sesión.
SETde sesión / GUCs que deban sobrevivir a una sola transacción.- Sentencias preparadas del lado del servidor.
El connection_uri directo siempre está disponible y nunca se elimina, así que
estos siguen funcionando exactamente como antes. Un pool del lado del cliente (PgBouncer o
el pool integrado de tu controlador) delante de la conexión directa también
sigue siendo válido.
Excluye un endpoint del pooling con el campo pooler_enabled: false en el
momento de la creación o mediante PATCH /v1/endpoints/{endpointId}. El predeterminado es
true.
Múltiples endpoints
Puedes generar múltiples endpoints en la misma rama. Comparten almacenamiento pero tienen límites de conexión y cachés independientes. Úsalos para aislar:
- Tráfico de app vs. analítica.
- Réplicas de lectura (cualquier endpoint en una rama es esencialmente una réplica de lectura si no escribes en él).
- Endpoints por entorno en ramas de desarrollo.