Deploy a Fly app
Table of contents
- Prep an application for deploy
- Deploying an app
- Using a Fly app
flyctl and login
We have a CLI tool for deploying and managing Fly applications. If you're on a Mac, you can install the CLI with Homebrew:
brew install superfly/tap/flyctl
For other operating systems, use the install script:
curl https://get.fly.io/flyctl.sh | sh
Once installed, log in to Fly with
flyctl auth login:
flyctl auth login
Opening browser to url https://fly.io/app/auth/cli/token Waiting for session...⣽
This will open a browser window you can use to register and authenticate with Fly.
Prep an application for deploy
The CLI operates in a working directory, so go ahead and change to your application directory — we'll use
fly-example for this guide. If you want to try with a prebuilt application, you can clone one from our getting started repository:
git clone https://github.com/superfly/go-example.git fly-example cd fly-example
Register a new Fly app
flyctl apps create command creates all the necessary infrastructure to deploy your application, and then writes a
fly.toml file to your working directory.
flyctl apps create
? App Name (leave blank to use an auto-generated name) ? Select organization: Fly (fly) New app created Name = dark-pine-485 Owner = fly Version = 0 Status = Hostname =
Wrote config file fly.toml
fly.toml config file specifies the application name so
flyctl knows which application to operate on when you run commands. It also specifies
services, which determine which ports to listen on and what "handlers" (if any) to apply before proxying to your application.
app = "dark-pine-4852" [[services]] internal_port = 8080 protocol = "TCP" [services.port.80] handlers = ["HTTP"] [services.port.443] handlers = ["TLS", "HTTP"]
By default, new apps listen for HTTP connections on port 80 and HTTPS connections on port 443, and forward requests on to application port 8080. This is all configurable, though, you can configure your application services to handle almost any kind of TCP traffic.
Building and packaging
Fly apps are built using app builders, or from a raw Dockerfile. Builds get packaged into a Docker Image (we don't actually run Docker, but it's a reasonable packaging format with good tooling).
build section of the Fly config specifies build instructions. The optional
builder setting defines an app specific builder, and builders may have their own settings:
[build] builder = "github.com/superfly/builders//deno"
If no builder is specified,
flyctl will attempt to build the
Dockerfile in the working directory.
Deploying an app
flyctl deploy command triggers a sequence of actions: package -> push -> network setup -> release.
📦 Package application
App config file '/home/kurt/fly-example/fly.toml' Deploy source directory '/home/kurt/fly-example' Docker daemon available, performing local build... Using Dockerfile from project: /home/kurt/fly-example/Dockerfile ... Successfully built ccffce94bd6e Successfully tagged registry.fly.io/dark-pine-4852:deployment-1569524269 Image size: 14 MB
🚢 Push app package to Fly
==> Pushing image The push refers to repository [registry.fly.io/dark-pine-4852] --> done
📍 Register Services
==> Registering Services TCP 80 --> TCP 8080 (handlers: HTTP) TCP 443 --> TCP 8080 (handlers: TLS HTTP)
🚀 Release app package
==> Deploying Image --> done Version = v0 Reason = Deploy image Description = User = email@example.com Date = 1s ago
Using a Fly app
Each app gets a
.dev hostname and IP addresses you can use to connect. The
flyctl info command shows lots of information about an app that deploys successfully:
App Name = dark-pine-4852 Owner = fly Version = 0 Status = running Hostname = https://dark-pine-4852.fly.dev Services TASK PROTOCOL PORT INTERNAL PORT HANDLERS app tcp 80 8080 http app tcp 443 8080 tls http IP Addresses ADDRESS TYPE 126.96.36.199 v4 2a09:8280:1:f898:2460:35d0:b918:1550 v6
Apps using the
TLS service handler can use an unlimited number of Fly managed certificates. Use the
flyctl certs command to add, list, and remove certificates.
You can add configuration options and application secrets (like DB credentials) using the
flyctl secrets command. We inject these into your application process as environment variables. Read more about app configuration →
By default, applications listen for HTTP traffic on port 80 and HTTPS traffic on port 443. This is configurable, you can build apps that expose gRPC services, for example, or any other service that works over TCP. Read more about global service routing →