fly-io
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseFly.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
核心原则
- Security First: Always encrypt sensitive data, never commit unencrypted secrets
- Database Safety: Use proxying for database access, maintain regular backups
- Environment Isolation: Separate development, staging, and production configurations
- Cost Awareness: Optimize resource allocation, monitor usage regularly
- Automation: Leverage CI/CD for consistent, repeatable deployments
- Monitoring: Implement comprehensive logging and health checks
- 安全优先:始终加密敏感数据,绝不提交未加密的密钥
- 数据库安全:使用代理访问数据库,定期执行备份
- 环境隔离:分离开发、预发布和生产环境配置
- 成本意识:优化资源分配,定期监控使用情况
- 自动化:利用CI/CD实现一致、可重复的部署流程
- 监控:实施全面的日志记录和健康检查
Prerequisites
前置条件
Before beginning Fly.io deployment:
- Fly.io Account: Active account with credit card attached (required for PostgreSQL)
- CLI Installation: command-line tool installed and authenticated
flyctl - Environment Variables: Project-specific configuration ready
- Application Ready: Application configured for production deployment
开始Fly.io部署前需满足:
- Fly.io账户:已激活且绑定信用卡(PostgreSQL服务必填)
- CLI安装:已安装并认证命令行工具
flyctl - 环境变量:准备好项目专属配置
- 应用就绪:应用已配置为可用于生产部署
Instructions
操作指南
1. Initial Setup and Authentication
1. 初始设置与认证
Install Fly.io CLI:
bash
undefined安装Fly.io CLI:
bash
undefinedStandard installation
标准安装
curl -L https://fly.io/install.sh | sh
curl -L https://fly.io/install.sh | sh
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 loginThis 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
undefinedDecrypt 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 presentopenssl 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
undefinedCreate 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"后缀
**将数据库关联至应用:**
```bashAttach 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:**
```bashflyctl secrets set DATABASE_URL=postgres://user:pass@host:5432/dbname -a {项目名称}
**验证数据库连接:**
```bashCheck 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 {数据库名}
undefinedundefined4. Application Creation and Configuration
4. 应用创建与配置
Launch New Application:
bash
undefined启动新应用:
bash
undefinedCreate 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 = 0Set 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
undefinedSet 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
undefinedflyctl secrets import -a {项目名称} < .env
undefined5. Deployment Workflow
5. 部署流程
Pre-Deployment Checklist:
- Environment variables configured (production values)
- Database created and attached
- reviewed and customized
fly.toml - Secrets set via
flyctl secrets - Application builds successfully locally
- Dependencies are production-ready
Initial Deployment:
bash
undefined部署前检查清单:
- 环境变量已配置(生产环境值)
- 数据库已创建并关联
- 已查看并自定义
fly.toml - 已通过设置密钥
flyctl secrets - 应用可在本地成功构建
- 依赖项已准备好用于生产环境
初始部署:
bash
undefinedDeploy 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:**
```bashflyctl status -a {项目名称}
**部署后验证:**
```bashOpen 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}
undefinedflyctl logs -a {项目名称}
undefined6. Domain and SSL Configuration
6. 域名与SSL配置
Add Custom Domain:
bash
undefined添加自定义域名:
bash
undefinedAdd 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 configurationflyctl 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
undefinedPostgreSQL备份(导出):
bash
undefinedStandard 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:**
```bashpg_dump -Fc --no-acl --no-owner -h localhost -U postgres -d strapi > backup.dump
**PostgreSQL恢复:**
```bashStandard 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:**
```bashpg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d strapi backup.dump
**将本地数据库上传至Fly.io:**
```bash1. 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:**
```bashrm latest.dump
**从Fly.io下载生产数据库:**
```bash1. 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:**
```bashrm production.dump
**数据库代理用于直接访问:**
```bashProxy 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控制台获取}
undefinedundefined8. GitHub Actions CI/CD Integration
8. GitHub Actions CI/CD集成
Setup Continuous Deployment:
-
Generate Fly.io API token:bash
flyctl auth token -
Add GitHub repository secrets:
- : Your Fly.io API token
FLY_API_TOKEN - : Environment encryption password (if using encrypted .env)
ENV_PASS
-
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 flag to build on Fly.io servers
--remote-only - 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
设置持续部署:
-
生成Fly.io API令牌:bash
flyctl auth token -
添加GitHub仓库密钥:
- : 你的Fly.io API令牌
FLY_API_TOKEN - : 环境加密密码(如果使用加密的.env)
ENV_PASS
-
创建:
.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最佳实践:
- 使用标志在Fly.io服务器上构建
--remote-only - 分离预发布和生产环境工作流
- 部署后实施冒烟测试
- 配置Slack/Discord通知部署状态
- 使用GitHub环境实现生产部署的审批环节
9. Monitoring and Troubleshooting
9. 监控与故障排查
Essential Monitoring Commands:
bash
undefined核心监控命令:
bash
undefinedCheck 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
undefinedScale 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
**水平扩容(机器数量):**
```bashScale 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
**多区域部署:**
```bashAdd 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}
undefinedflyctl regions remove lhr -a {项目名称}
undefined11. Cost Optimization
11. 成本优化
Strategies for Reducing Costs:
- Auto-stop/Auto-start: Enable in fly.toml to scale to zero during idle periods
- Right-size Resources: Start with smallest VM size, scale up only if needed
- Database Optimization: Choose appropriate PostgreSQL tier, monitor usage
- Regional Strategy: Deploy only in regions with active users
- Monitoring: Set up billing alerts in Fly.io dashboard
Cost Monitoring:
bash
undefined降低成本策略:
- 自动启停:在fly.toml中启用,空闲时缩容至0
- 合理配置资源:从最小VM规格开始,仅在需要时扩容
- 数据库优化:选择合适的PostgreSQL层级,监控使用情况
- 区域策略:仅在有活跃用户的区域部署
- 监控:在Fly.io控制台设置账单告警
成本监控:
bash
undefinedView current usage and costs
查看当前使用情况和成本
flyctl dashboard
flyctl dashboard
Check resource allocation
检查资源分配
flyctl status -a {project-name}
flyctl status -a {project-name}-db
undefinedflyctl status -a {项目名称}
flyctl status -a {项目名称}-db
undefinedSupporting 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
undefinedbash
undefined1. 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}
undefinedflyctl open -a {项目名称}
flyctl logs -a {项目名称}
undefinedPattern 2: Database Migration
模式2:数据库迁移
bash
undefinedbash
undefinedExport 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
-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
-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
在容器内:执行数据库查询验证数据
undefinedundefinedPattern 3: Rollback Deployment
模式3:回滚部署
bash
undefinedbash
undefinedList 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}
undefinedflyctl logs -a {项目名称}
undefinedSecurity Best Practices
安全最佳实践
- Environment Encryption: Always encrypt .env files before committing
- Database Access: Use database proxying instead of exposing publicly
- API Tokens: Store Fly.io API tokens in GitHub secrets, never in code
- SSL Certificates: Always enable force_https in fly.toml
- Database Backups: Implement automated backup strategy (S3, external storage)
- Secrets Rotation: Regularly rotate API tokens, database passwords, encryption keys
- Access Control: Use Fly.io organizations for team access management
- Network Security: Configure firewall rules, restrict database access
- 环境加密:提交前始终加密.env文件
- 数据库访问:使用数据库代理而非公开暴露
- API令牌:将Fly.io API令牌存储在GitHub密钥中,绝不要放在代码里
- SSL证书:始终在fly.toml中启用force_https
- 数据库备份:实施自动化备份策略(S3、外部存储)
- 密钥轮换:定期轮换API令牌、数据库密码、加密密钥
- 访问控制:使用Fly.io组织管理团队访问权限
- 网络安全:配置防火墙规则,限制数据库访问
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 and , machines stop after ~60s idle. Some frameworks take 5-10s to cold boot. This means:
auto_stop_machines = "stop"min_machines_running = 0- First request after idle gets a slow response (wake + boot)
- Rapid sequential API calls may hit a stopped machine between calls
- Always hit and wait for 204 before running batch operations
/_health
当设置和时,机器会在闲置约60秒后停止。部分框架冷启动需要5-10秒,这意味着:
auto_stop_machines = "stop"min_machines_running = 0- 闲置后的第一个请求响应缓慢(唤醒+启动)
- 连续快速的API调用可能在调用间隙遇到已停止的机器
- 执行批量操作前,务必先访问并等待204响应
/_health
Fly Creates 2 Machines by Default
Fly默认创建2台机器
Even with , creates 2 machines for "HA". For dev/staging, destroy the second one:
min_machines_running = 0fly deploybash
fly status --app <app> # Find both machine IDs
fly machine stop <second-id> --app <app>
fly machine destroy <second-id> --app <app> --force即使设置,仍会创建2台机器以实现“高可用”。对于开发/预发布环境,可销毁第二台机器:
min_machines_running = 0fly deploybash
fly status --app <app> # 找到两台机器的ID
fly machine stop <第二台ID> --app <app>
fly machine destroy <第二台ID> --app <app> --forceDATABASE_SSL Must Be False on Internal Network
内部网络中DATABASE_SSL必须设为False
fly postgres attachDATABASE_URLsslmode=disableDATABASE_SSLfalsetoml
[env]
DATABASE_SSL = "false"fly postgres attachDATABASE_URLsslmode=disableDATABASE_SSLfalsetoml
[env]
DATABASE_SSL = "false"DNS + Cert Setup (Cloudflare)
DNS + 证书设置(Cloudflare)
When using Cloudflare for DNS:
- Records must be unproxied () — Fly needs direct traffic for TLS termination
proxied=false - Check for stale records — old deployments may have left proxied A/AAAA records. Delete them first.
- ACME CNAME — gives you a
fly certs setupCNAME target. Create/update it for Let's Encrypt validation._acme-challenge - Cert issuance is fast (~30s) once DNS is correct.
使用Cloudflare进行DNS配置时:
- 记录必须设为非代理模式()——Fly需要直接流量以终止TLS
proxied=false - 检查过期记录——旧部署可能留下代理模式的A/AAAA记录,需先删除
- ACME CNAME——会提供
fly certs setup的CNAME目标,需创建/更新以完成Let's Encrypt验证_acme-challenge - DNS配置正确后,证书颁发速度很快(约30秒)
Deploy Flag: No --region
--region部署标志:无--region
选项
--regionUse or set in . The flag does not exist on .
--primary-regionprimary_regionfly.toml--regionfly deploy使用或在中设置。命令不存在标志。
--primary-regionfly.tomlprimary_regionfly deploy--regionBash 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 instead of piping
-o file - Use Python (most reliable in sandbox environments)
urllib.request
长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