Connection-Strings
Format, TLS, Rollen- und Passwortregeln für Kisenon-Endpoints.
Jeder Kisenon-Endpoint stellt eine standardmäßige postgresql://-URI bereit:
postgresql://<role>:<pwd>@<endpoint_id>.<region>.kisenon.com:5432/<database>?sslmode=requireKomponenten
| Feld | Bedeutung |
|---|---|
<role> | Eine auf dem Branch erstellte Postgres-Rolle. Die Endpoint-Karte zeigt die automatisch erstellte app-Rolle; weitere können Sie via SQL erstellen. |
<pwd> | Das Passwort der Rolle. Bei der Erstellung einmal angezeigt; via SQL rotieren. |
<endpoint_id> | Pro Endpoint stabil, z. B. 5e0c7d1a-8b2f-4e36-9a41-c7d2e8f03b15. SNI-geroutet. |
<region> | Das Regions-Slug Ihres Projekts — heute usc1 (US Central, GCP). Abgeleitet, nicht hartcodiert; siehe Regions. |
kisenon.com | Der Data-Plane-Apex. Routet via TLS-SNI zu Ihrem Endpoint. |
5432 | Standard-Postgres-Port. |
<database> | Standard main; weitere mit CREATE DATABASE erstellen. |
?sslmode=require | TLS ist obligatorisch. require verschlüsselt, aber die meisten Treiber prüfen damit das Serverzertifikat nicht — siehe Das Serverzertifikat verifizieren. |
TLS
Endpoints terminieren TLS mit einem Let's-Encrypt-Zertifikat für
*.<region>.kisenon.com, daher ist keine eigene CA nötig.
Der Connection-String, den Kisenon ausgibt — das Format Connection string
in der Konsole, keon connection-string und die API — verwendet
sslmode=require. Die Verbindung ist verschlüsselt, aber unter require
prüfen die meisten Treiber das Serverzertifikat nicht. Er bleibt der Standard,
weil es der einzige Wert ist, den jeder Treiber akzeptiert.
Das Serverzertifikat verifizieren
Damit Ihr Treiber die Zertifikatskette und den Hostnamen prüft, verwenden Sie die Parameter für Ihren Treiber. Die treiberspezifischen Formate der Konsole tun das bereits.
| Treiber | Parameter |
|---|---|
psql und andere libpq-Tools (libpq 16+) | sslmode=verify-full&sslrootcert=system |
| Python: psycopg 3, psycopg2, SQLAlchemy, Django | sslmode=verify-full&sslrootcert=system (siehe Binary Wheels unten) |
Node.js: pg, Drizzle, postgres.js | sslmode=verify-full |
| Prisma 6 und 7 | sslmode=verify-full&sslaccept=strict |
| Go: pgx v5.7.0+, lib/pq v1.12.0+ | sslmode=verify-full&sslrootcert=system |
| Go: ältere pgx- oder lib/pq-Versionen | sslmode=verify-full |
| Java: JDBC, Spring | sslmode=verify-full&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory |
| .NET: Npgsql, EF Core | SSL Mode=VerifyFull |
@kisenon/serverless | Nichts hinzuzufügen: Es verbindet sich über HTTPS/WebSocket und ignoriert sslmode. |
Typische Stolperfallen:
- libpq älter als 16 versteht
sslrootcert=systemnicht. Verwenden Sie dort bewusstsslmode=requireals Fallback: verschlüsselt, nicht verifiziert. - Geben Sie einem Node.js-Treiber nie
sslrootcert=system.pg(und Prisma 7, das es verwendet) versucht, eine Datei namenssystemzu lesen, und scheitert; postgres.js schickt den Parameter an den Server, der die Verbindung ablehnt. - Python Binary Wheels (
psycopg[binary],psycopg2-binary) bringen ihr eigenes OpenSSL mit, dessen System-Trust-Store leer ist, daher scheitertsslrootcert=systemmitcertificate verify failed. Verweisen Sie mitSSL_CERT_FILEauf das Zertifikatsbündel Ihres Betriebssystems — unter Debian/UbuntuSSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt. Auf anderen Systemen ist der Pfad ein anderer. - Windows hat keinen PEM-Zertifikatsspeicher, daher scheitert
sslrootcert=systemin jedem libpq-basierten Client —psql, psycopg, das Ruby-Gempg— mitcertificate verify failed. Geben Siesslrootcertstattdessen eine CA-Bundle-Datei. In Python mit certifi:pip install certifi, dannsslrootcert=certifi.where()(funktioniert auf jedem Betriebssystem, deshalb nutzen es die Python-Formate der Konsole). Fürpsqloder Rails das Mozilla-Bundle vonhttps://curl.se/ca/cacert.pemherunterladen und den Pfad übergeben:sslrootcert=C:\certs\cacert.pem. - Prisma 6 prüft das Zertifikat nicht, solange
sslaccept=strictnicht gesetzt ist, egal wassslmodesagt. - postgres.js prüft das Zertifikat unter
sslmode=requirenicht. - JDBC sucht mit bloßem
sslmode=verify-fullnach~/.postgresql/root.crt;sslfactory=org.postgresql.ssl.DefaultJavaSSLFactorylässt es stattdessen den Trust-Store der JVM verwenden.
Wie der Proxy zu Ihrem Endpoint routet
Der Data-Plane-Proxy entscheidet anhand von zwei Signalen, in dieser Reihenfolge, zu welchem Endpoint eine Verbindung gehört:
- Die
neon.endpoint_id-Startup-Option, falls der Client eine sendet. - Der TLS-SNI-Hostname (
<endpoint_id>.<region>.kisenon.com) als Fallback.
Das Username-Feld wird für das Routing nicht konsultiert — wählen Sie eine beliebige Rolle, die Ihr Branch definiert. Von der Konsole generierte Connection-Strings tragen den Endpoint im Hostnamen, sodass sie automatisch via SNI routen und Sie nichts Zusätzliches festlegen müssen.
Geben Sie neon.endpoint_id nur explizit an, wenn Ihr Client den
Endpoint nicht in SNI vorlegen kann — zum Beispiel ein TLS-Stack, der keine Server-
Name-Erweiterung sendet, oder ein Tunnel, der den Host umschreibt. Die meisten Postgres-
Treiber senden SNI standardmäßig, sodass dies selten benötigt wird.
Connection-Pooling
Pooling ist GA und standardmäßig aktiviert — jeder Endpoint hat einen gepoolten Host neben seinem direkten (seit 2026-07-18).
Der gepoolte Host ist <endpoint_id>-pooler.<region>.kisenon.com — derselbe
Endpoint, mit -pooler eingefügt in das Host-Label — auf Port 5432
mit sslmode=require:
postgresql://<role>:<pwd>@<endpoint_id>-pooler.<region>.kisenon.com:5432/<database>?sslmode=requireDas Connect-Panel der Konsole und die API-Antwort reichen Ihnen beide einen
connection_uri_pooled neben dem direkten connection_uri.
Der Pooler läuft im Transaction-Pooling-Modus (ein PgBouncer-Sidecar pro Compute). Das ist ideal für viele kurzlebige Verbindungen — serverlose Funktionen, Edge-Runtimes, Agenten — wo jede Transaktion sich eine Server-Verbindung leihen und sofort zurückgeben kann.
Verwenden Sie stattdessen die direkte (ungepoolte :5432) Verbindung, wenn Sie brauchen:
LISTEN/NOTIFY.- Session-Level-Advisory-Locks.
- Session-
SET/ GUCs, die eine einzelne Transaktion überdauern müssen. - Serverseitige Prepared Statements.
Der direkte connection_uri ist immer verfügbar und wird nie entfernt, sodass
diese genau wie zuvor weiter funktionieren. Ein clientseitiger Pool (PgBouncer oder
der eingebaute Pool Ihres Treibers) vor der direkten Verbindung bleibt ebenfalls
gültig.
Nehmen Sie einen Endpoint vom Pooling aus mit dem pooler_enabled: false-Feld zur
Erstellungszeit oder via PATCH /v1/endpoints/{endpointId}. Der Standard ist
true.
Mehrere Endpoints
Sie können mehrere Endpoints auf demselben Branch erzeugen. Sie teilen sich den Speicher, haben aber unabhängige Verbindungslimits und Caches. Verwenden Sie sie zur Isolation:
- App- vs. Analytik-Traffic.
- Read-Replicas (jeder Endpoint auf einem Branch ist im Wesentlichen eine Read-Replica, wenn Sie nicht in ihn schreiben).
- Pro-Umgebung-Endpoints auf Dev-Branches.