EdgeDB on Fly
EdgeDB is a graph-relational database that runs on top of Postgres and is designed as a spiritual successor to SQL. This guide explains how to perform a single-region deployment of EdgeDB with persistent storage. It will require two apps: one for Postgres and one for the EdgeDB container.
Create the Postgres app
Create a Postgres app. You’ll need to replace mypostgres with a unique name of your choosing.
flyctl postgres create \
--name mypostgres \
--vm-size performance-1x \
--volume-size 10 \
--initial-cluster-size 1
Automatically selected personal organization: <Your Name>
? Select region: sea (Seattle, Washington (US))
Creating postgres cluster mypostgres in organization personal
Postgres cluster mypostgres created
Username: postgres
Password: <generated passworD>
Hostname: mypostgres.internal
Proxy Port: 5432
PG Port: 5433
Save your credentials in a secure place, you won't be able to see them again!
Create the EdgeDB app
Create a directory and create a new app. Be sure to replace myedgedb with a custom name. When prompted, pick a region and a Fly organization.
flyctl launch --name myedgedb --image edgedb/edgedb --no-deploy
Since we’re using flyctl launch, this will create a fly.toml. All flyctl commands will now be applied against our myedgedb application unless otherwise specified with --app.
EdgeDB needs more RAM than the default 256MB so let’s scale the RAM to 1024MB.
flyctl scale memory 1024
Set a password for the EdgeDB instance as a Fly secret. Keep track of this password; it won’t be visible again.
flyctl secrets set EDGEDB_PASSWORD=mysecretpassword
We need to configure a few other environment variables too.
flyctl secrets set \
EDGEDB_SERVER_BACKEND_DSN_ENV=DATABASE_URL \
EDGEDB_SERVER_TLS_CERT_MODE=generate_self_signed \
EDGEDB_SERVER_PORT=8080
Let’s discuss what’s going on with all these secrets.
EDGEDB_SERVER_BACKEND_DSN_ENVtells EdgeDB which environment variable holds the Postgres connection string.EDGEDB_SERVER_TLS_CERT_MODEtells EdgeDB to auto-generate a self-signed TLS certificate.- You may instead choose to provision a custom TLS certificate. In this case, you should instead create two other secrets: assign your certificate to
EDGEDB_SERVER_TLS_CERTand your private key toEDGEDB_SERVER_TLS_KEY.
- You may instead choose to provision a custom TLS certificate. In this case, you should instead create two other secrets: assign your certificate to
EDGEDB_SERVER_PORTtells EdgeDB to listen on port8080instead of the default 5656, as Fly uses8080for its default health checks.
Attach and deploy
Let’s attach mypostgres to myedgedb.
flyctl postgres attach mypostgres
This sets the value of DATABASE_URL in the myedgedb app and creates a new role called myedgedb in our Postgres database. By default, this role doesn’t have the full set of permissions EdgeDB needs to run. To change that, open a connection to your Postgres instance.
flyctl postgres connect --app mypostgres
Connecting to mypostgres.internal... complete
psql (14.4 (Debian 14.4-1.pgdg110+1))
Type "help" for help.
postgres=#
Then run the following REPL command.
postgres=# alter role myedgedb createrole createdb;
ALTER ROLE
postgres=# \quit
Finally, our EdgeDB app is ready to deploy!
flyctl deploy
It make take a few minutes to fully deploy. Debug with flyctl logs and check the deployment status with flyctl status.
flyctl status
Persist certificates
We need to persist the auto-generated TLS certificate to make sure it survives EdgeDB app restarts. (If you’ve provided your own certificate, skip this step.)
flyctl ssh console \
-C "edgedb-show-secrets.sh --format=toml EDGEDB_SERVER_TLS_KEY EDGEDB_SERVER_TLS_CERT" \
| tr -d '\r' | flyctl secrets import
Connection
You’ll be able to connect to your EdgeDB instance using the following DSN from other Fly.io apps in the same organization:
edgedb://edgedb:mysecretpassword@myedgedb.internal:8080
To pass this DSN to another app, create a secret called EDGEDB_DSN containing this value. EdgeDB’s client libraries will read this environment variable and connect to your instance automatically.
flyctl secrets set \
EDGEDB_DSN=edgedb://edgedb:mysecretpassword@myedgedb.internal:8080 \
--app my-other-app
If you’ve configured a Wireguard tunnel on your local machine, you’ll be able to open a REPL to your new EdgeDB instance with the edgedb CLI.
edgedb --dsn edgedb://edgedb:mysecretpassword@myedgedb.internal:8080 --tls-security insecure
EdgeDB 2.x (repl 2.x.x)
Type \help for help, \quit to quit.
edgedb>