---
title: "Fly.io"
description: "Global application platform enabling developers to deploy and scale applications with edge computing capabilities."
---

# Fly.io
> Global application platform enabling developers to deploy and scale applications with edge computing capabilities.

## Articles

### [Persistent Storage and Fast Remote Builds](https://yomu.fyi/post/persistent-storage-and-fast-remote-builds.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 15, 2021
- Type: Announcement

Fly introduces persistent volumes for apps and a new remote-build path designed to make Docker image builds faster. Volumes are created through flyctl, backed by encrypted ext4 filesystems on Linux LVM2 thin pools, and attached one-to-one with app instances on compatible hosts. Volumes survive reboots and deployments and are described as performance-competitive with, usually slightly faster than, EBS, but raw-volume resilience remains the customer’s responsibility. Because volume count limits instance count and prevents an extra canary volume, volume-backed apps use rolling deployments; the post identifies replicated database clusters, caches, metrics, and restorable data as suitable cases. Remote builds now match jobs to automatically created builder apps with attached storage for cached layers and manifests; builders expose authenticated Docker servers, terminate after 10 minutes of inactivity, and are not restarted after successful exit.


### [The Tokio Upgrade from 0.2 to 1.x](https://yomu.fyi/post/the-tokio-upgrade-from-0-2-to-1-x.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 12, 2021
- Type: Tutorial

Fly.io’s Rust-based load balancer handles almost all of its traffic and stands on Tokio and Hyper, motivating an upgrade from Tokio 0.2 to 1.0. The team waited to upgrade until related crates including hyper, reqwest, async-compression, tokio-io-timeout, tokio-tungstenite, and sentry were ready; after a few weeks, most of the ecosystem had upgraded. The migration foregoes Tokio’s Stream implementations pending stabilization in the standard library, relaxes mutable-access requirements, changes AsyncRead and AsyncWrite polling to return Result<()>, and requires more explicit pinning for !Unpin futures. Because runtime::Handle lacked block\_on, the team worked around the restriction with Arc; standard TcpListener values also required set\_nonblocking(true) before TcpListener::from\_std. Other changes included renamed APIs and revised Hyper WebSocket upgrades, and the author says the major upgrade was not hard.


### [You should know about Server-Side Request Forgery](https://yomu.fyi/post/you-should-know-about-server-side-request-forgery.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 5, 2021
- Type: Tutorial

Server-side request forgery (SSRF) lets attackers make an application server issue HTTP requests, potentially reaching internal resources behind its security perimeter and taking over the hosting environment. The post describes two common patterns—user-supplied URLs and user data incorporated into URLs—and presents Smokescreen, an egress proxy, as a mitigation. Smokescreen checks that requested IP addresses are publicly routed, blocking private IPv4 ranges and IPv6 ULA space, while ACL actions can open, report, or enforce traffic rules. The Fly modification authenticates clients with a shared PROXY\_PASSWORD, maps authenticated requests to an authed role, and includes deployment instructions for Fly and Docker plus Go and Node.js examples that send authenticated HTTPS requests through the proxy.


### [The January 2021 Fly ChangeLog](https://yomu.fyi/post/the-january-2021-fly-changelog.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jan 26, 2021
- Type: Announcement

The January 2021 Fly ChangeLog covers platform and flyctl changes from December 2020 through January 2021, focusing on private networking, VPN access, scaling, and infrastructure work. 6PN networking adds private communication and DNS-based app discovery over Fly's WireGuard mesh, while IPv6 WireGuard Peering provides tunnels into an organization; the new wireguard command creates, lists, and removes tunnels. Fly also made instance-count scaling the default model, separating it from autoscaling through scale and autoscale commands. Backend updates switched image pulling to containerd, improving subsequent boot times for larger images, added app lifecycle events to application logs, and made volume initialization lazy with encryption enabled by default. The listed flyctl releases also add volume, memory-scaling, region, completion, and WireGuard updates, alongside bug fixes.


### [Fly In 2020 - A year in features (and articles)](https://yomu.fyi/post/fly-in-2020-a-year-in-features-and-articles.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jan 18, 2021
- Type: Announcement

Fly’s 2020 retrospective covers the launch and expansion of its Global Application Platform, alongside features and articles released throughout the year. The platform added Turboku for moving Heroku apps to the edge, Cloud Native Buildpack support, Custom Domains with a GraphQL management API, scaling controls, Deno support, pausing and resuming, persistent volumes, and builtin Flyctl builders for Node, Ruby, Deno, Go, and static websites. Later additions included a new logging system, 6PN Private Networking, WireGuard peering, graceful VM shutdown options, and revised VM sizes, while examples demonstrated services such as Redis, MinIO, Gogs, and MQTT using persistent volumes. The article also records supporting work including GoStatic, JSON output in Flyctl, Firecracker-based workload isolation, and Heroku database usage.


### [Building clusters with serf, my new favorite thing](https://yomu.fyi/post/building-clusters-with-serf-my-new-favorite-thing.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jan 14, 2021
- Type: Problem & solution

The post builds a geographically distributed Headless Chromium cluster on Fly.io and uses it to examine the limits of DNS-based service discovery. It first deploys Chromium in a Singapore Firecracker VM, secures Chrome Debug Protocol access by enabling Fly's private 6PN network and connecting through WireGuard, then scales instances across Singapore, Sydney, Paris, and Chile. Because DNS provides only snapshots and no convenient change notifications, each node runs a leaderless Serf agent bound to its private IPv6 address, tags members by role and region, and joins peers discovered through internal DNS. Serf then supplies an up-to-date membership map, RTT and Vivaldi-based nearness information, plus events and queries; the post concludes that it is simpler than Consul or Zookeeper and more capable than DNS for this setup.


### [Get fly with your Fly command line](https://yomu.fyi/post/get-fly-with-your-fly-command-line.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jan 5, 2021
- Type: Tutorial

Fly’s command-line tool, available as both flyctl and fly on most platforms, includes shortcuts and options that reduce directory changes and browser navigation. App selection can use -a appname instead of relying on the current directory’s fly.toml; fly deploy can also build from a specified child directory, such as ./mygreatchildapp. When a fly.toml is present, the command asks for confirmation that the supplied app name should be used. Multiple deployment variants can be kept in separately named configuration files and selected with -c or --config, including when deploying from a monorepo tree. Browser-oriented commands include fly open for an app’s .fly.dev URL, fly dash metrics for dashboard metrics, and fly docs for the documentation’s top page.


### [Graceful VM exits, some dials](https://yomu.fyi/post/graceful-vm-exits-some-dials.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 29, 2020
- Type: Announcement

Fly.io introduces configurable VM shutdown behavior for applications whose clients, connections, or transactions need more than the default five-second termination window. After sending SIGINT, Fly normally waits five seconds before forcefully terminating a VM; the new kill\_timeout setting extends that wait to as much as five minutes on Shared CPU VMs or 24 hours on dedicated CPU VMs, while kill\_signal selects among several signals. The post demonstrates HAProxy’s soft-stop mode with SIGUSR1 to drain existing TCP connections and Postgres’s smart shutdown with SIGTERM to let open transactions commit before termination. It also describes infrastructure considerations: deploys and other releases can disrupt in-flight connections, so Fly drains connections where possible and offers ways to reduce reliance on shared HTTP and TLS handlers, plus stateless UDP and experimental stateless TCP load balancing.


### [IPv6 WireGuard Peering](https://yomu.fyi/post/ipv6-wireguard-peering.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 23, 2020
- Type: Announcement

Fly.io presents WireGuard Peering as a way to connect applications running on its platform privately to AWS, GCP, or other networks, while preserving automatic communication among apps in an organization. Each organization receives a private IPv6 network called a 6PN, with addresses encoding organization, host, and instance identifiers; BPF enforces isolation, and internal DNS resolves app, regional, and peer names. Because WireGuard’s cryptokey routing does not allow overlapping Allowed IPs, Fly swaps the address’s network and host chunks before and after routing, giving the mesh non-overlapping prefixes without changing IPv6 checksums. Users create regional peer configurations with flyctl wireguard create, receiving /120 delegations and organization-specific DNS. The post says this works for database gateways such as an AWS RDS setup, direct app-instance access, and arbitrary services, with connectivity remaining direct between nodes.


### [New VMs: more RAM, extra CPU, and a dollar menu](https://yomu.fyi/post/new-vms-more-ram-extra-cpu-and-a-dollar-menu.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 10, 2020
- Type: Announcement

