Fly
Connect Hyperdrive to a Fly Postgres database instance.
This example shows you how to connect Hyperdrive to a Fly Postgres database instance.
You can connect Hyperdrive to any existing Fly database by:
- Allocating a public IP address to your Fly database instance
- Configuring an external service
- Deploying the configuration
- Obtain the connection string, which is used to connect the database to Hyperdrive.
-
Run the following command to allocate a public IP address ↗.
fly ips allocate-v6 --app <pg-app-name> -
Configure an external service ↗ by modifying the contents of your
fly.toml
file. Run the following command to download thefly.toml
file.fly config save --app <pg-app-name>Then, replace the
services
andservices.ports
section of the file with the followingtoml
snippet:[[services]]internal_port = 5432 # Postgres instanceprotocol = "tcp"[[services.ports]]handlers = ["pg_tls"]port = 5432 -
Obtain the connection string ↗, which is in the form of:
postgres://{username}:{password}@{public-hostname}:{port}/{database}?options
To configure Hyperdrive, you will need:
- The IP address (or hostname) and port of your database.
- The database username (for example,
hyperdrive-demo
) you configured in a previous step. - The password associated with that username.
- The name of the database you want Hyperdrive to connect to. For example,
postgres
.
Hyperdrive accepts the combination of these parameters in the common connection string format used by database drivers:
postgres://USERNAME:PASSWORD@HOSTNAME_OR_IP_ADDRESS:PORT/database_name
Most database providers will provide a connection string you can directly copy-and-paste directly into Hyperdrive.
To create a Hyperdrive configuration with the Wrangler CLI, open your terminal and run the following command. Replace <NAME_OF_HYPERDRIVE_CONFIG> with a name for your Hyperdrive configuration and paste the connection string provided from your database host, or replace user
, password
, HOSTNAME_OR_IP_ADDRESS
, port
, and database_name
placeholders with those specific to your database:
npx wrangler hyperdrive create <NAME_OF_HYPERDRIVE_CONFIG> --connection-string="postgres://user:password@HOSTNAME_OR_IP_ADDRESS:PORT/database_name"
This command outputs a binding for the Wrangler configuration file:
{ "name": "hyperdrive-example", "main": "src/index.ts", "compatibility_date": "2024-08-21", "compatibility_flags": [ "nodejs_compat" ], "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<ID OF THE CREATED HYPERDRIVE CONFIGURATION>" } ]}
name = "hyperdrive-example"main = "src/index.ts"compatibility_date = "2024-08-21"compatibility_flags = ["nodejs_compat"]
# Pasted from the output of `wrangler hyperdrive create <NAME_OF_HYPERDRIVE_CONFIG> --connection-string=[...]` above.[[hyperdrive]]binding = "HYPERDRIVE"id = "<ID OF THE CREATED HYPERDRIVE CONFIGURATION>"
Install Postgres.js ↗:
npm i postgres@>3.4.5
yarn add postgres@>3.4.5
pnpm add postgres@>3.4.5
Add the required Node.js compatibility flags and Hyperdrive binding to your wrangler.jsonc
file:
{ "compatibility_flags": [ "nodejs_compat" ], "compatibility_date": "2024-09-23", "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<your-hyperdrive-id-here>" } ]}
# required for database drivers to functioncompatibility_flags = ["nodejs_compat"]compatibility_date = "2024-09-23"
[[hyperdrive]]binding = "HYPERDRIVE"id = "<your-hyperdrive-id-here>"
Create a Worker that connects to your PostgreSQL database via Hyperdrive:
// filepath: src/index.tsimport postgres from "postgres";
export default { async fetch( request: Request, env: Env, ctx: ExecutionContext, ): Promise<Response> { // Create a database client that connects to your database via Hyperdrive // using the Hyperdrive credentials const sql = postgres(env.HYPERDRIVE.connectionString, { // Limit the connections for the Worker request to 5 due to Workers' limits on concurrent external connections max: 5, // If you are not using array types in your Postgres schema, disable `fetch_types` to avoid an additional round-trip (unnecessary latency) fetch_types: false, });
try { // A very simple test query const result = await sql`select * from pg_tables`;
// Clean up the client, ensuring we don't kill the worker before that is // completed. ctx.waitUntil(sql.end());
// Return result rows as JSON return Response.json({ success: true, result: result }); } catch (e: any) { console.error("Database error:", e.message);
return Response.error(); } },} satisfies ExportedHandler<Env>;
- Learn more about How Hyperdrive Works.
- Refer to the troubleshooting guide to debug common issues.
- Understand more about other storage options available to Cloudflare Workers.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Products
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark