Desplegando APP con Deno en fly.io 🚀

Publicado el 18.09.2022 a las 21:25

Desplegando APP con Deno en fly.io 🚀

⚫ El tier gratuito de Heroku se acaba

⚫ Desplegar aplicación de Deno en fly.io

🟣 Clonar proyecto de ejemplo desde GitHub

🟣 Instalar el CLI de fly.io

🟣 Haz el login

🟣 Preparando el despliegue

🟣 Ahora sí, despliega 🚀

🟣 Comprobando el despliegue

⚫ Añadiendo peticiones POST a nuestro servidor HTTP de Deno que funcionan en fly.io

🟣 Añadiendo librería para el context de la petición

🟣 Añadiendo petición POST al router

Desplegando APP con Deno en fly.io 🚀

Desplegaré una aplicación hecha con Deno en un contenedor Docker en fly.io


El tier gratuito de Heroku se acaba

Como ya os dije la semana pasada, el próximo 28 de noviembre finaliza el tier gratuito de Heroku, además, esta semana me he encontrado con un email de Heroku diciendo que había agotado el 80% de mis 1000 horas gratuitas mensuales, que cuando las agotara si quiería tener mis aplicaciones activas tenía que subir al siguiente plan que es el Hobby Dynos.


Como lo que estoy haciendo son pruebas, no quería gastar dinero hasta tener claro la arquitectura que usaré, así que he buscado una alternativa para correr aplicaciones de Deno en la nube.


Te dejo un artículo donde te cuento diferentes recursos para subir tus aplicaciones y webs 👇

Despliegue gratuito de tus aplicaciones para tus pruebas

En este artículo te diré los servicios gratuitos que he probado para mis pruebas en la nube. Te mostraré servicios gratuitos para frontend, backend y bases de datos

Ahora mismo el que me está funcionando para Deno además de Heroku es fly.io


Con fly.io tienes 2340 horas mensuales (en Heroku eran 1000 horas), 3GB para persistencia de datos, 256MB de RAM y 160 GB de ancho de banda mensuales.

De sobra para pruebas.


Lo único que no me gusta es que no se puede integrar con GitHub, pero no se puede tener todo 🥴


Por otro lado, la aplicación no "duerme" después de 30 minutos de inactividad como sí pasa en Heroku, aunque eso era fácilmente evitable con el truquillo que te contaba en este artículo.

Desplegar aplicación de Deno en fly.io

Después de estar varias horas intentando desplegar un proyecto desde cero, lo que me ha funcionado es:

Clonar proyecto de ejemplo desde GitHub

Fly.io tiene un repositorio de ejemplo en GitHub muy fácil, lo puedes encontrar en https://github.com/fly-apps/hellodeno

git clone https://github.com/fly-apps/hellodeno