Fly.io introduces new virtual-machine configurations after developers shifted attention from CPU-intensive workloads such as image processing, machine learning predictions, and video transcoding toward databases, which need higher RAM-to-CPU ratios. Shared-cpu VMs offer up to 2GB of RAM, while dedicated-cpu VMs reach 64GB across configurations with one, two, four, or eight dedicated CPUs. Shared-cpu-1x pricing starts at $1.94 per month for 256MB and reaches $10.70 for 2GB; dedicated-cpu-1x with 2GB costs $31 per month. The pricing model combines dedicated hardware with shared CPU capacity, averaging 12 shared VMs per CPU and using cgroups priorities and relocation to manage contention. Persistent storage remains unavailable, so the post says ephemeral VMs are unsuitable for database applications and that Fly.io should offer storage.


### [Incoming! 6PN Private Networks](https://yomu.fyi/post/incoming-6pn-private-networks.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 8, 2020
- Type: Announcement

Fly.io introduces 6PN, an IPv6 private network intended to let applications in the same organization communicate without public IP addresses, mTLS, or certificates. Each application instance receives an organization-scoped IPv6 address, while per-application internal DNS zones resolve instances, regions, and sibling apps; enabling it requires private\_network = true in fly.toml, though the post says it will soon be on by default. Examples show nginx discovering cache shards, Redis binding to fly-local-6pn, and NATS forming a cross-application cluster through internal names. Behind the feature, addresses encode organization, host, and instance identifiers, while BPF programs enforce network isolation and support WireGuard cryptokey routing; a Rust DNS server serves internal records. The stated goal is simple private connectivity with optional user-managed clustering, service discovery, and certificate infrastructure.


### [We cut bandwidth prices. Go nuts.](https://yomu.fyi/post/we-cut-bandwidth-prices-go-nuts.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 3, 2020
- Type: Announcement

Fly.io announces lower outbound data-transfer pricing for apps running in its Firecracker VMs: $0.02 per GB from North America and Europe, and $0.04 per GB almost everywhere else. The December 1, 2020 change follows dramatically increased volume, reducing bandwidth costs by 75% from the March launch prices of $0.085 per GB in North America and Europe and $0.14 in Asia Pacific. Rather than use graduated tiers or regional rates, Fly.io uses one blended price for all customers, accepting that some traffic is more expensive and some use cases may pay too much. A 70% target margin underpins the model, while a 160GB monthly free allowance covers low-volume projects; India is an exception at $0.12 per GB, and large-transfer customers can request lower prices if they commit to substantial monthly usage.


### [The November Fly Changelog](https://yomu.fyi/post/the-november-fly-changelog.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Nov 30, 2020
- Type: Announcement

The November 2020 Fly changelog records new example applications, Fly CLI enhancements, and platform updates. Guides now cover Gogs, MQTT with Mosquitto, MinIO, Node-RED, and Redis with and without TLS, and demonstrate preview persistent Volumes for database persistence, data storage, preserved programming state, and queued messages. The CLI added bulk secret imports from key=value files, including multiline values enclosed in triple double quotes, while list commands gained filtering, sorting, and JSON output; the Deno builtin added a Version setting defaulting to 1.5.4. Platform changes included an upgrade to Firecracker v0.23, improved restart and connection handling, timeout fixes, and stronger application-context isolation. The changelog also notes new crash-log context, humanized app times, improved image resolution, and corrected internal port and metrics handling.


### [More Appkata Examples to Try on Fly](https://yomu.fyi/post/more-appkata-examples-to-try-on-fly.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Nov 27, 2020
- Type: Announcement

Two new Appkata examples show how to run selected applications on Fly: Node-RED and Redis secured with TLS. Node-RED is a GUI flow-programming environment built on Node, with modules for connecting MQTT, Redis, Graphana, and other systems, plus creating web dashboards; the guide is intended to get it running quickly. The secured Redis example uses mkcert to simplify creation of TLS certificates, extending an earlier Redis example that presented Redis as a simple service. The post also points to Community.fly.io as a place for questions, hints, and tips, noting that Fly accounts can use single sign-on to make participation easier.


### [Appkata - Example Apps on Fly](https://yomu.fyi/post/appkata-example-apps-on-fly.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Nov 18, 2020
- Type: Tutorial

Appkata introduces four example backend apps for Fly, intended to show how to deploy common services while learning the platform’s deployment patterns. The examples cover Redis as a customizable, volume-backed key/value database; MinIO as a single-node, S3-compatible object store exposed through Fly’s TLS edge connections; Gogs as a private Git server using SQLite3 and Fly volumes; and Mosquitto as an MQTT broker with TLS, username/password authentication, and volume-backed message persistence. The examples emphasize adapting existing Docker images, attaching persistent storage, and exposing services securely. The post presents these as an initial set that will expand over the following weeks, alongside a Fly Community site for questions and guidance.


