fly-io

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Fly.io

Fly.io

This skill provides comprehensive guidance for deploying applications to Fly.io, including initial setup, database management, CI/CD integration, and production operations.
本技能为部署应用至Fly.io提供全面指导,包括初始设置、数据库管理、CI/CD集成以及生产环境运维。

When to Use

使用场景

This skill activates automatically when working with:
  • Fly.io-specific tasks ("fly.io", "deploy to fly", "fly.io setup", "flyctl")
  • Fly.io configuration ("fly.toml", "fly app", "fly launch")
  • Fly.io database operations ("fly postgres", "fly pg")
  • Fly.io environment management ("fly secrets", "fly env")
  • Fly.io monitoring ("fly logs", "fly status", "fly dashboard")
  • Fly.io GitHub Actions ("fly deploy github action", "flyctl in CI/CD")
当处理以下Fly.io相关任务时,本技能会自动激活:
  • Fly.io专属任务("fly.io"、"deploy to fly"、"fly.io setup"、"flyctl")
  • Fly.io配置("fly.toml"、"fly app"、"fly launch")
  • Fly.io数据库操作("fly postgres"、"fly pg")
  • Fly.io环境管理("fly secrets"、"fly env")
  • Fly.io监控("fly logs"、"fly status"、"fly dashboard")
  • Fly.io GitHub Actions("fly deploy github action"、"flyctl in CI/CD")

Core Principles

核心原则

  1. Security First: Always encrypt sensitive data, never commit unencrypted secrets
  2. Database Safety: Use proxying for database access, maintain regular backups
  3. Environment Isolation: Separate development, staging, and production configurations
  4. Cost Awareness: Optimize resource allocation, monitor usage regularly
  5. Automation: Leverage CI/CD for consistent, repeatable deployments
  6. Monitoring: Implement comprehensive logging and health checks
  1. 安全优先:始终加密敏感数据,绝不提交未加密的密钥
  2. 数据库安全:使用代理访问数据库,定期执行备份
  3. 环境隔离:分离开发、预发布和生产环境配置
  4. 成本意识:优化资源分配,定期监控使用情况
  5. 自动化:利用CI/CD实现一致、可重复的部署流程
  6. 监控:实施全面的日志记录和健康检查

Prerequisites

前置条件

Before beginning Fly.io deployment:
  1. Fly.io Account: Active account with credit card attached (required for PostgreSQL)
  2. CLI Installation:
    flyctl
    command-line tool installed and authenticated
  3. Environment Variables: Project-specific configuration ready
  4. Application Ready: Application configured for production deployment
开始Fly.io部署前需满足:
  1. Fly.io账户:已激活且绑定信用卡(PostgreSQL服务必填)
  2. CLI安装:已安装并认证
    flyctl
    命令行工具
  3. 环境变量:准备好项目专属配置
  4. 应用就绪:应用已配置为可用于生产部署

Instructions

操作指南

1. Initial Setup and Authentication

1. 初始设置与认证

Install Fly.io CLI:
bash
undefined
安装Fly.io CLI:
bash
undefined

Standard installation

标准安装

Add to PATH (adjust based on your environment)

添加至PATH(根据环境调整)

export FLYCTL_INSTALL="/home/user/.fly" export PATH="$FLYCTL_INSTALL/bin:$PATH"
export FLYCTL_INSTALL="/home/user/.fly" export PATH="$FLYCTL_INSTALL/bin:$PATH"

Verify installation

验证安装

flyctl version

**Authenticate with Fly.io:**

```bash
flyctl auth login
This opens a browser for authentication. After successful login, your credentials are stored locally.
flyctl version

**Fly.io认证:**

```bash
flyctl auth login
此命令会打开浏览器进行认证。登录成功后,凭证将存储在本地。

2. Environment Variable Management

2. 环境变量管理

Encryption for Security:
Fly.io deployments should use encrypted environment files to protect sensitive data:
bash
undefined
加密保障安全:
Fly.io部署应使用加密的环境文件保护敏感数据:
bash
undefined

Decrypt environment file (requires ENV_PASS variable)

解密环境文件(需要ENV_PASS变量)

