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
Publicado el 18.09.2022 a las 19:25
Desplegaré una aplicación hecha con Deno en un contenedor Docker en fly.io
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.
Después de estar varias horas intentando desplegar un proyecto desde cero, lo que me ha funcionado es:
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!
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
Para este paso necesitarás tener tu usuario creado en fly.io
flyctl auth login
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/[email protected]/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"
flyctl deploy
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 ✍
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í 💪
Necesitarás incluir la librería:
import { Context } from "https://denopkg.com/syumai/dinatra@master/handler.ts";
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 🖖