### [Fly Answers Questions - Suspend, Resume, Restart and Redis](https://yomu.fyi/post/fly-answers-questions-suspend-resume-restart-and-redis.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Oct 30, 2020
- Type: Explainer

Fly’s answers clarify how to stop an application temporarily, restart instances, configure minimum capacity, use Redis, and invoke the CLI. The fly suspend command reduces an app’s instance count to zero while preserving its status and settings; fly resume first restores one instance, checks it, and then redeploys from the previous configuration. By contrast, fly restart restarts each instance in place without triggering a deployment, while applications cannot set a minimum instance count of zero except by suspending. Fly’s Redis implementation does not support Pub/Sub, scripting, or Geo commands, and flyctl now creates a symlink to the shorter fly command as migration toward the latter continues with script compatibility in mind.


### [The October Fly Changelog: Preview Disks and DNS and Better Builtins](https://yomu.fyi/post/the-october-fly-changelog-preview-disks-and-dns-and-better-builtins.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Oct 27, 2020
- Type: Announcement

The October Fly changelog records platform and CLI updates, centered on preview persistent disks, configurable builtins, environment-variable configuration, and status monitoring. The new volumes commands let Fly applications create persistent disks whose data survives restarts, deployments, and suspension; the feature remains in preview. Applications can now set environment variables in fly.toml instead of using the secrets feature, while builtin settings expose controls such as Deno permissions and HTTPS auto-upgrading and logging for the static web server. flyctl 0.0.145 also adds Python/Procfile builtin support, a --watch status mode that polls every five seconds, a --rate option, default-org selection in init, and fixes for token checks and wildcard certificate domains.


### [BPF, XDP, Packet Filters and UDP](https://yomu.fyi/post/bpf-xdp-packet-filters-and-udp.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Oct 20, 2020
- Type: Explainer

Deploying unmodified UDP applications across an anycast edge and worker network is harder than proxying HTTP, because UDP carries no convenient metadata for forwarding the original socket addresses. The initial implementation used userland services, AF\_PACKET sockets, and custom proxying, but the post argues that kernel-level packet handling is a better fit than adding and monitoring another service. It explains BPF’s evolution into eBPF, then describes using XDP for fast ingress processing, XDP\_REDIRECT around WireGuard limitations, and TC BPF on the worker side; Firecracker tap devices make reply traffic appear as host ingress. The verifier requires bounds checks and debugging benefits from dropwatch and perf-based packet tracing. The result is a beta deployment path for UDP applications on Fly.io.


### [Fly Behind The Scenes: Fresh Logging](https://yomu.fyi/post/fly-behind-the-scenes-fresh-logging.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Oct 15, 2020
- Type: Problem & solution

Fly replaced its centralized Graylog logging platform after seven servers could not process peak volumes of 20,000–30,000 logs per second, causing drops. Vector, written in Rust, now runs on every server, parses and transforms logs from journald and other applications, and sends them directly to Elasticsearch, removing Graylog as a middleman. The pipeline adopts the Elasticsearch Common Schema (ECS), with Fly-specific fields for app names, allocation IDs, and regions, while Vector configurations are distributed through the existing configuration management system. The migration took about two weeks alongside other work; logs are now available quickly enough to support failed-allocation queries that previously often raced processing, and future sinks may include Papertrail, Honeycomb, or Kafka.


### [Stuff Your Pi-Hole From Anywhere](https://yomu.fyi/post/stuff-your-pi-hole-from-anywhere.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Oct 13, 2020
- Type: Tutorial

Pi-Hole blocks advertising and tracking domains by acting as a DNS server that returns a dummy address for listed hosts, but a home deployment is difficult to use while traveling and can incur latency. The post presents “Fli-Hole,” a globally reachable Pi-Hole application deployed on Fly’s edge network, using the official Docker image without modifying Pi-Hole itself. Its configuration sets INTERFACE and DNSMASQ\_LISTENING, exposes UDP port 53 through fly.toml, stores the web password as a Fly secret, and deploys with fly deploy. Additional Fly regions, such as Frankfurt, can be added so nearby traffic is routed through them. Each regional instance has independent settings and no persistence or sharing, while Dockerfile changes and redeployment provide a way to distribute configuration updates.


[Newer posts](https://yomu.fyi/company/fly-io/page/7.md) · [Older posts](https://yomu.fyi/company/fly-io/page/9.md)