openssl enc -aes-256-cbc -pbkdf2 -salt -d -in .env.enc -out .env -k $ENV_PASS
openssl enc -aes-256-cbc -pbkdf2 -salt -d -in .env.enc -out .env -k $ENV_PASS

After modifying .env, re-encrypt

修改.env后重新加密

openssl enc -aes-256-cbc -pbkdf2 -salt -in .env -out .env.enc -k $ENV_PASS
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

**IMPORTANT Security Notes:**
- Never commit unencrypted `.env` files
- Store `ENV_PASS` securely (GitHub secrets, password manager)
- Use different encryption passwords for staging/production
- Add `.env` to `.gitignore` if not already present
openssl enc -aes-256-cbc -pbkdf2 -salt -in .env -out .env.enc.prod -k $ENV_PASS

**重要安全提示:**
- 绝不提交未加密的`.env`文件
- 安全存储`ENV_PASS`(GitHub密钥、密码管理器)
- 为预发布/生产环境使用不同的加密密码
- 如果尚未添加,将`.env`加入`.gitignore`

3. Database Setup (PostgreSQL)

3. 数据库设置(PostgreSQL)

Create PostgreSQL Database:
bash
undefined
创建PostgreSQL数据库:
bash
undefined

Create new PostgreSQL database on Fly.io

在Fly.io上创建新的PostgreSQL数据库

flyctl postgres create
flyctl postgres create

When prompted, use naming convention: {project-name}-db

提示时使用命名规范:{项目名称}-db

Example: myapp-db

示例:myapp-db


**Important database creation options:**
- Choose region closest to your users
- Select appropriate resource tier (start small, scale up)
- Note the database credentials provided
- Database name typically matches app name + "-db" suffix

**Attach Database to Application:**

```bash

**数据库创建重要选项:**
- 选择离用户最近的区域
- 选择合适的资源层级(从小规模开始,按需扩容)
- 记录提供的数据库凭证
- 数据库名称通常为应用名称 + "-db"后缀

**将数据库关联至应用:**

```bash

Attach database to your application

将数据库关联至你的应用

flyctl pg attach {project-name}-db -a {project-name}
flyctl pg attach {项目名称}-db -a {项目名称}

If attachment fails, set DATABASE_URL manually

如果关联失败,手动设置DATABASE_URL

flyctl secrets set DATABASE_URL=postgres://user:pass@host:5432/dbname -a {project-name}

**Verify database connection:**

```bash
flyctl secrets set DATABASE_URL=postgres://user:pass@host:5432/dbname -a {项目名称}

**验证数据库连接:**

```bash

Check database status

检查数据库状态

flyctl status -a {project-name}-db
flyctl status -a {项目名称}-db

Test connection via proxy

通过代理测试连接

flyctl proxy 5433 -a {project-name}-db
flyctl proxy 5433 -a {项目名称}-db

In another terminal: psql -h localhost -p 5433 -U {username} -d {dbname}

在另一个终端执行:psql -h localhost -p 5433 -U {用户名} -d {数据库名}

undefined
undefined

4. Application Creation and Configuration

4. 应用创建与配置

Launch New Application:
bash
undefined
启动新应用:
bash
undefined

Create application (don't deploy yet)

创建应用(暂不部署)

flyctl launch
flyctl launch

Follow prompts:

按照提示操作:

- Choose app name (matches ENV_NAME variable)

- 选择应用名称(与ENV_NAME变量匹配)

- Select region (same as database for best performance)

- 选择区域(与数据库同区域以获得最佳性能)

- Choose resource allocation

- 选择资源分配

- Decline immediate deployment (configure first)

- 拒绝立即部署(先进行配置)


**Configure Application:**

After `flyctl launch`, review and customize `fly.toml`:

```toml
app = "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 Secrets:
bash
undefined

**配置应用:**

执行`flyctl launch`后,查看并自定义`fly.toml`:

```toml
app = "your-app-name"

[build]
  # 根据应用类型调整

[env]
  PORT = "8080"
  HOST = "::"
  # 添加其他非敏感环境变量

[http_service]
  internal_port = 8080
  force_https = true
  auto_stop_machines = true
  auto_start_machines = true
  min_machines_running = 0
设置密钥:
bash
undefined

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}
flyctl secrets set APP_KEYS="your-app-keys" -a {项目名称} flyctl secrets set API_TOKEN_SALT="your-salt" -a {项目名称}

