部署上线
Fly.io 部署指南
全球边缘部署,支持多区域,适合需要低延迟的应用
Fly.io 将应用部署到全球边缘节点,用户访问时自动路由到最近的服务器。
为什么选择 Fly.io
- 全球边缘:应用运行在离用户最近的数据中心
- 支持多语言:Node.js、Python、Go、Ruby、Elixir 等
- 内置数据库:PostgreSQL、Redis
- Docker 原生:基于 Docker 容器
- 免费额度:3 个共享 CPU VM,3GB 持久化存储
快速部署
安装 flyctl
# macOS
brew install flyctl
# Linux
curl -L https://fly.io/install.sh | sh
# Windows
iwr https://fly.io/install.ps1 -useb | iex登录
flyctl auth login部署应用
# 在项目目录执行
flyctl launch
# 按提示选择:
# - 应用名称
# - 区域(选择离用户最近的)
# - 是否需要 PostgreSQL 数据库
# - 是否需要 Redis
# 部署
flyctl deploy配置文件
flyctl launch 会生成 fly.toml:
app = "my-app"
primary_region = "hkg" # 香港
[build]
builder = "heroku/buildpacks:20"
[env]
PORT = "8080"
[[services]]
http_checks = []
internal_port = 8080
protocol = "tcp"
[[services.ports]]
port = 80
handlers = ["http"]
[[services.ports]]
port = 443
handlers = ["tls", "http"]使用 Dockerfile
如果项目有 Dockerfile,Fly.io 自动使用:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["npm", "start"]配置环境变量
# 设置环境变量
flyctl secrets set API_KEY=your_secret_key
# 查看已设置的变量
flyctl secrets list
# 删除变量
flyctl secrets unset API_KEY添加数据库
PostgreSQL
# 创建 PostgreSQL 集群
flyctl postgres create
# 连接到应用
flyctl postgres attach --app my-app my-postgres自动设置 DATABASE_URL 环境变量。
Redis
# 创建 Redis
flyctl redis create
# 连接到应用
flyctl redis attach --app my-app my-redis多区域部署
将应用部署到多个区域,用户自动路由到最近的:
# 查看可用区域
flyctl platform regions
# 添加区域
flyctl regions add hkg sin nrt # 香港、新加坡、东京
# 扩展实例
flyctl scale count 3自定义域名
# 添加域名
flyctl certs add example.com
# 查看 DNS 配置
flyctl certs show example.com配置 DNS:
A @ 66.241.124.xxx
AAAA @ 2a09:8280:1::xxx查看日志
# 实时日志
flyctl logs
# 查看特定实例
flyctl logs -i instance-id监控和扩容
# 查看应用状态
flyctl status
# 查看资源使用
flyctl dashboard
# 扩展内存和 CPU
flyctl scale vm shared-cpu-2x --memory 512
# 扩展实例数量
flyctl scale count 3定价
免费额度:
- 3 个共享 CPU VM(256MB 内存)
- 3GB 持久化存储
- 160GB 出站流量/月
超出后按量付费:
- 共享 CPU:$1.94/月
- 专用 CPU:$0.02/小时
- 内存:$0.0000022/MB/秒
常见问题
应用启动失败
检查:
- Dockerfile 是否正确
- 端口配置(Fly.io 使用
PORT环境变量) - 健康检查是否通过
如何设置健康检查
在 fly.toml 中:
[[services.http_checks]]
interval = 10000
grace_period = "5s"
method = "get"
path = "/health"
protocol = "http"
timeout = 2000数据库连接慢
- 确保数据库和应用在同一区域
- 使用内部网络连接(
.internal域名)
进阶:使用 Fly Machines
Fly Machines 是按需启动的容器,适合间歇性任务:
# 创建 Machine
flyctl machine run . --region hkg
# 停止 Machine
flyctl machine stop machine-id