Loading...
Loading...
Use when deploying to Fly.io or configuring flyctl, fly.toml, Fly.io secrets, databases, or GitHub Actions.
npx skill4agent add fellowship-dev/dogfooded-skills fly-ioflyctl# Standard installation
curl -L https://fly.io/install.sh | sh
# Add to PATH (adjust based on your environment)
export FLYCTL_INSTALL="/home/user/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"
# Verify installation
flyctl versionflyctl auth login# Decrypt environment file (requires ENV_PASS variable)
openssl enc -aes-256-cbc -pbkdf2 -salt -d -in .env.enc -out .env -k $ENV_PASS
# After modifying .env, re-encrypt
openssl enc -aes-256-cbc -pbkdf2 -salt -in .env -out .env.enc -k $ENV_PASS
# For production environment
openssl enc -aes-256-cbc -pbkdf2 -salt -in .env -out .env.enc.prod -k $ENV_PASS.envENV_PASS.env.gitignore# Create new PostgreSQL database on Fly.io
flyctl postgres create
# When prompted, use naming convention: {project-name}-db
# Example: myapp-db# Attach database to your application
flyctl pg attach {project-name}-db -a {project-name}
# If attachment fails, set DATABASE_URL manually
flyctl secrets set DATABASE_URL=postgres://user:pass@host:5432/dbname -a {project-name}# Check database status
flyctl status -a {project-name}-db
# Test connection via proxy
flyctl proxy 5433 -a {project-name}-db
# In another terminal: psql -h localhost -p 5433 -U {username} -d {dbname}# Create application (don't deploy yet)
flyctl launch
# Follow prompts:
# - Choose app name (matches ENV_NAME variable)
# - Select region (same as database for best performance)
# - Choose resource allocation
# - Decline immediate deployment (configure first)flyctl launchfly.tomlapp = "your-app-name"
[build]
# Adjust based on your application type
[env]
PORT = "8080"
HOST = "::"
# Add other non-secret environment variables
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0# Set individual secrets
flyctl secrets set APP_KEYS="your-app-keys" -a {project-name}
flyctl secrets set API_TOKEN_SALT="your-salt" -a {project-name}
# Import from .env file (ensure it's decrypted first)
flyctl secrets import -a {project-name} < .envfly.tomlflyctl secrets# Deploy application
flyctl deploy -a {project-name}
# Monitor deployment
flyctl logs -a {project-name}
# Check status
flyctl status -a {project-name}# Open application in browser
flyctl open -a {project-name}
# Check health endpoint
curl https://{project-name}.fly.dev/health
# Review logs for errors
flyctl logs -a {project-name}# Add certificate for custom domain
flyctl certs create yourdomain.com -a {project-name}
# Check certificate status
flyctl certs show yourdomain.com -a {project-name}APP_URL# Standard dump format (custom format, compressed)
pg_dump -Fc --no-acl --no-owner -h HOST -U USERNAME -d DATABASE_NAME > dump_file.dump
# Example for local database
pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d strapi > backup.dump# Standard restore
pg_restore --verbose --clean --no-acl --no-owner -h HOST -p PORT -U USERNAME -d "DATABASE_NAME" dump_file.dump
# Example for local database
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d strapi backup.dump# 1. Export local database
pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d {dbname} > latest.dump
# 2. Proxy production database (run in separate terminal)
flyctl proxy 5433 -a {project-name}-db
# 3. In another terminal, restore to production
DB_USER={check_fly_dashboard} # Get from Fly.io dashboard
DB_NAME={check_fly_dashboard} # Get from Fly.io dashboard
pg_restore --verbose --clean --no-acl --no-owner -h localhost -p 5433 -U $DB_USER -d "$DB_NAME" latest.dump
# 4. Clean up
rm latest.dump# 1. Proxy production database (run in separate terminal)
flyctl proxy 5433 -a {project-name}-db
# 2. In another terminal, dump production database
DB_USER={check_fly_dashboard}
DB_NAME={check_fly_dashboard}
pg_dump -Fc --no-acl --no-owner -h localhost -p 5433 -U $DB_USER -d "$DB_NAME" > production.dump
# 3. Restore to local database
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d {dbname} production.dump
# 4. Clean up
rm production.dump# Proxy database to local port
flyctl proxy 5433 -a {project-name}-db
# Connect with psql
psql -h localhost -p 5433 -U {username} -d {dbname}
# Connect with GUI tools (PgAdmin, DBeaver, etc.)
# Host: localhost
# Port: 5433
# User: {from Fly.io dashboard}
# Database: {from Fly.io dashboard}flyctl auth tokenFLY_API_TOKENENV_PASS.github/workflows/deploy.ymlname: Deploy to Fly.io
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Fly.io CLI
uses: superfly/flyctl-actions/setup-flyctl@master
- name: Decrypt environment variables
run: |
openssl enc -aes-256-cbc -pbkdf2 -salt -d \
-in .env.enc.prod -out .env -k ${{ secrets.ENV_PASS }}
- name: Deploy to Fly.io
run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}--remote-only# Check application status
flyctl status -a {project-name}
# View real-time logs
flyctl logs -a {project-name}
# View logs with filtering
flyctl logs -a {project-name} --region iad
# Check database status
flyctl status -a {project-name}-db
# View metrics
flyctl metrics -a {project-name}
# SSH into application
flyctl ssh console -a {project-name}fly.tomlflyctl proxy 5433 -a {project-name}-dbflyctl logs -a {project-name}-dbflyctl secrets list -a {project-name}flyctl secrets importflyctl logs -a {project-name}flyctl logs -a {project-name}flyctl ssh console -a {project-name}# Scale VM resources
flyctl scale vm shared-cpu-1x --memory 512 -a {project-name}
# Available VM sizes:
# shared-cpu-1x (256MB, 512MB, 1GB, 2GB)
# dedicated-cpu-1x (2GB, 4GB, 8GB)
# dedicated-cpu-2x (4GB, 8GB, 16GB)# Scale number of machines
flyctl scale count 2 -a {project-name}
# Auto-scaling configuration in fly.toml:
[http_service]
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0 # Scale to zero when idle# Add machines in multiple regions
flyctl regions add iad lhr syd -a {project-name}
# View current regions
flyctl regions list -a {project-name}
# Remove regions
flyctl regions remove lhr -a {project-name}# View current usage and costs
flyctl dashboard
# Check resource allocation
flyctl status -a {project-name}
flyctl status -a {project-name}-db.claude/skills/flyio-deployment/templates/# 1. Setup and authenticate
flyctl auth login
# 2. Create database
flyctl postgres create # Use {project-name}-db
# 3. Launch application
flyctl launch # Don't deploy yet
# 4. Attach database
flyctl pg attach {project-name}-db -a {project-name}
# 5. Set secrets
flyctl secrets import -a {project-name} < .env
# 6. Deploy
flyctl deploy -a {project-name}
# 7. Verify
flyctl open -a {project-name}
flyctl logs -a {project-name}# Export from source
pg_dump -Fc --no-acl --no-owner -h {source-host} -U {user} -d {db} > migration.dump
# Proxy Fly.io database
flyctl proxy 5433 -a {project-name}-db # Separate terminal
# Import to Fly.io
pg_restore --verbose --clean --no-acl --no-owner \
-h localhost -p 5433 -U {user} -d {db} migration.dump
# Verify
flyctl ssh console -a {project-name}
# Inside container: run database query to verify data# List recent releases
flyctl releases -a {project-name}
# Rollback to previous version
flyctl releases rollback -a {project-name}
# Or rollback to specific version
flyctl releases rollback {version-number} -a {project-name}
# Monitor rollback
flyctl logs -a {project-name}Your account has been marked as high risk. Please go to https://fly.io/high-risk-unlock
auto_stop_machines = "stop"min_machines_running = 0/_healthmin_machines_running = 0fly deployfly status --app <app> # Find both machine IDs
fly machine stop <second-id> --app <app>
fly machine destroy <second-id> --app <app> --forcefly postgres attachDATABASE_URLsslmode=disableDATABASE_SSLfalse[env]
DATABASE_SSL = "false"proxied=falsefly certs setup_acme-challenge--region--primary-regionprimary_regionfly.toml--regionfly deployecho -n "TOKEN" > /tmp/.token && TK=$(cat /tmp/.token)-o fileurllib.requestflyctl version update