目录

简介

Fly.io 是一个应用程序托管平台,创立于 2017 年。总部在芝加哥,目前团队不到 40 人,几乎全是开发人员,大部分时间远程工作。

其业务近年增长势头很猛,还收编了 Litestream 项目 1

上月底宣布完成 B 轮融资,算上之前的种子轮和 A 轮,目前融资总额达到 4050 万美元。A 轮由 Intel Capital 领投 2 3,B 轮由 a16z 领投 4

那么 Fly 到底是干什么的?来看看他们自己在最初的 YC 申请中的部分回答 5

用不超过 50 个字符描述你的公司是做什么的。

  • 全球 Heroku

你的公司要做什么?请描述你的产品及其作用,或将要做什么。

  • 我们正在构建全球托管服务。开发人员打包他们的项目,使用我们的 CLI 发布它,然后我们在他们拥有用户的任何城市扩大和缩小它。

很好,言简意赅,乍一看好像跟其他 PaaS 云平台没什么不同,不过它也有 Free Tier 6,所以我还是想深入了解一下。(不然怎么薅羊毛 😎)

个人浅见

Fly 的基本架构是在世界各地的托管设施中部署他们自己的服务器硬件,这些服务器通过一个内部 WireGuard 网络完全互联,使用 Nomad 作为控制平面进行编排调度(更新:Apps V2 不再由 Nomad 协调 7,转为他们自己开发的 flyd 8);网络方面运行一个基于 Rust 的负载均衡器来处理几乎所有的流量,使用 BGP Anycast 路由将流量引导至 Fly 的网络边缘,再通过 WireGuard 将到达边缘服务器的流量路由至最近的工作服务器/应用程序实例。

在浏览了 Fly 网站上的所有 博客文章 后,梳理一下我对 Fly 的理解:

  • 一个 Docker 容器的应用交付网络(ADN)
    • 可以使用 Dockerfile 和 Fly 的远程构建器来构建包含应用程序及其环境的镜像
    • 也可以指向预构建的 Docker 镜像
  • 一个可以运行全栈应用程序和数据库的平台
    • 无论是简单的 Web 服务还是数据库支持的大作
    • 可附加持久存储
    • 可自动创建分布式 PostgreSQL 集群(并不是完全托管的数据库服务)
  • 支持几乎所有语言和框架,可远程自动构建
    • fly launch 可以扫描你的源代码并配置你的项目以在 Fly 上部署
    • Fly 的构建器将在部署时构建应用程序的 Docker 镜像
  • 应用程序代码运行在 Firecracker microVM 中
    • Firecracker 是一种开源的虚拟化技术,专门用于创建和管理安全的多租户容器和基于功能的服务;由 AWS 开发,旨在改善 AWS Lambda 和 AWS Fargate 等服务
    • Fly 可将你的容器应用转化为 Firecracker microVMs
  • 通过将应用程序停放在用户附近来加快访问速度
    • 业界称之为 “边缘计算”,作为加快 Web App 速度的一种方式
    • 在“边缘”处理 TLS 终止,减少延迟
    • HTTP2 和 Brotli 压缩,可以更快地发送数据
    • 裸机服务器上的高性能 microVM
  • 拥有自己的硬件,不构建于其他云之上
    • 部署在全球一些大城市的数据中心,不断增加中
  • 连接到一个 WireGuard 支持的 Anycast 网络
    • 该网络帮你在靠近用户的地方运行你的应用
    • 网络中主机之间的连接完全通过 WireGuard 进行
  • 通过 6PN 专网(IPv6 Private Networks),让应用程序之间可以安全地相互通信
    • 相当于一个简单的 IPv6 版本的 AWS VPC
  • WireGuard Peering,可以将私有 IPv6 网络与其他网络安全地连接起来
    • 意味着你可以从你的开发机器上安全、私密的直连到你的生产网络
    • 或使用它将外部网络和应用程序安全地接入 Fly
  • 快速全球化部署
    • 帮助开发者将应用程序部署在更靠近用户的地方
  • 自动扩展管理全局负载
    • 基于区域池
    • 有两种扩展模型,标准和平衡
  • 自动获得 TLS 证书(来自 Let’s Encrypt)
    • 对于 <your-app-name>.fly.dev 域名来说是自动的
    • 也可以为任何自定义域名启用,只需要改变 DNS 记录
  • 一切操作以命令行为先
    • 使用命令行进行所有操作,涵盖了在 Fly 上部署应用程序的整个生命周期
    • Web 界面主要用于显示仪表板和各种指标
  • “比 ECS 或 K8s 更容易上手”,应该吧

