Fly.io Deployment
Quick MVP deployment to fly.io with support for multiple languages, databases, GitHub integration, and production-ready configurations.
When to Use This Skill
Use this skill when you need to:
- Deploy a new application to fly.io quickly
- Migrate existing applications to fly.io
- Set up databases (Managed Postgres, SQLite with volumes, or Tigris object storage)
- Configure secrets and environment variables
- Add custom domains with SSL certificates
- Set up GitHub Actions for continuous deployment
- Create PR review apps (preview environments)
- Troubleshoot deployment or runtime issues
- Optimize fly.io configurations for cost and performance
Quick Start
New Application
# From your app directory
fly launch
# Follow interactive prompts:
# - Choose app name
# - Select region
# - Configure resources
# - Deploy immediately or create config only
Existing Application
# Deploy app with existing fly.toml
fly deploy
# Build on fly.io servers (recommended for CI/CD)
fly deploy --remote-only
Workflow Decision Tree
1. Choose Your Starting Point
New App (No fly.toml) → See: Deploying New Applications
Existing fly.io App → See: Deploying Existing Applications
Migrating from Another Platform → See: references/deployment-workflow.md + Language-specific guides
2. Choose Your Language/Framework
Navigate to the appropriate language guide:
JavaScript/Node.js:
- Next.js → references/languages/javascript.md#nextjs
- Express → references/languages/javascript.md#express
- RedwoodJS → references/languages/javascript.md#redwoodjs
Python:
- FastAPI → references/languages/python.md#fastapi
- Django → references/languages/python.md#django
- Flask → references/languages/python.md#flask
Rust:
- Axum → references/languages/rust.md#axum
- Rocket → references/languages/rust.md#rocket
Generic Dockerfile: → See: references/deployment-workflow.md
Each language guide includes:
- Optimized Dockerfiles (see also:
assets/dockerfiles/) - fly.toml configuration examples
- Framework-specific best practices
- Common issues and solutions
3. Add Data Persistence (Optional)
Choose based on your needs:
Managed Postgres (Recommended for production SQL databases)
→ See: references/data-persistence.md#managed-postgres
→ Script: scripts/init_postgres.sh
Volumes (For SQLite, file uploads, or local storage) → See: references/data-persistence.md#fly-volumes
Tigris Object Storage (For media files, user uploads, S3-compatible)
→ See: references/data-persistence.md#tigris-object-storage
→ Script: scripts/setup_tigris.sh
External Database (Supabase, PlanetScale, Neon, etc.) → See: references/data-persistence.md#external-databases
4. Configure Secrets
→ See: references/secrets-and-env.md
# Set secrets
fly secrets set DATABASE_URL=postgres://...
fly secrets set API_KEY=abc123
# Generate random secrets
fly secrets set SECRET_KEY=$(openssl rand -hex 32)
5. Add Custom Domain (Optional)
→ See: references/domains-and-networking.md
# Add custom domain
fly certs add example.com
# View DNS instructions
fly certs show example.com
6. Set Up CI/CD (Optional)
GitHub Actions Deployment:
→ See: references/github-integration.md
→ Template: assets/workflows/deploy.yml
PR Review Apps:
→ See: references/github-integration.md#review-apps
→ Template: assets/workflows/review-apps.yml
→ Script: scripts/setup_review_apps.sh
Deploying New Applications
Step 1: Prepare Your Application
Ensure your app has:
- Dockerfile or package.json/requirements.txt (for buildpacks)
- Health endpoint (e.g.,
/healthreturning 200 OK) - Port configuration reading from
PORTenvironment variable - Bind to 0.0.0.0 (not localhost or 127.0.0.1)
Example Dockerfiles available in: assets/dockerfiles/
nextjs.Dockerfileexpress.Dockerfilefastapi.Dockerfileaxum.Dockerfilerocket.Dockerfile
Step 2: Initialize fly.io App
fly launch
Interactive prompts will:
- Detect your app type
- Suggest a name
- Choose a region
- Create
fly.toml - Optionally deploy immediately
Useful flags:
# Skip deployment, just create config
fly launch --no-deploy
# Specify app name
fly launch --name my-app
# Choose region
fly launch --region ord # Chicago
Step 3: Configure fly.toml
Review and adjust fly.toml:
app = "my-app"
primary_region = "ord"
[build]
dockerfile = "Dockerfile"
[env]
PORT = "8080"
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = "stop"
auto_start_machines = true
min_machines_running = 0 # Scale to zero for cost savings
[[http_service.checks]]
grace_period = "10s"
interval = "30s"
path = "/health"
[[vm]]
memory = "256mb"
cpus = 1
→ For complete fly.toml reference: references/deployment-workflow.md
Step 4: Deploy
fly deploy
Your app will be available at: https://my-app.fly.dev
Deploying Existing Applications
For apps with existing fly.toml:
# Standard deployment
fly deploy
# Remote build (recommended for CI/CD)
fly deploy --remote-only
# Specific deployment strategy
fly deploy --strategy rolling # Zero downtime (default)
fly deploy --strategy immediate # Faster, brief downtime
Common Tasks
Adding a Database
Managed Postgres (Recommended):
# Using the provided script
./scripts/init_postgres.sh --app my-app
# Or manually
fly postgres create --name my-app-db
fly postgres attach my-app-db
Tigris Object Storage:
# Using the provided script
./scripts/setup_tigris.sh --app my-app
# Or manually
fly storage create
→ See: references/data-persistence.md
Managing Secrets
# Set secrets
fly secrets set DATABASE_URL=postgres://...
fly secrets set API_KEY=secret123
# List secrets (names only)
fly secrets list
# Remove secrets
fly secrets unset API_KEY
→ See: references/secrets-and-env.md
Setting Up Review Apps
# Using the provided script
./scripts/setup_review_apps.sh --org personal --region ord
# Or copy template manually
cp assets/workflows/review-apps.yml .github/workflows/
→ See: references/github-integration.md#review-apps
Adding Custom Domain
# Add domain
fly certs add example.com
# Get your app's IP addresses
fly ips list
# Configure DNS (A and AAAA records)
# Then verify
fly certs show example.com
→ See: references/domains-and-networking.md
Scaling
# Scale memory
fly scale memory 512
# Scale machine size
fly scale vm shared-cpu-2x
# Scale instance count
fly scale count 3
# Scale across regions
fly scale count 2 --region ord,iad
→ See: references/deployment-workflow.md#scaling
Troubleshooting
Common Issues
App won't start:
# Check logs
fly logs
# Verify port configuration
# App must listen on PORT env var and bind to 0.0.0.0
Health checks failing:
# Test health endpoint
fly ssh console -C "curl http://localhost:8080/health"
# Adjust grace period in fly.toml if needed
Database connection errors:
# Verify DATABASE_URL is set
fly secrets list
# Test from within app
fly ssh console
echo $DATABASE_URL
Deployment slow or timing out:
# Use remote builder
fly deploy --remote-only
# Check build cache
fly deploy --no-cache
→ For comprehensive troubleshooting: references/troubleshooting.md
Debugging Commands
# View app status
fly status
# Stream logs
fly logs
# SSH into running machine
fly ssh console
# List machines
fly machine list
# View deployments
fly releases
# Check health checks
fly checks list
Reference Documentation
Core Guides
- Deployment Workflow - fly.toml configuration, deployment strategies, scaling
- Data Persistence - Postgres, volumes, Tigris, external databases
- Secrets Management - Environment variables, secret handling, security
- GitHub Integration - GitHub Actions, review apps, CI/CD
- Custom Domains - DNS setup, SSL certificates, networking
- Troubleshooting - Common issues, debugging techniques, solutions
Language-Specific Guides
- JavaScript/Node.js - Next.js, Express, RedwoodJS
- Python - FastAPI, Django, Flask
- Rust - Axum, Rocket
Bundled Resources
Scripts (scripts/)
Automation scripts for common tasks:
setup_review_apps.sh- Generate GitHub Actions workflow for PR review appsinit_postgres.sh- Create and attach Managed Postgres databasesetup_tigris.sh- Configure Tigris object storage bucket
All scripts include help text. Run with --help or without arguments for usage.
Dockerfile Templates (assets/dockerfiles/)
Production-ready Dockerfiles for each framework:
nextjs.Dockerfile- Next.js with standalone output (minimal image)express.Dockerfile- Express.js with multi-stage buildfastapi.Dockerfile- FastAPI with uvicornaxum.Dockerfile- Axum with optimized Rust buildrocket.Dockerfile- Rocket with multi-stage build
Copy and customize for your app.
GitHub Actions Workflows (assets/workflows/)
Ready-to-use workflow templates:
deploy.yml- Basic deployment on push to mainreview-apps.yml- PR review apps with automatic cleanuptest-and-deploy.yml- Run tests before deploying
Copy to .github/workflows/ and customize.
Best Practices
- Always use health checks - Ensures reliable deployments
- Start with minimal resources - Scale up based on actual usage
- Use Managed Postgres for production - Don't run unmanaged databases
- Set secrets properly - Never commit secrets to git
- Use remote builds for CI/CD -
fly deploy --remote-only - Test locally first - Build and test Docker images locally
- Monitor logs regularly -
fly logshelps catch issues early - Use review apps - Test changes before merging
- Configure graceful shutdown - Handle SIGTERM properly
- Keep dependencies updated - Security and performance
Quick Reference
# Essential commands
fly launch # Create new app
fly deploy # Deploy app
fly status # Check app status
fly logs # View logs
fly ssh console # SSH into machine
# Database
fly postgres create # Create database
fly postgres attach # Attach to app
fly storage create # Create Tigris bucket
# Configuration
fly secrets set KEY=value # Set secret
fly secrets list # List secrets
fly scale memory 512 # Scale memory
fly scale count 3 # Scale instances
# Domains
fly certs add example.com # Add domain
fly certs show example.com # Check certificate
fly ips list # Get IP addresses
# Troubleshooting
fly logs # Stream logs
fly ssh console # Access machine
fly checks list # View health checks
fly releases # View deployments
Getting Help
- Documentation: https://fly.io/docs/
- Community Forum: https://community.fly.io/
- Status Page: https://status.flyio.net/
- This Skill: Check references/troubleshooting.md for common issues
Note: fly.io changes frequently. This skill is based on documentation current as of January 2026. If commands or features have changed, consult the official fly.io documentation at https://fly.io/docs/
Scan to join WeChat group