El proyecto lo que hace es levantar un servidor web y saludarte

  import {
    app,
    get,
    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}`),
  );
  

Una vez clonado el repositorio prueba que funciona en local

deno run --allow-net main.ts

Lo que verás por consola será 👇

listening on http://0.0.0.0:8080/

Si en tu explorador web vas a http://127.0.0.1:8080 verás el mensaje de Hello From Deno on Fly!

Instalar el CLI de fly.io

Te recomiendo que antes de instalar el CLI de fly.io te crees un usuario


En una powershell de Windows escribe:

iwr https://fly.io/install.ps1 -useb | iex

Si usas Linux 🐧 o Mac

curl -L https://fly.io/install.sh | sh

Haz login

Para este paso necesitarás tener tu usuario creado en fly.io

flyctl auth login

Preparando antes de desplegar

Fly.io necesita de un fichero de configuración fly.toml con las características que queremos que tenga nuestra aplicación al desplegar


Ejecuta el comando

flyctl launch

Este comando te creará un fly.toml estándar y también un Dockerfile que necesitará para el despligue del contenedor de Docker 🐳


El fichero fly.toml generado por defecto sólo tiene los permisos para acceder a la red, ya que el proyecto de ejemplo es un servidor web.

Si quieres añadir más permisos se hace en la sección de [processes]


Para añadir variables de entorno se hace en la sección de [env]

👉 Recuerda importar la librería https://deno.land/x/dotenv@v3.2.0/load.ts para poder leer el fichero de variables de entorno


A continuación te dejo un fichero fly.toml que accede a la red, lee y escribe ficheros en disco y accede a las variables de entorno.

Además encontrarás las variables de entorno PORT, USERDATABASE y PASSWORDDATABASE

# fly.toml file generated for xxxx

app = "xxxxxx"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []
          
[processes]
  app = "run --allow-net --allow-write --allow-read --allow-env ./main.ts"

[env]
  PORT = "8080"
  USERDATABASE = "USERDATABASE"
  PASSWORDDATABASE = "eyJpdiI6Imluc09NazU4U"
          
[experimental]
  allowed_public_ports = []
  auto_rollback = true
          
[[services]]
  http_checks = []
  internal_port = 8080
  processes = ["app"]
  protocol = "tcp"
  script_checks = []
  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"
          
  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80
          
  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443
          
  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 0
    timeout = "2s"
          

Ahora sí, despliega 🚀

flyctl deploy

Comprobando el despliegue

Si todo ha ido bien, ejecutando

flyctl info

Verás la información de tu aplicación

App
          Name     = xxxxxx
          Owner    = fjmduran
          Version  = 0
          Status   = running
          Hostname = xxxxxx.fly.dev
        
        Allocations
        ID       VERSION REGION DESIRED STATUS  HEALTH CHECKS      RESTARTS CREATED
        73f825ad 0       mad    run     running 1 total, 1 passing 0        6m34s ago

Listo, si tienes cualquier duda

Añadiendo peticiones POST a nuestro servidor HTTP de Deno que funcionan en fly.io

Actualización 18.03.2023 🧐


Me he encontrado casi una semana perdido porque estaba empeñado en enviar información a mi servidor HTTP de Deno desplegado en fly.io por una petición POST y no lo conseguía.


Ni ChatGPT ni StackOverflow, toda la documentación estaba deprecated y no funcionaba.


Después de muchas horas lo conseguí 💪

Añadiendo librería para el context de la petición

Necesitarás incluir la librería:

import { Context } from "https://denopkg.com/syumai/dinatra@master/handler.ts";

Añadiendo petición POST al router

app(
  get("/", () => greeting),
  get("/:id", ({ params }) => greeting + \` and hello to \${params.id}\`),
👉 post("/", (ctx) => testWithPost(ctx)),
);

El código completo quedaría al final

  import {
    app,
    get,
    post
  } from "https://denopkg.com/syumai/dinatra/mod.ts";
  👉 import { Context } from "https://denopkg.com/syumai/dinatra@master/handler.ts";
  
  const greeting = "<h1>Hello From Deno on Fly!</h1>";
  
  app(
    get("/", () => greeting),
    get("/:id", ({ params }) => greeting + `</br>and hello to ${params.id}`),
👉 post("/", (ctx) => testWithPost(ctx)),
  );

  export async function testWithPost(ctx: Context) {
    const data1 = ctx.params.data1;
    let message = "";
    if (!data1) {
      message = '⛔ No se han especificado datos en el body de la petición';
      return message;
    }
    message = 'Recibido ${JSON.stringify(data1)}'; 
    return message;
  }
  

En la propiedad params del context encontrarás el body de la petición POST


Si ahora ejecutas el código en tu máquina verás lo siguiente si haces una petición GET al localhost:8080

Si haces una petición POST sin body verás lo siguiente

Si haces una petición POST con un campo en el body que se llame data1 verás lo siguiente


Hasta luego 🖖

Servicios

Software

IoT

Digitalización

Aplicaciones móviles

Consultoría

fjmduran.com v0.2.2