Import from .env file (ensure it's decrypted first)

从.env文件导入(确保已解密)

flyctl secrets import -a {project-name} < .env
undefined
flyctl secrets import -a {项目名称} < .env
undefined

5. Deployment Workflow

5. 部署流程

Pre-Deployment Checklist:
  • Environment variables configured (production values)
  • Database created and attached
  • fly.toml
    reviewed and customized
  • Secrets set via
    flyctl secrets
  • Application builds successfully locally
  • Dependencies are production-ready
Initial Deployment:
bash
undefined
部署前检查清单:
  • 环境变量已配置(生产环境值)
  • 数据库已创建并关联
  • fly.toml
    已查看并自定义
  • 已通过
    flyctl secrets
    设置密钥
  • 应用可在本地成功构建
  • 依赖项已准备好用于生产环境
初始部署:
bash
undefined

Deploy application

部署应用

flyctl deploy -a {project-name}
flyctl deploy -a {项目名称}

Monitor deployment

监控部署过程

flyctl logs -a {project-name}
flyctl logs -a {项目名称}

Check status

检查状态

flyctl status -a {project-name}

**Post-Deployment Verification:**

```bash
flyctl status -a {项目名称}

**部署后验证:**

```bash

Open application in browser

在浏览器中打开应用

flyctl open -a {project-name}
flyctl open -a {项目名称}

Check health endpoint

检查健康检查端点

curl https://{project-name}.fly.dev/health
curl https://{项目名称}.fly.dev/health

Review logs for errors

查看日志排查错误

flyctl logs -a {project-name}
undefined
flyctl logs -a {项目名称}
undefined

6. Domain and SSL Configuration

6. 域名与SSL配置

Add Custom Domain:
bash
undefined
添加自定义域名:
bash
undefined

Add certificate for custom domain

为自定义域名添加证书

flyctl certs create yourdomain.com -a {project-name}
flyctl certs create yourdomain.com -a {项目名称}

Check certificate status

检查证书状态

flyctl certs show yourdomain.com -a {project-name}

**DNS Configuration:**

1. Point your domain's A/AAAA records to Fly.io
2. Wait for DNS propagation
3. Verify certificate issuance
4. Update `APP_URL` environment variable to custom domain
5. Re-deploy with updated configuration
flyctl certs show yourdomain.com -a {项目名称}

**DNS配置:**

1. 将域名的A/AAAA记录指向Fly.io
2. 等待DNS生效
3. 验证证书颁发状态
4. 将`APP_URL`环境变量更新为自定义域名
5. 使用更新后的配置重新部署

7. Database Management

7. 数据库管理

PostgreSQL Dump (Backup):
bash
undefined
PostgreSQL备份(导出):
bash
undefined

Standard dump format (custom format, compressed)

标准导出格式(自定义格式,已压缩)

pg_dump -Fc --no-acl --no-owner -h HOST -U USERNAME -d DATABASE_NAME > dump_file.dump
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

**PostgreSQL Restore:**

```bash
pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d strapi > backup.dump

**PostgreSQL恢复:**

```bash

Standard restore

标准恢复

pg_restore --verbose --clean --no-acl --no-owner -h HOST -p PORT -U USERNAME -d "DATABASE_NAME" dump_file.dump
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

**Upload Local Database to Fly.io:**

```bash
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d strapi backup.dump

**将本地数据库上传至Fly.io:**

```bash

1. Export local database

1. 导出本地数据库

pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d {dbname} > latest.dump
pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d {数据库名} > latest.dump

2. Proxy production database (run in separate terminal)

2. 代理生产数据库(在单独终端运行)

flyctl proxy 5433 -a {project-name}-db
flyctl proxy 5433 -a {项目名称}-db

3. In another terminal, restore to production

3. 在另一个终端恢复至生产环境

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
DB_USER={从Fly.io控制台获取} # 从Fly.io控制台获取 DB_NAME={从Fly.io控制台获取} # 从Fly.io控制台获取 pg_restore --verbose --clean --no-acl --no-owner -h localhost -p 5433 -U $DB_USER -d "$DB_NAME" latest.dump

4. Clean up

4. 清理

rm latest.dump

**Download Production Database from Fly.io:**

```bash
rm latest.dump

**从Fly.io下载生产数据库:**

```bash

1. Proxy production database (run in separate terminal)

1. 代理生产数据库(在单独终端运行)

flyctl proxy 5433 -a {project-name}-db
flyctl proxy 5433 -a {项目名称}-db

2. In another terminal, dump production database

2. 在另一个终端导出生产数据库

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
DB_USER={从Fly.io控制台获取} DB_NAME={从Fly.io控制台获取} pg_dump -Fc --no-acl --no-owner -h localhost -p 5433 -U $DB_USER -d "$DB_NAME" > production.dump

3. Restore to local database

3. 恢复至本地数据库

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d {dbname} production.dump
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d {数据库名} production.dump

4. Clean up

4. 清理

rm production.dump

**Database Proxy for Direct Access:**

```bash
rm production.dump

**数据库代理用于直接访问:**

```bash

Proxy database to local port

将数据库代理至本地端口

flyctl proxy 5433 -a {project-name}-db
flyctl proxy 5433 -a {项目名称}-db

Connect with psql

使用psql连接

psql -h localhost -p 5433 -U {username} -d {dbname}
psql -h localhost -p 5433 -U {用户名} -d {数据库名}

Connect with GUI tools (PgAdmin, DBeaver, etc.)

使用GUI工具连接(PgAdmin、DBeaver等)

Host: localhost

主机:localhost

Port: 5433

端口:5433

User: {from Fly.io dashboard}

用户:{从Fly.io控制台获取}

Database: {from Fly.io dashboard}

数据库:{从Fly.io控制台获取}

undefined
undefined

8. GitHub Actions CI/CD Integration

8. GitHub Actions CI/CD集成

Setup Continuous Deployment:
  1. Generate Fly.io API token:
    bash
    flyctl auth token
  2. Add GitHub repository secrets:
    • FLY_API_TOKEN
      : Your Fly.io API token
    • ENV_PASS
      : Environment encryption password (if using encrypted .env)
  3. Create
    .github/workflows/deploy.yml
    :
yaml
name: 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 }}
Best Practices for CI/CD:
  • Use
    --remote-only
    flag to build on Fly.io servers
  • Separate staging and production workflows
  • Implement smoke tests after deployment
  • Configure Slack/Discord notifications for deployment status
  • Use GitHub environments for approval gates on production deploys
