Build, Deploy and Run a Deno Application
Getting an application running on Fly essentially involves working out how to package it as a deployable image. Once packaged it can be deployed to the Fly infrastructure to run on the global application platform. For this Getting Started article, we'll look at building a Deno application from scratch.
The Hellodeno Application
Our example will be a basic "hello world" example using Deno and Dinatra.
You can get the code for the example from the hellodeno Github repository. Just git clone https://github.com/fly-examples/hellodeno
to get a local copy. Here's all the code:
import {
app,
get,
post,
redirect,
contentType,
} from "https://denopkg.com/syumai/dinatra/mod.ts";
const greeting = "<h1>Hello From Deno on Fly!</h1>";
app(
get("/", () => greeting),
get("/:id", ({ params }) => greeting + `</br>and hello to ${params.id}`),
);
We'll call this file main.ts
. We also want a deps.ts
file for dependencies, here it is:
export {
app,
get,
post,
redirect,
contentType,
} from "https://denopkg.com/syumai/dinatra/mod.ts";
There's nothing else to run. Deno will manage getting packages for itself.
Running The Application
Run deno run --allow-net main.ts
to start the application:
deno run --allow-net main.ts
listening on http://0.0.0.0:8080/
And connect to localhost:8080 to confirm that you have a working Deno application by receiving a greeting. Now to package it up for Fly. There are a number of ways to do this. You can use flyctl's own simple builder,
Install Flyctl and Login
We are ready to start working with Fly and that means we need flyctl
, our CLI app for managing apps on Fly. If you've already installed it, carry on. If not, hop over to our installation guide. Once thats installed you'll want to login to Fly.
Configuring the App for Fly
Each Fly application needs a fly.toml
file to tell the system how we'd like to deploy it. That file can be automatically generated with the command flyctl init
command. To build this simmple deno app, we'll use the builtin deno builder.
flyctl init
? App Name (leave blank to use an auto-generated name) hellodeno
? Select organization: Demo (demo)
? Select builder: deno
Deno builtin
? Select Internal Port: 8080
New app created
Name = hellodeno
Owner = dj
Version = 0
Status =
Hostname = <empty>
Wrote config file fly.toml
You'll be asked for an application name first. We recommend that you go with the autogenerated names for apps to avoid namespace collisions. We're using hellodeno
here so you can easily spot it in configuration files.
Next you'll be prompted for an organization. Organizations are a way of sharing applications between Fly users. When you are asked to select an organization, there should be one with your account name; this is your personal organization. Select that.
Flyctl also asks you to select a builder. Builders are responsible for constructing the Docker image of your application which is then deployed to Fly's Firecracker VMs. The simplest to use are the builtin builders, which we recommend you use here. Select Deno (Deno Builtin). If you want to know more about the various builders, see Builders and Fly.
The last thing you will be asked for an internal port value. This is the port your application communicates over. If set incorrectly, Fly will be unable to connect to the application and it will fail health checks and be terminated. The default shown, 8080, is correct for the builtin builders which, by design, get applications to talk on port 8080. So, hit return and carry on.
Inside fly.toml
The fly.toml
file now contains a default configuration for deploying your app. In the process of creating that file, flyctl
has also created a Fly-side application slot of the same name, "hellodeno". If we look at the fly.toml
configuration file we can see the name in there:
app = "hellodeno"
[build]
builtin = "deno"
[[services]]
internal_port = 8080
protocol = "tcp"
[services.concurrency]
hard_limit = 25
soft_limit = 20
[[services.ports]]
handlers = ["http"]
port = "80"
[[services.ports]]
handlers = ["tls", "http"]
port = "443"
[[services.tcp_checks]]
interval = 10000
timeout = 2000
The flyctl
command will always refer to this file in the current directory if it exists, specifically for the app
name/value at the start. That name will be used to identify the application to the Fly platform.
Next is then the build
section which records which builder we would like to use to build and deploy this app. Here we are using the builtin builder for deno.
The rest of the file contains settings to be applied to the application when it deploys.
We'll have more details about these properties as we progress, but for now, it's enough to say that they mostly configure which ports the application will be visible on. The assumption the builder makes is that your application is talking on port 8080.
Deploying to Fly
We are now ready to deploy our containerized app to the Fly platform. At the command line, just run:
flyctl deploy
This will lookup our fly.toml
file and get the app name hellodeno
from there. Flyctl will then call on the builtin builder to build the application image, complete with the deno runtime.
Then flyctl
will start the process of deploying our application to the Fly platform. Flyctl will return you to the command line when it's done.
Viewing the Deployed App
If you want to find out more about the deployment. The command flyctl info
will give you all the essential details.
flyctl info
App
Name = hellodeno
Owner = dj
Version = 0
Status = running
Hostname = hellodeno.fly.dev
Allocations
ID VERSION REGION DESIRED STATUS HEALTH CHECKS RESTARTS CREATED
73f825ad 0 fra run running 1 total, 1 passing 0 6m34s ago
Connecting to the App
The quickest way to view your application is to run flyctl open
which will open your browser on the URL for your application. Run flyctl open /name
to get an extra greeting from the app.
If you want to manually enter a URL to check, remember to replace hellodeno.fly.dev
with the hostname you got from flyctl info
and connect to http://hellodeno.fly.dev/
where you should find a greeting - it will normally be upgraded to a secure connection. Use https://hellodeno.fly.dev
to start with a secure connection. Add /name
and you'll get an extra greeting from the hellodeno application.
Bonus Points
If you want to know what IP addresses the app is using, try flyctl ips list
:
flyctl ips list
TYPE ADDRESS CREATED AT
v4 50.31.246.124 23h17m ago
v6 2a09:8280:1:d1e3:ff42:8342:9bdd:a0cf 23h17m ago
Arrived at Destination
You have successfully built, deployed, and connected to your first Deno application on Fly.