总之

Fly 通过边缘网络在全球范围内运行你的应用程序,这些数据中心离你的用户很近,并且为更快的 TLS 处理进行了优化。所以,在 Fly 上托管的应用程序理论上访问速度应该很快,因为它们是在靠近用户的机器上运行。Fly 同样提供全局 IP 地址给你使用,并为你处理所有的路由。用户的请求将自动降落在 Fly 网络中最近的数据中心。

Fly 的命令行执行任务简单直接,flyctl 使用 Docker 的工具将 OCI 镜像推送到 Fly,接着编排系统将消息发送到服务器以将这些 OCI 镜像转换为 Firecracker 虚拟机。这样,它们就可以被部署到 Fly 的全球边缘网络的快速 TLS 节点。在 Fly 上部署应用也可以很好地扩展,从小型 Web 应用到大型密集型应用。你也应该能够以接近免费的方式运行一个业余项目。👏️

简而言之:“一个新的公有云,建立在世界各地的数据中心运行的裸机服务器上,旨在让分布式和实时应用程序更轻松地在全球范围内交付,具有尽可能高的可用性和尽可能低的延迟,以及出色的开发者用户体验。”

用起来

安装 flyctl

$ curl -L https://fly.io/install.sh | sh
$ sudo ln -sf $HOME/.fly/bin/fly /usr/local/bin/fly
$ sudo ln -sf $HOME/.fly/bin/flyctl /usr/local/bin/flyctl

注册 & 登录

需要提供有效的信用卡付款信息

$ fly auth signup
$ fly auth login

自托管 RSS 聚合服务

记录一下我在 Fly 上搭的一个给自己用的 RSS 阅读器的步骤:

感谢开源项目 yarr

  1. 创建并配置应用
$ mkdir -p flyio/apps && cd $_
$ git clone https://github.com/nkanaev/yarr.git
$ cd yarr

$ fly launch --name yarr-nrt -r nrt --dockerfile dockerfile
$ fly volumes create yarr_data -r nrt -s 1
$ fly ips allocate-v4
$ fly secrets set YARR_AUTH="youfeng:********"

$ nano fly.toml

app = "yarr-nrt"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[build]
  dockerfile = "dockerfile"

[env]

[experimental]
  auto_rollback = true

[mounts]
  source="yarr_data"
  destination="/data"

[[services]]
  http_checks = []
  internal_port = 7070
  processes = ["app"]
  protocol = "tcp"
  script_checks = []
  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"

  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80
  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 0
    timeout = "2s"
  1. 部署应用
$ fly deploy

成功部署的话,通过 fly open 可以自动打开浏览器访问应用的 URL(类似 https://app.fly.dev/ ,该地址只是举例,如果能访问,纯属巧合)。

到这里其实就已经完活儿了,就这么简单~

当然,如果你想用你自己的域名来访问应用,添加 DNS 记录和配置证书就好了。

  1. 其他常用命令

比如,检查应用部署日志、状态、IP、端口、卷、变量、证书等。

$ fly logs
$ fly info
$ fly status
$ fly ips list
$ fly volumes list
$ fly secrets list
$ fly services list
$ fly certs create <not-tell-you>.youfeng.me
$ fly certs show <not-tell-you>.youfeng.me
$ fly certs check <not-tell-you>.youfeng.me
$ fly certs list
$ fly certs delete <not-tell-you>.youfeng.me
$ fly ssh console -C df