Deploy to Cloudflare Workers & Pages
This page covers everything you need to know to deploy an app with Prisma ORM to a Cloudflare Worker or to Cloudflare Pages.
General considerations when deploying to Cloudflare Workers
This section covers general things you need to be aware of when deploying to Cloudflare Workers or Pages and are using Prisma ORM, regardless of the database provider you use.
Using an edge-compatible driver
When deploying a Cloudflare Worker that uses Prisma ORM, you need to use an edge-compatible driver and its respective driver adapter for Prisma ORM.
The edge-compatible drivers for Cloudflare Workers and Pages are:
- Neon Serverless uses HTTP to access the database
- PlanetScale Serverless uses HTTP to access the database
node-postgres
(pg
) uses Cloudflare'sconnect()
(TCP) to access the database@libsql/client
is used to access Turso databases via HTTP- Cloudflare D1 is used to access D1 databases
There's also work being done on the node-mysql2
driver which will enable access to traditional MySQL databases from Cloudflare Workers and Pages in the future as well.
Note: Prisma Accelerate enables you to access any database from any edge function provider. No edge-compatible driver is necessary.
Setting your database connection URL as an environment variable
First, ensure that the DATABASE_URL
is set as the url
of the datasource
in your Prisma schema:
datasource db {
provider = "postgresql" // this might also be `mysql` or another value depending on your database
url = env("DATABASE_URL")
}
Development
When using your Worker in development, you can configure your database connection via the .dev.vars
file locally.
Assuming you use the DATABASE_URL
environment variable from above, you can set it inside .dev.vars
as follows:
DATABASE_URL="your-database-connection-string"
In the above snippet, your-database-connection-string
is a placeholder that you need to replace with the value of your own connection string, for example:
DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb"
Note that the .dev.vars
file is not compatible with .env
files which are typically used by Prisma ORM.
This means that you need to make sure that Prisma ORM gets access to the environment variable when needed, e.g. when running a Prisma CLI command like prisma migrate dev
.
There are several options for achieving this:
- Run your Prisma CLI commands using
dotenv
to specify from where the CLI should read the environment variable, for example:dotenv -e .dev.vars -- npx prisma migrate dev
- Create a script in
package.json
that reads.dev.vars
viadotenv
. You can then executeprisma
commands as follows:npm run env -- npx prisma migrate dev
. Here's a reference for the script:package.json"scripts": { "env": "dotenv -e .dev.vars" }
- Duplicate the
DATABASE_URL
and any other relevant env vars into a new file called.env
which can then be used by Prisma ORM.
Note: If you're using an approach that requires
dotenv
, you need to have thedotenv-cli
package installed. You can do this e.g. by using this command to install the package locally in your project:npm install -D dotenv-cli
.
Production
When deploying your Worker to production, you'll need to set the database connection using the wrangler
CLI:
npx wrangler secret put DATABASE_URL
The command is interactive and will ask you to enter the value for the DATABASE_URL
env var as the next step in the terminal.
Note: This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not.
Size limits on free accounts
Cloudflare has a size limit of 3 MB for Workers on the free plan. If your application bundle with Prisma ORM exceeds that size, we recommend upgrading to a paid Worker plan or using Prisma Accelerate to deploy your application.
If you're running into this problem with pg
and the @prisma/adapter-pg
package, you can replace the pg
with the custom @prisma/pg-worker
package and use the @prisma/adapter-pg-worker
adapter that belongs to it.
@prisma/pg-worker
is an optimized and lightweight version of pg
that is designed to be used in a Worker. It is a drop-in replacement for pg
and is fully compatible with Prisma ORM.
Deploying a Next.js app to Cloudflare Pages with @cloudflare/next-on-pages
Cloudflare offers an option to run Next.js apps on Cloudflare Pages with @cloudflare/next-on-pages
, see the docs for instructions.
Based on some testing, we found the following:
- You can deploy using the PlanetScale or Neon Serverless Driver.
- Traditional PostgreSQL deployments using
pg
don't work becausepg
itself currently does not work with@cloudflare/next-on-pages
(see here).
Feel free to reach out to us on Discord if you find that anything has changed about this.
Set PRISMA_CLIENT_FORCE_WASM=1
when running locally with node
Some frameworks (e.g. hono) use node
instead of wrangler
for running Workers locally. If you're using such a framework or are running your Worker locally with node
for another reason, you need to set the PRISMA_CLIENT_FORCE_WASM
environment variable:
export PRISMA_CLIENT_FORCE_WASM=1