设置持续部署:
  1. 生成Fly.io API令牌:
    bash
    flyctl auth token
  2. 添加GitHub仓库密钥:
    • FLY_API_TOKEN
      : 你的Fly.io API令牌
    • ENV_PASS
      : 环境加密密码(如果使用加密的.env)
  3. 创建
    .github/workflows/deploy.yml
yaml
name: 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 }}
CI/CD最佳实践:
  • 使用
    --remote-only
    标志在Fly.io服务器上构建
  • 分离预发布和生产环境工作流
  • 部署后实施冒烟测试
  • 配置Slack/Discord通知部署状态
  • 使用GitHub环境实现生产部署的审批环节

9. Monitoring and Troubleshooting

9. 监控与故障排查

Essential Monitoring Commands:
bash
undefined
核心监控命令:
bash
undefined

Check application status

检查应用状态

flyctl status -a {project-name}
flyctl status -a {项目名称}

View real-time logs

查看实时日志

flyctl logs -a {project-name}
flyctl logs -a {项目名称}

View logs with filtering

过滤查看日志

flyctl logs -a {project-name} --region iad
flyctl logs -a {项目名称} --region iad

Check database status

检查数据库状态

flyctl status -a {project-name}-db
flyctl status -a {项目名称}-db

View metrics

查看指标

flyctl metrics -a {project-name}
flyctl metrics -a {项目名称}

SSH into application

