cloadyDoku
Doku3 Min. Lesezeit

Serverless-Funktionen

Führe einen HTTP-Service nur aus, solange Anfragen eintreffen. Er schläft im Leerlauf, wacht bei der nächsten Anfrage auf und skaliert unter Last – eingerichtet in deiner Compose-Datei.

Eine Funktion ist ein HTTP-Service, der nur läuft, solange Anfragen eintreffen. Fünf Minuten nach seiner letzten Anfrage stoppt Cloady seinen Container, und die nächste Anfrage startet ihn wieder. Unter Last skaliert er auf bis zu fünf Kopien. Eine einzige Compose-Einstellung macht aus einem Service eine Funktion: deploy.replicas: 0.

Den Service markieren

Gib dem Service, der unter der Adresse deiner App antwortet, unter deploy den Wert replicas: 0:

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

Beides muss zutreffen:

  • deploy.replicas ist 0.
  • Der erste Eintrag unter ports: ist ein HTTP-Port, etwa "3000" oder "8080:3000". Ein Port, der auf /tcp oder /udp endet, oder einer, den Cloady als Port einer Datenbank, eines Caches, einer Queue, eines Mailservers oder eines Gameservers behandelt (5432, 6379, 25, …), ist reines TCP, und reines TCP kann keinen Container aufwecken.

Mit build: . baut Cloady den Service aus deinem Code, mit Railpack oder mit deinem Dockerfile, falls es eines gibt, und setzt PORT auf den Container-Port. Eine App, die auf $PORT lauscht, braucht also keine Änderung. Ein Service, der ein image: ausführt, funktioniert genauso.

Die App deployen

Deploye sie wie jede andere Compose-App: Füge das Repository in das Deploy-Feld ein, zieh den Ordner darauf oder nutze die CLI:

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

Die Funktion startet schlafend.

Die Funktion aufrufen

Öffne die Adresse der App. Die erste Anfrage nach einer Schlafphase wartet, während eine Kopie startet, und wird beantwortet, sobald der Container Verbindungen auf seinem Port annimmt. Solange die Funktion wach ist, gehen Anfragen direkt durch. Auch die eigenen Domains der App wecken sie auf.

Den größten Teil dieser ersten Wartezeit braucht dein Container selbst zum Starten. Ein kleines Image und ein schneller Start halten sie also kurz.

Wie sie skaliert

Diese Grenzen gelten für jede Funktion gleich, und die Compose-Datei ändert sie nicht. Eine Funktion

  • wacht auf bei einer Anfrage an die Adresse der App oder an eine ihrer eigenen Domains,
  • schläft ein fünf Minuten nach ihrer letzten Anfrage,
  • skaliert hoch um eine Kopie je 100 gleichzeitig laufende Anfragen, bis zu fünf Kopien,
  • hält die erste Anfrage nach einer Schlafphase bis zu 90 Sekunden lang fest, während eine Kopie startet; ist bis dahin keine Kopie bereit, schlägt diese Anfrage fehl,
  • gibt jeder Anfrage 90 Sekunden, um mit ihrer Antwort zu beginnen.

Was eine Funktion sein kann

  • Nur der Service, der unter der Adresse der App antwortet. Eine App hat einen öffentlichen Hostnamen, auf dem ihr erster HTTP-Service antwortet (Services und Endpunkte). Veröffentliche die Funktion deshalb mit ports: und gib den anderen Services der App expose:. Bei jedem anderen Service wird replicas: 0 ignoriert, und er läuft mit einer Kopie.
  • Nur HTTP. Ein TCP- oder UDP-Port kann keinen Container aufwecken, deshalb schläft eine Datenbank oder ein Gameserver nie.
  • Zustandslos, ohne Volume. Eine Funktion muss auf jedem Server laufen können. Anfragen können bei verschiedenen Kopien landen, was eine Kopie in ihr eigenes Dateisystem schreibt, ist weg, sobald sie schläft, und ein Volume würde jede Kopie an den einen Server binden, auf dem es liegt, sodass die Funktion nicht aufwachen könnte, solange dieser Server voll ist. Bewahre Daten in einem Datenbank-Service auf.

Mit einer Datenbank

Die anderen Services der App laufen weiter, während die Funktion schläft. Eine Datenbank, die sie nutzt, ist also schon bereit, wenn sie aufwacht. Gib der Datenbank expose: statt ports:, damit sie privat innerhalb der App bleibt:

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:

Lege DB_PASSWORD vor dem Deploy unter Environment auf der Karte der App an.

Preis

Eine Funktion kostet so viel, wie der Service im Dauerbetrieb kosten würde. Cloady berechnet, was eine App deklariert, nicht, was sie verbraucht (Kapazität und Preis), und zählt CPU und Arbeitsspeicher einer Funktion einmal, ob sie schläft oder ausgelastet ist. Innerhalb des Gratis-Kontingents kostet sie so oder so nichts.

Lokal ausführen

docker compose up startet für einen Service mit replicas: 0 keinen Container. Gib ihm einen:

Terminal
docker compose up --scale api=1

Später ändern

Bei einer App aus einem GitHub-Repository änderst du replicas in der Compose-Datei und pushst; das nächste Deployment übernimmt es. Entferne replicas: 0, um die Funktion wieder zu einem ständig laufenden Service zu machen. Apps aus einem Upload oder aus dem Katalog behalten die Compose-Datei, mit der sie erstellt wurden.

Im Dashboard

Die App gilt als laufend, während ihre Funktion schläft. Ihre Statusseite zeigt die Funktion als Idle, und der Uptime-Check von Monitor lässt sie schlafen.


Weiter geht es mit den Grundkonzepten zu Services, Endpunkten und Preisen oder mit der CLI-Referenz zu cloady deploy.

Auf dieser Seite