Skills Development Configure Fly.io Databases, Volumes, And Networking

Configure Fly.io Databases, Volumes, And Networking

v20260423
flyio-core-workflow-b
This skill guides users through setting up robust, production-grade infrastructure on Fly.io. It covers creating and connecting to Fly Postgres clusters for reliable data storage, provisioning persistent NVMe Volumes for durable file storage, and configuring private internal networking (6PN) for secure service-to-service communication. It is essential for modern microservices requiring stable databases and persistent state.
Get Skill
497 downloads
Overview

Fly.io Core Workflow B: Postgres, Volumes & Networking

Overview

Set up Fly Postgres, persistent Fly Volumes, and private networking between apps. Fly Postgres runs as a regular Fly app with automated replication. Volumes provide persistent NVMe storage attached to specific machines.

Instructions

Step 1: Create Fly Postgres

# Create a Postgres cluster
fly postgres create --name my-db --region iad --vm-size shared-cpu-1x --volume-size 10

# Attach to your app (sets DATABASE_URL secret automatically)
fly postgres attach my-db -a my-app

# Connect directly
fly postgres connect -a my-db
# psql> SELECT version();

# Proxy to local machine for dev tools
fly proxy 5432 -a my-db
# Now connect: psql postgres://postgres:password@localhost:5432

Step 2: Create Persistent Volumes

# Create a volume (same region as your machine)
fly volumes create data --size 10 --region iad -a my-app

# List volumes
fly volumes list -a my-app

# Mount in fly.toml
# fly.toml
[mounts]
  source = "data"
  destination = "/data"
# Deploy to pick up mount
fly deploy

# Verify mount inside machine
fly ssh console -C "df -h /data"

Step 3: Private Networking (6PN)

# Apps in the same org can reach each other via .internal DNS
# my-app can reach my-db at: my-db.internal:5432

# Internal DNS format: <app-name>.internal
# Machine-specific: <machine-id>.vm.<app-name>.internal

# Example: connect from app code
DATABASE_URL=postgres://postgres:password@my-db.internal:5432/my_db
// Access internal services (no public internet)
const dbUrl = `postgres://postgres:${process.env.DB_PASSWORD}@my-db.internal:5432/mydb`;
const apiUrl = `http://my-api.internal:3000/health`;  // Internal HTTP

Step 4: Postgres Backups and Failover

# List backups
fly postgres barman list-backups -a my-db

# Create manual backup
fly postgres barman backup -a my-db

# Check replication status
fly postgres barman check -a my-db

# Failover to standby (if primary fails)
fly postgres failover -a my-db

Error Handling

Error Cause Solution
volume not found Volume in different region Create volume in same region as machine
connection refused on .internal App not running Check fly status -a target-app
database does not exist Not yet created Run CREATE DATABASE mydb; via fly postgres connect
disk full Volume full Extend: fly volumes extend vol_xxx --size 20

Resources

Next Steps

For common errors, see flyio-common-errors.

Info
Category Development
Name flyio-core-workflow-b
Version v20260423
Size 3.23KB
Updated At 2026-04-28
Language