SSH进入应用

flyctl ssh console -a {project-name}

**Common Issues and Solutions:**

1. **Port Configuration Problems:**
   - Verify `fly.toml` internal_port matches application PORT
   - Ensure HOST is set to "::" for IPv6 compatibility
   - Check APP_URL matches deployed domain/URL

2. **Database Connection Failures:**
   - Verify DATABASE_URL format and credentials
   - Check database is in same region as app
   - Test connection via proxy: `flyctl proxy 5433 -a {project-name}-db`
   - Review database logs: `flyctl logs -a {project-name}-db`

3. **Environment Variable Issues:**
   - Verify secrets are set: `flyctl secrets list -a {project-name}`
   - Check production values in .env before encryption
   - Ensure ENV_PASS is correct when decrypting
   - Re-import secrets after changes: `flyctl secrets import`

4. **Deployment Failures:**
   - Review build logs: `flyctl logs -a {project-name}`
   - Check Dockerfile or buildpack configuration
   - Verify all dependencies in package.json/requirements.txt
   - Test build locally before deploying
   - Increase build timeout if needed

5. **Application Crashes:**
   - Check logs for error messages: `flyctl logs -a {project-name}`
   - Verify health check endpoint is responding
   - Review resource allocation (memory, CPU)
   - Check for database connection issues
   - SSH into container to debug: `flyctl ssh console -a {project-name}`
flyctl ssh console -a {项目名称}

**常见问题与解决方案:**

1. **端口配置问题:**
   - 验证`fly.toml`中的internal_port与应用PORT匹配
   - 确保HOST设置为"::"以支持IPv6
   - 检查APP_URL与部署的域名/URL匹配

2. **数据库连接失败:**
   - 验证DATABASE_URL格式和凭证
   - 检查数据库与应用是否在同一区域
   - 通过代理测试连接:`flyctl proxy 5433 -a {项目名称}-db`
   - 查看数据库日志:`flyctl logs -a {项目名称}-db`

3. **环境变量问题:**
   - 验证密钥已设置:`flyctl secrets list -a {项目名称}`
   - 加密前检查.env中的生产环境值
   - 解密时确保ENV_PASS正确
   - 修改后重新导入密钥:`flyctl secrets import`

4. **部署失败:**
   - 查看构建日志:`flyctl logs -a {项目名称}`
   - 检查Dockerfile或buildpack配置
   - 验证package.json/requirements.txt中的所有依赖项
   - 部署前先在本地测试构建
   - 必要时延长构建超时时间

5. **应用崩溃:**
   - 查看日志中的错误信息:`flyctl logs -a {项目名称}`
   - 验证健康检查端点是否响应
   - 查看资源分配(内存、CPU)
   - 检查数据库连接问题
   - SSH进入容器调试:`flyctl ssh console -a {项目名称}`

10. Scaling and Performance

10. 扩容与性能优化

Vertical Scaling (Resource Allocation):
bash
undefined
垂直扩容(资源分配):
bash
undefined

Scale VM resources

调整VM资源

flyctl scale vm shared-cpu-1x --memory 512 -a {project-name}
flyctl scale vm shared-cpu-1x --memory 512 -a {项目名称}

Available VM sizes:

可用VM规格:

shared-cpu-1x (256MB, 512MB, 1GB, 2GB)

shared-cpu-1x(256MB、512MB、1GB、2GB)

dedicated-cpu-1x (2GB, 4GB, 8GB)

dedicated-cpu-1x(2GB、4GB、8GB)

dedicated-cpu-2x (4GB, 8GB, 16GB)

dedicated-cpu-2x(4GB、8GB、16GB)


**Horizontal Scaling (Machine Count):**

```bash

**水平扩容(机器数量):**

```bash

Scale number of machines

调整机器数量

flyctl scale count 2 -a {project-name}
flyctl scale count 2 -a {项目名称}

Auto-scaling configuration in fly.toml:

在fly.toml中配置自动扩容:

[http_service] auto_stop_machines = true auto_start_machines = true min_machines_running = 0 # Scale to zero when idle

**Regional Deployment:**

