In this tutorial you will learn how to deploy a containerized TypeScript Express application to Fly.
The final code of this article can be found here.
Prerequisites
- A Fly account
- A computer with Node.js, NPM, Docker, and Flyctl (the Fly CLI)
Creating the application
npm init -y
npm install typescript ts-node @types/node --save-dev
npm install express
npm install @types/express --save-dev
tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true,
"outDir": "./dist"
}
}
./src/application.ts
import express from "express";
const application = express();
const port = 8080;
application
.get("/", (req, res) => {
res.send({
message: "Hello, World!",
});
})
.get("/random", (req, res) => {
res.send({
number: Math.floor(Math.random() * 100),
});
});
application.listen(port, () => {
console.log(`Application listening on port ${port}`);
});
To run the application locally:
npx ts-node ./src/application.ts
Containerizing the application
Dockerfile
FROM node:17-alpine as build-image
WORKDIR /usr/src/app
COPY package*.json ./
COPY tsconfig.json ./
COPY ./src ./src
RUN npm ci
RUN npx tsc
FROM node:17-alpine
WORKDIR /usr/src/app
COPY package*.json ./
COPY ./usr/src/app/dist ./dist
RUN npm ci --production
COPY . .
EXPOSE 8080
CMD [ "node", "dist/application.js" ]
To build and run the container locally:
docker build . -t hello-world
docker run -dp 8080:8080 hello-world
Deploying the application
fly launch
to prepare yourfly.toml
file, containing your project settings. Inside thefly.toml
file, ensure the service'sinternal_port
(8080 by default) matches the port exposed by your container.fly deploy
to deploy your application.fly open
to open the deployed application in your browser.
Cleaning up
fly destroy your-unique-app-id -y
removes your application from the Fly platform.
That's all! Don't forget to delete the application once you're done testing.
The final code of this article can be found here.