
Cuando estás armando un backend, hay dos preguntas clave: ¿Dónde lo desplegamos? y ¿Qué herramientas usamos para crearlo? Aquí es donde Fly.io y el combo TypeScript + Express resultan ser una elección excelente.
Fly.io es una plataforma que te permite desplegar aplicaciones cerca de tus usuarios gracias a su infraestructura global. Esto reduce la latencia y mejora la experiencia de los usuarios con respuestas del servidor mucho más rápidas. Con solo unos pocos comandos, tu aplicación puede estar en producción, algo que con otras opciones podría tomar mucho más tiempo.
Por su parte, TypeScript y Express son una gran dupla para el desarrollo de backends. TypeScript te ayuda a escribir código más claro y confiable gracias al uso de tipos, lo que resulta esencial en proyectos grandes o cuando trabajas en equipo. Mientras tanto, Express es liviano, flexible y cuenta con una comunidad enorme que ofrece soluciones y herramientas para cualquier necesidad.
Si combinas Fly.io con este stack, vas a obtener un backend eficiente, fácil de mantener y con capacidad de crecimiento. Este enfoque es ideal para quienes necesitan rapidez en el desarrollo y una experiencia de calidad para los usuarios.
Por qué Fly.io
Fly.io se destaca por acercar tu aplicación a los usuarios. En lugar de alojar el backend en un servidor centralizado, distribuye las instancias por diferentes partes del mundo. ¿Tenés usuarios en Europa, Asia y América? Fly.io procesa las solicitudes desde el servidor más cercano, reduciendo tiempos de respuesta y ofreciendo una mejor experiencia.
A diferencia de otras plataformas que requieren configuraciones complicadas, Fly.io permite que lances tu aplicación en pocos pasos. Usando su CLI (flyctl), podés iniciar, configurar y desplegar un proyecto en minutos, ideal para quienes prefieren enfocarse en el desarrollo en lugar de en la infraestructura.
Además, Fly.io está diseñado para cubrir las necesidades de backends actuales. Podés escalar tus aplicaciones automáticamente según la demanda, distribuir el tráfico entre regiones y usar herramientas integradas como Fly Postgres para bases de datos. Todo esto sin configuraciones difíciles, lo que lo hace una opción práctica tanto para principiantes como para expertos.
Preparativos
Antes de empezar, asegúrate de tener todo listo para desarrollar y desplegar tu backend sin inconvenientes. Sigue estos pasos para configurar el entorno de desarrollo.
Instalación de herramientas necesarias
Es necesaria la instalación de:
• Node.js (recomendado: última versión LTS)
• Fly CLI: La herramienta de línea de comandos para interactuar con Fly.io.
curl -fsSL https://fly.io/install.sh | sh
Luego, inicia sesión con:
flyctl auth login
Configuración inicial del proyecto
Vamos a crear un nuevo proyecto con Express y TypeScript. En la terminal, ejecuta:
mkdir flyio-api && cd flyio-api
npm init -y
Luego, instala las dependencias necesarias:
pnpm add express dotenv cors
pnpm add -D typescript @types/node @types/express
@types/cors ts-node-dev
Esto agregará:
• express: Framework para el backend.
• dotenv: Para manejar variables de entorno.
• cors: Para gestionar permisos entre dominios.
• typescript: Para usar tipado estático.
• @types/node y @types/express: Tipos de Node.js y Express.
• ts-node-dev: Para ejecutar TypeScript sin compilar manualmente.
Configuración de TypeScript
Agrega este contenido al archivo tsconfig.json:
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"outDir": "./dist",
"declaration": true,
"declarationMap": true,
"esModuleInterop": true,
"incremental": false,
"isolatedModules": true,
"lib": ["es2022", "DOM", "DOM.Iterable"],
"module": "NodeNext",
"moduleDetection": "force",
"moduleResolution": "NodeNext",
"noUncheckedIndexedAccess": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"strict": true,
"target": "ES2022"
}
}
Configuración scripts de package.json
Estos son algunos de los comandos que vamos a ocupar en el package.json:
"scripts": {
"build": "npx tsc",
"start": "node dist/index.js",
"dev": "ts-node-dev api/index.ts"
},
Configuración index.ts
El archivo api/index.ts es el núcleo del backend. A continuación, te muestro una configuración básica para probarlo. Esta versión simplemente devuelve un objeto cuando se accede a la ruta /.
import express, { Request, Response } from "express";
import { config } from "dotenv";
import cors from "cors";
const app = express();
config();
app.use(express.json());
// CORS Config
app.use(
cors({
credentials: true,
origin: [process.env.CLIENT_URL ?? ""],
methods: ["GET", "POST", "PUT", "DELETE"],
allowedHeaders: ["Content-Type", "authorization"],
}),
);
const port = process.env.PORT || 3001;
app.get("/", (_req: Request, res: Response) => {
res.status(200).json({
msg: "Hello World from Fly.io 🦀 😎 🚀",
});
});
app.listen(port, () => {
console.log(`[🧪]: Server is running at port: ${port}`);
});
Configuración de Dockerfile
Quizás te preguntes por qué usar un Dockerfile en lugar de desplegar el código fuente directamente en Fly.io. La razón es que con Docker tenemos control total sobre el entorno donde corre la aplicación, mejoramos la portabilidad, reducimos tiempos de despliegue y facilitamos la escalabilidad. Al empaquetar el backend en un contenedor, nos aseguramos de que siempre funcione igual sin importar dónde se ejecute.
El Dockerfile quedaría así:
FROM node:18-slim
WORKDIR /usr/src/app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install --frozen-lockfile
COPY . .
EXPOSE 3001
CMD ["sh", "-c", "pnpm build && pnpm start"]
Organización del proyecto
La estructura del proyecto debería verse así:
flyio-api/
├── Dockerfile
├── api
│ └── index.ts
├── node_modules
├── package.json
├── pnpm-lock.yaml
└── tsconfig.json
Conexión con Fly.io
Una vez que tengamos todo listo, el siguiente paso es conectar nuestra app a Fly.io:
• Iniciar la aplicación en Fly.io con flyctl launch:
Usando flyctl launch, podemos iniciar la app en Fly.io. Este comando crea una nueva aplicación, configura las regiones de ejecución y genera el archivo fly.toml con la configuración necesaria para la app.
flyctl launch
• Configuración del archivo fly.toml:
Este archivo es muy importante, ya que define cómo Fly.io va a ejecutar tu contenedor. Podés personalizar las configuraciones de redes, almacenamiento, escalabilidad, etc. Es necesario revisar este archivo para ajustarlo a tus necesidades.
• Pruebas locales antes del despliegue:
Antes de desplegar en Fly.io, tené en cuenta que todo funcione correctamente en tu local. Podés usar Docker para simular cómo se ejecutaría la app en producción. Esto te va a ayudar a detectar posibles errores de configuración.
Despliegue
El ultimo paso, desplegar el backend.
• Compilar el proyecto y subirlo a Fly.io:
Con el proyecto configurado, simplemente ejecuta:
flyctl deploy
Esto compilará el proyecto y lo subirá a Fly.io, donde se ejecutará de forma distribuida.
• Revisar logs y probar en producción:
Podés ver los logs en tiempo real con este comando:
flyctl logs
Esto te permite ver si todo está funcionando correctamente y detectar cualquier error.