```bash
[http_service] auto_stop_machines = true auto_start_machines = true min_machines_running = 0 # 空闲时缩容至0

**多区域部署:**

```bash

Add machines in multiple regions

在多个区域添加机器

flyctl regions add iad lhr syd -a {project-name}
flyctl regions add iad lhr syd -a {项目名称}

View current regions

查看当前区域

flyctl regions list -a {project-name}
flyctl regions list -a {项目名称}

Remove regions

删除区域

flyctl regions remove lhr -a {project-name}
undefined
flyctl regions remove lhr -a {项目名称}
undefined

11. Cost Optimization

11. 成本优化

Strategies for Reducing Costs:
  1. Auto-stop/Auto-start: Enable in fly.toml to scale to zero during idle periods
  2. Right-size Resources: Start with smallest VM size, scale up only if needed
  3. Database Optimization: Choose appropriate PostgreSQL tier, monitor usage
  4. Regional Strategy: Deploy only in regions with active users
  5. Monitoring: Set up billing alerts in Fly.io dashboard
Cost Monitoring:
bash
undefined
降低成本策略:
  1. 自动启停:在fly.toml中启用,空闲时缩容至0
  2. 合理配置资源:从最小VM规格开始,仅在需要时扩容
  3. 数据库优化:选择合适的PostgreSQL层级,监控使用情况
  4. 区域策略:仅在有活跃用户的区域部署
  5. 监控:在Fly.io控制台设置账单告警
成本监控:
bash
undefined

View current usage and costs

查看当前使用情况和成本

flyctl dashboard
flyctl dashboard

Check resource allocation

检查资源分配

flyctl status -a {project-name} flyctl status -a {project-name}-db
undefined
flyctl status -a {项目名称} flyctl status -a {项目名称}-db
undefined

Supporting Files

支持文件

This skill includes supporting templates:
  • fly.toml.template: Basic Fly.io configuration template
  • deployment-checklist.md: Pre-deployment verification checklist
  • github-actions-workflow.yml: Sample CI/CD workflow
Access these via:
.claude/skills/flyio-deployment/templates/
本技能包含以下支持模板:
  • fly.toml.template:基础Fly.io配置模板
  • deployment-checklist.md:部署前验证清单
  • github-actions-workflow.yml:示例CI/CD工作流
通过以下路径访问:
.claude/skills/flyio-deployment/templates/

Common Deployment Patterns

常见部署模式

Pattern 1: Initial Production Deployment

模式1:初始生产部署

bash
undefined
bash
undefined

1. Setup and authenticate

1. 设置与认证

flyctl auth login
flyctl auth login

2. Create database

2. 创建数据库

flyctl postgres create # Use {project-name}-db
flyctl postgres create # 使用{项目名称}-db

3. Launch application

3. 启动应用

flyctl launch # Don't deploy yet
flyctl launch # 暂不部署

4. Attach database

4. 关联数据库

flyctl pg attach {project-name}-db -a {project-name}
flyctl pg attach {项目名称}-db -a {项目名称}

5. Set secrets

5. 设置密钥

flyctl secrets import -a {project-name} < .env
flyctl secrets import -a {项目名称} < .env

6. Deploy

6. 部署

flyctl deploy -a {project-name}
flyctl deploy -a {项目名称}

7. Verify

7. 验证

flyctl open -a {project-name} flyctl logs -a {project-name}
undefined
flyctl open -a {项目名称} flyctl logs -a {项目名称}
undefined

Pattern 2: Database Migration

模式2:数据库迁移

bash
undefined
bash
undefined

Export from source

从源数据库导出

pg_dump -Fc --no-acl --no-owner -h {source-host} -U {user} -d {db} > migration.dump
pg_dump -Fc --no-acl --no-owner -h {源主机} -U {用户} -d {数据库} > migration.dump

Proxy Fly.io database

代理Fly.io数据库

flyctl proxy 5433 -a {project-name}-db # Separate terminal
flyctl proxy 5433 -a {项目名称}-db # 单独终端运行

Import to Fly.io

导入至Fly.io

