Fly.io
Overview
Fly.io deploys applications to Firecracker microVMs across 30+ edge regions worldwide, providing sub-50ms latency to users. It supports scale-to-zero machines, persistent NVMe volumes, LiteFS for multi-region SQLite replication, and private WireGuard networking between services.
Instructions
- When deploying applications, use
fly launch to auto-detect the framework and generate a Dockerfile, then fly deploy for zero-downtime rolling updates with health checks.
- When configuring scaling, use
auto_stop_machines and auto_start_machines in fly.toml to scale to zero when idle and wake on incoming requests, and set machine sizing appropriate to the workload.
- When managing multi-region deployments, use
fly scale count --region to distribute machines, fly-replay header to route writes to the primary region, and LiteFS for SQLite read replicas.
- When handling persistent data, attach volumes for durable storage (machines are ephemeral), use LiteFS for multi-region SQLite, or Tigris for S3-compatible object storage.
- When connecting services, use
.internal DNS for private service-to-service communication over the WireGuard mesh and never expose internal services to the public internet.
- When managing secrets, use
fly secrets set KEY=value for encrypted secret storage accessible as environment variables.
- When troubleshooting, use
fly logs for real-time streaming, fly ssh console to access running machines, and fly proxy to tunnel to internal services.
Examples
Example 1: Deploy a multi-region web application
User request: "Deploy my app globally with Fly.io in US, Europe, and Asia"
Actions:
- Initialize with
fly launch and configure Dockerfile
- Deploy machines to three regions:
fly scale count 2 --region iad,cdg,nrt
- Set up LiteFS for SQLite replication across regions
- Configure
fly-replay header for write routing to the primary region
Output: A globally distributed app with read replicas in three regions and automatic write routing.
Example 2: Configure a cost-efficient staging environment
User request: "Set up a Fly.io staging environment that scales to zero when not in use"
Actions:
- Create a staging app with
fly launch
- Configure
auto_stop_machines = "stop" and auto_start_machines = true in fly.toml
- Attach a volume for persistent database storage
- Set health checks with appropriate timeouts for routing
Output: A staging environment that stops idle machines and wakes in sub-second on the next request.
Example 3: Canary deployment with auto-rollback
User request: "Deploy my app to Fly.io but test on one machine first. If the health check fails, roll back."
Actions:
- Deploy with
--strategy canary to spin up a single new machine
- Health check the canary machine at the app's health endpoint
- If healthy, promote with
fly deploy --strategy rolling to replace all machines
- If unhealthy, rollback with
fly releases rollback
#!/bin/bash
# deploy-canary.sh — Fly.io canary deployment with auto-rollback
set -euo pipefail
APP="${1:?Usage: deploy-canary.sh <app-name>}"
HEALTH_PATH="${2:-/api/health}"
echo "🐤 Deploying canary..."
fly deploy --app "$APP" --strategy canary --wait-timeout 120
HEALTH_URL="https://${APP}.fly.dev${HEALTH_PATH}"
HEALTHY=false
DEADLINE=$((SECONDS + 60))
while [ $SECONDS -lt $DEADLINE ]; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" || true)
[ "$STATUS" = "200" ] && HEALTHY=true && break
sleep 3
done
if [ "$HEALTHY" = true ]; then
echo "✅ Canary healthy! Promoting..."
fly deploy --app "$APP" --strategy rolling
echo "🎉 Production deploy complete"
else
echo "❌ Canary failed! Rolling back..."
fly releases rollback --app "$APP"
echo "⏪ Rolled back"
exit 1
fi
Guidelines
- Use
auto_stop_machines = "stop" for dev/staging to save costs; machines stop after idle timeout.
- Keep
auto_start_machines = true so machines wake on incoming requests with sub-second cold start.
- Use
.internal DNS for service-to-service calls; never expose internal services publicly.
- Store persistent data on volumes, not the machine filesystem, since machines are ephemeral.
- Use LiteFS for SQLite apps needing multi-region reads; it is simpler than PostgreSQL replication.
- Set health checks with realistic timeouts; Fly Proxy uses them for routing, not just monitoring.
- Use
fly-replay header for write operations in multi-region setups to route to the primary region.
1---2name: fly-io3description: Assists with deploying applications globally on Fly.io edge infrastructure. Use when deploying Docker-based apps, configuring multi-region machines, setting up persistent storage, or managing global databases. Trigger words: fly.io, fly deploy, fly machines, fly launch, multi-region, edge deployment, flyctl.4license: Apache-2.05---67# Fly.io89## Overview1011Fly.io deploys applications to Firecracker microVMs across 30+ edge regions worldwide, providing sub-50ms latency to users. It supports scale-to-zero machines, persistent NVMe volumes, LiteFS for multi-region SQLite replication, and private WireGuard networking between services.1213## Instructions1415- When deploying applications, use `fly launch` to auto-detect the framework and generate a Dockerfile, then `fly deploy` for zero-downtime rolling updates with health checks.16- When configuring scaling, use `auto_stop_machines` and `auto_start_machines` in `fly.toml` to scale to zero when idle and wake on incoming requests, and set machine sizing appropriate to the workload.17- When managing multi-region deployments, use `fly scale count --region` to distribute machines, `fly-replay` header to route writes to the primary region, and LiteFS for SQLite read replicas.18- When handling persistent data, attach volumes for durable storage (machines are ephemeral), use LiteFS for multi-region SQLite, or Tigris for S3-compatible object storage.19- When connecting services, use `.internal` DNS for private service-to-service communication over the WireGuard mesh and never expose internal services to the public internet.20- When managing secrets, use `fly secrets set KEY=value` for encrypted secret storage accessible as environment variables.21- When troubleshooting, use `fly logs` for real-time streaming, `fly ssh console` to access running machines, and `fly proxy` to tunnel to internal services.2223## Examples2425### Example 1: Deploy a multi-region web application2627**User request:** "Deploy my app globally with Fly.io in US, Europe, and Asia"2829**Actions:**301. Initialize with `fly launch` and configure Dockerfile312. Deploy machines to three regions: `fly scale count 2 --region iad,cdg,nrt`323. Set up LiteFS for SQLite replication across regions334. Configure `fly-replay` header for write routing to the primary region3435**Output:** A globally distributed app with read replicas in three regions and automatic write routing.3637### Example 2: Configure a cost-efficient staging environment3839**User request:** "Set up a Fly.io staging environment that scales to zero when not in use"4041**Actions:**421. Create a staging app with `fly launch`432. Configure `auto_stop_machines = "stop"` and `auto_start_machines = true` in `fly.toml`443. Attach a volume for persistent database storage454. Set health checks with appropriate timeouts for routing4647**Output:** A staging environment that stops idle machines and wakes in sub-second on the next request.4849### Example 3: Canary deployment with auto-rollback5051**User request:** "Deploy my app to Fly.io but test on one machine first. If the health check fails, roll back."5253**Actions:**541. Deploy with `--strategy canary` to spin up a single new machine552. Health check the canary machine at the app's health endpoint563. If healthy, promote with `fly deploy --strategy rolling` to replace all machines574. If unhealthy, rollback with `fly releases rollback`5859```bash60#!/bin/bash61# deploy-canary.sh — Fly.io canary deployment with auto-rollback62set -euo pipefail6364APP="${1:?Usage: deploy-canary.sh <app-name>}"65HEALTH_PATH="${2:-/api/health}"6667echo "🐤 Deploying canary..."68fly deploy --app "$APP" --strategy canary --wait-timeout 1206970HEALTH_URL="https://${APP}.fly.dev${HEALTH_PATH}"71HEALTHY=false72DEADLINE=$((SECONDS + 60))7374while [ $SECONDS -lt $DEADLINE ]; do75 STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" || true)76 [ "$STATUS" = "200" ] && HEALTHY=true && break77 sleep 378done7980if [ "$HEALTHY" = true ]; then81 echo "✅ Canary healthy! Promoting..."82 fly deploy --app "$APP" --strategy rolling83 echo "🎉 Production deploy complete"84else85 echo "❌ Canary failed! Rolling back..."86 fly releases rollback --app "$APP"87 echo "⏪ Rolled back"88 exit 189fi90```9192## Guidelines9394- Use `auto_stop_machines = "stop"` for dev/staging to save costs; machines stop after idle timeout.95- Keep `auto_start_machines = true` so machines wake on incoming requests with sub-second cold start.96- Use `.internal` DNS for service-to-service calls; never expose internal services publicly.97- Store persistent data on volumes, not the machine filesystem, since machines are ephemeral.98- Use LiteFS for SQLite apps needing multi-region reads; it is simpler than PostgreSQL replication.99- Set health checks with realistic timeouts; Fly Proxy uses them for routing, not just monitoring.100- Use `fly-replay` header for write operations in multi-region setups to route to the primary region.