cloadyDocs
Docs3 min de lectura

Funciones serverless

Ejecuta un servicio HTTP solo mientras llegan solicitudes. Se duerme cuando está inactivo, despierta con la siguiente solicitud y escala bajo carga, todo desde tu archivo compose.

Una función es un servicio HTTP que solo se ejecuta mientras llegan solicitudes. Cinco minutos después de su última solicitud, Cloady detiene su contenedor, y la siguiente solicitud lo vuelve a iniciar. Bajo carga escala hasta cinco copias. Un solo ajuste del archivo compose convierte un servicio en una función: deploy.replicas: 0.

Marca el servicio

Pon replicas: 0 bajo deploy en el servicio que responde en la dirección de tu app:

YAML
services:
  api:
    build: .
    ports:
      - "3000"
    deploy:
      replicas: 0

Deben cumplirse las dos condiciones:

  • deploy.replicas es 0.
  • La primera entrada de ports: es un puerto HTTP, como "3000" u "8080:3000". Un puerto que termina en /tcp o /udp, o uno que Cloady trata como puerto de base de datos, caché, cola, correo o juego (5432, 6379, 25, …), es TCP sin más, y el TCP sin más no puede despertar un contenedor.

Con build: ., Cloady construye el servicio a partir de tu código, con Railpack o con tu Dockerfile si lo tienes, y define PORT con el puerto del contenedor, así que una app que escucha en $PORT no necesita cambios. Un servicio que ejecuta una image: funciona igual.

Despliega la app

Despliégala como cualquier otra app con compose: pega el repositorio en el campo de despliegue, suelta la carpeta sobre él o usa la CLI:

Terminal
cloady deploy github.com/acme/api --type git

La función empieza dormida.

Llama a la función

Abre la dirección de la app. La primera solicitud con la función dormida espera mientras arranca una copia, y recibe respuesta en cuanto el contenedor acepta conexiones en su puerto. Mientras la función está despierta, las solicitudes pasan directamente. Los dominios propios de la app también la despiertan.

Casi toda esa primera espera es el propio arranque de tu contenedor, así que una imagen pequeña y un arranque rápido la mantienen corta.

Cómo escala

Estos límites son iguales para todas las funciones, y el archivo compose no los cambia. Una función:

  • despierta con una solicitud a la dirección de la app o a uno de sus dominios propios;
  • se duerme cinco minutos después de su última solicitud;
  • escala una copia más por cada 100 solicitudes en curso, hasta cinco copias;
  • retiene la primera solicitud con la función dormida hasta 90 segundos mientras arranca una copia, y esa solicitud falla si para entonces no hay ninguna lista;
  • da a cada solicitud 90 segundos para empezar su respuesta.

Qué puede ser una función

  • Solo el servicio que responde en la dirección de la app. Una app tiene un único nombre de host público, al que responde su primer servicio HTTP (Servicios y endpoints), así que publica la función con ports: y da expose: a los demás servicios de la app. En cualquier otro servicio, replicas: 0 se ignora y el servicio ejecuta una copia.
  • Solo HTTP. Un puerto TCP o UDP no puede despertar un contenedor, así que una base de datos o un servidor de juegos nunca se duerme.
  • Sin estado y sin volumen. Una función tiene que poder ejecutarse en cualquier servidor. Las solicitudes pueden llegar a copias distintas, lo que una copia escribe en su propio sistema de archivos desaparece en cuanto se duerme, y un volumen ataría todas las copias al único servidor que lo tiene, así que la función no podría despertar mientras ese servidor esté lleno. Guarda los datos en un servicio de base de datos.

Con una base de datos

Los demás servicios de la app siguen funcionando mientras la función duerme, así que una base de datos que use ya está lista cuando despierta. Da a la base de datos expose: en lugar de ports:, para que quede privada dentro de la app:

YAML
services:
  api:
    build: .
    ports:
      - "3000"
    environment:
      DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app
    deploy:
      replicas: 0
  db:
    image: postgres:17
    expose:
      - "5432"
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - data:/var/lib/postgresql/data
volumes:
  data:

Añade DB_PASSWORD en Environment, en la tarjeta de la app, antes de desplegar.

Precio

Una función cuesta lo mismo que costaría el servicio funcionando todo el tiempo. Cloady cobra lo que una app declara, no lo que usa (Capacidad y precio), y cuenta la CPU y la memoria de una función una sola vez, esté dormida u ocupada. Dentro de la asignación gratuita no cuesta nada en ningún caso.

Ejecútala en local

docker compose up no inicia ningún contenedor para un servicio con replicas: 0. Dale uno:

Terminal
docker compose up --scale api=1

Cámbiala más adelante

En una app creada desde un repositorio de GitHub, cambia replicas en el archivo compose y haz push; el siguiente despliegue lo aplica. Quita replicas: 0 para que la función vuelva a ser un servicio siempre activo. Las apps creadas desde una subida o desde el catálogo conservan el archivo compose con el que se crearon.

En el panel

La app figura como en ejecución mientras su función duerme. Su página de estado muestra la función como Idle, y la comprobación de disponibilidad de Monitor la deja dormida.


Siguiente paso: consulta los Conceptos básicos sobre servicios, endpoints y precios, o la Referencia de la CLI sobre cloady deploy.

En esta página