pg_restore --verbose --clean --no-acl --no-owner
-h localhost -p 5433 -U {user} -d {db} migration.dump
pg_restore --verbose --clean --no-acl --no-owner
-h localhost -p 5433 -U {用户} -d {数据库} migration.dump

Verify

验证

flyctl ssh console -a {project-name}
flyctl ssh console -a {项目名称}

Inside container: run database query to verify data

在容器内:执行数据库查询验证数据

undefined
undefined

Pattern 3: Rollback Deployment

模式3:回滚部署

bash
undefined
bash
undefined

List recent releases

查看最近版本

flyctl releases -a {project-name}
flyctl releases -a {项目名称}

Rollback to previous version

回滚至上一版本

flyctl releases rollback -a {project-name}
flyctl releases rollback -a {项目名称}

Or rollback to specific version

或回滚至指定版本

flyctl releases rollback {version-number} -a {project-name}
flyctl releases rollback {版本号} -a {项目名称}

Monitor rollback

监控回滚过程

flyctl logs -a {project-name}
undefined
flyctl logs -a {项目名称}
undefined

Security Best Practices

安全最佳实践

  1. Environment Encryption: Always encrypt .env files before committing
  2. Database Access: Use database proxying instead of exposing publicly
  3. API Tokens: Store Fly.io API tokens in GitHub secrets, never in code
  4. SSL Certificates: Always enable force_https in fly.toml
  5. Database Backups: Implement automated backup strategy (S3, external storage)
  6. Secrets Rotation: Regularly rotate API tokens, database passwords, encryption keys
  7. Access Control: Use Fly.io organizations for team access management
  8. Network Security: Configure firewall rules, restrict database access
  1. 环境加密:提交前始终加密.env文件
  2. 数据库访问:使用数据库代理而非公开暴露
  3. API令牌:将Fly.io API令牌存储在GitHub密钥中,绝不要放在代码里
  4. SSL证书:始终在fly.toml中启用force_https
  5. 数据库备份:实施自动化备份策略(S3、外部存储)
  6. 密钥轮换:定期轮换API令牌、数据库密码、加密密钥
  7. 访问控制:使用Fly.io组织管理团队访问权限
  8. 网络安全:配置防火墙规则,限制数据库访问

Validation Checklist

验证清单

Before considering deployment complete:
  • Application accessible via public URL
  • Health check endpoint responding correctly
  • Database connection working
  • All environment variables set correctly
  • SSL certificate issued and active
  • Logs showing no errors
  • CI/CD pipeline configured and tested
  • Database backups configured
  • Monitoring and alerting set up
  • Documentation updated with deployment URLs and procedures
部署完成前需确认:
  • 应用可通过公共URL访问
  • 健康检查端点响应正常
  • 数据库连接正常
  • 所有环境变量设置正确
  • SSL证书已颁发并激活
  • 日志无错误
  • CI/CD流水线已配置并测试
  • 数据库备份已配置
  • 监控与告警已设置
  • 文档已更新部署URL和流程

Real-World Gotchas (learned the hard way)

实战经验总结(踩坑所得)

High-Risk Account Lock

高风险账户锁定

Fly.io flags dormant accounts as "high risk". Creating apps/DBs fails with:
Your account has been marked as high risk. Please go to https://fly.io/high-risk-unlock
Fix: Must visit the URL in a browser logged into the Fly account. CLI cannot bypass this.
Fly.io会将休眠账户标记为“高风险”。创建应用/数据库时会失败并提示:
Your account has been marked as high risk. Please go to https://fly.io/high-risk-unlock
解决方法:必须在登录Fly账户的浏览器中访问该链接。CLI无法绕过此限制。

Auto-Stop Is Aggressive

自动启停过于激进

With
auto_stop_machines = "stop"
and
min_machines_running = 0
, machines stop after ~60s idle. Some frameworks take 5-10s to cold boot. This means:
  • First request after idle gets a slow response (wake + boot)
  • Rapid sequential API calls may hit a stopped machine between calls
  • Always hit
    /_health
    and wait for 204 before running batch operations
当设置
auto_stop_machines = "stop"
min_machines_running = 0
时,机器会在闲置约60秒后停止。部分框架冷启动需要5-10秒,这意味着:
  • 闲置后的第一个请求响应缓慢(唤醒+启动)
  • 连续快速的API调用可能在调用间隙遇到已停止的机器
  • 执行批量操作前,务必先访问
    /_health
    并等待204响应

Fly Creates 2 Machines by Default

Fly默认创建2台机器

Even with
min_machines_running = 0
,
fly deploy
creates 2 machines for "HA". For dev/staging, destroy the second one:
bash
fly status --app <app>  # Find both machine IDs
fly machine stop <second-id> --app <app>
fly machine destroy <second-id> --app <app> --force
即使设置
min_machines_running = 0
fly deploy
仍会创建2台机器以实现“高可用”。对于开发/预发布环境,可销毁第二台机器:
bash
fly status --app <app>  # 找到两台机器的ID
fly machine stop <第二台ID> --app <app>
fly machine destroy <第二台ID> --app <app> --force

DATABASE_SSL Must Be False on Internal Network

内部网络中DATABASE_SSL必须设为False

fly postgres attach
sets
DATABASE_URL
with
sslmode=disable
. If your app has a
DATABASE_SSL
env var, set it to
false
:
toml
[env]
  DATABASE_SSL = "false"
fly postgres attach
设置的
DATABASE_URL
包含
sslmode=disable
。如果你的应用有
DATABASE_SSL
环境变量,需将其设为
false
toml
[env]
  DATABASE_SSL = "false"

DNS + Cert Setup (Cloudflare)

DNS + 证书设置(Cloudflare)

When using Cloudflare for DNS:
  1. Records must be unproxied (
    proxied=false
    ) — Fly needs direct traffic for TLS termination
  2. Check for stale records — old deployments may have left proxied A/AAAA records. Delete them first.
  3. ACME CNAME
    fly certs setup
    gives you a
    _acme-challenge
    CNAME target. Create/update it for Let's Encrypt validation.
  4. Cert issuance is fast (~30s) once DNS is correct.
使用Cloudflare进行DNS配置时:
  1. 记录必须设为非代理模式
    proxied=false
    )——Fly需要直接流量以终止TLS
  2. 检查过期记录——旧部署可能留下代理模式的A/AAAA记录,需先删除
  3. ACME CNAME——
    fly certs setup
    会提供
    _acme-challenge
    的CNAME目标,需创建/更新以完成Let's Encrypt验证
  4. DNS配置正确后,证书颁发速度很快(约30秒)

Deploy Flag: No
--region

部署标志:无
--region
选项

Use
--primary-region
or set
primary_region
in
fly.toml
. The flag
--region
does not exist on
fly deploy
.
使用
--primary-region
或在
fly.toml
中设置
primary_region
fly deploy
命令不存在
--region
标志。

Bash Token Piping Bug

Bash令牌管道Bug

Long API tokens (256+ chars) cause empty stdout when piped through bash variable expansion + curl. Workarounds:
  • Store token in a file:
    echo -n "TOKEN" > /tmp/.token && TK=$(cat /tmp/.token)
  • Use curl with
    -o file
    instead of piping
  • Use Python
    urllib.request
    (most reliable in sandbox environments)
长API令牌(256+字符)在通过bash变量展开+curl管道传输时会导致标准输出为空。解决方法:
  • 将令牌存储在文件中:
    echo -n "TOKEN" > /tmp/.token && TK=$(cat /tmp/.token)
  • 使用curl的
    -o file
    选项而非管道
  • 使用Python
    urllib.request
    (在沙箱环境中最可靠)

Additional Resources

额外资源

Notes

注意事项

  • Always test deployments in staging environment before production
  • Keep flyctl CLI updated:
    flyctl version update
  • Monitor Fly.io status page for platform incidents
  • Join Fly.io community for support and best practices
  • Consider using Fly.io's managed PostgreSQL for production workloads
  • 生产部署前务必在预发布环境测试
  • 保持flyctl CLI更新:
    flyctl version update
  • 监控Fly.io状态页面了解平台事件
  • 加入Fly.io社区获取支持和最佳实践
  • 生产工作负载建议使用Fly.io托管的PostgreSQL