---
title: "Web-Tier auf Vercel"
description: "Betreiben Sie den Quire-Web-Tier auf Vercel mit einem ergänzenden Worker."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/de/llms.txt
> Use this file to discover all available pages before exploring further.

# Web-Tier auf Vercel

<span id="the-web-tier-on-vercel"></span>

Das Design ist in Abschnitt 5 von `docs/architecture/23-ops.md` beschrieben. Vercel betreibt nur den Web-Tier. Alles Weitere läuft auf einem ergänzenden Host, den Sie selbst betreiben; dieser ist zwingend erforderlich.

## Status in dieser Version <!--quire:status-in-this-release-->

Die Konfiguration ist vorhanden (`apps/web/vercel.json`, das Nitro-Preset `vercel` und die Startprüfungen). Vercel benötigt gemeinsam genutzten Dateispeicher (`QUIRE_STORAGE_DRIVER=s3` oder `azure`), einen Realtime-Treiber, der über Funktionsinstanzen hinweg funktioniert (`QUIRE_REALTIME_DRIVER=sse` oder `centrifugo`), und einen HTTP-E-Mail-Anbieter. Fehlt eine dieser Voraussetzungen, verweigert der Web-Tier den Start und nennt jede fehlende Einstellung im Protokoll.

## Komponenten <!--quire:the-pieces-->

| Komponente | Betriebsort |
| --- | --- |
| `web` | Vercel Functions, Node-Laufzeit: Seiten, REST, MCP, LTI, empfangene Webhooks |
| `worker`, `scheduler`, `collab`, `content` | Ergänzender Host: Fly, Railway, ECS oder ein eigener Docker-Host mit `docker/compose.yaml` |
| Postgres | Extern, hinter einem Transaktions-Pooler: Neon, Supabase oder RDS mit PgBouncer |
| Dateien | S3 oder R2. Es gibt keinen dauerhaften Datenträger |
| Hintergrundjobs | Werden mit pg-boss innerhalb der Anfrage-Transaktion eingereiht und vom ergänzenden Worker ausgeführt. Mit `QUIRE_QUEUE_DRIVER=vercel` auf dem ergänzenden Worker laufen einfache Jobs (ungeordnete Benachrichtigungs- und Webhook-Zustellungen) über Vercel Queues (`VERCEL_QUEUE_REGION`, `VERCEL_QUEUE_TOKEN`), sodass Postgres mit Pooling nicht dafür abgefragt werden muss |
| Wiederkehrende Jobs | Der ergänzende Scheduler. Es gibt keine Vercel-Cron-Route, da eine Cron-Aufgabe, die Arbeit innerhalb einer Funktion erledigt, das Zeitlimit überschreitet |
| Tracing | OpenTelemetry an Ihren Collector, `OTEL_EXPORTER_OTLP_ENDPOINT` |

## Was dieses Ziel nicht unterstützt <!--quire:what-this-target-cannot-do-->

Der Web-Tier prüft diese Einschränkungen beim Start und verweigert den Start mit einer Liste aller Probleme, statt erst dann zu scheitern, wenn die erste E-Mail nicht gesendet werden kann:

- **Kein SMTP.** Vercel blockiert ausgehendes SMTP. Setzen Sie `QUIRE_EMAIL_PROVIDER_CONFIG` auf einen HTTP-Anbieter (Postmark, SES, Mailgun, SendGrid oder Resend). `QUIRE_SMTP_URL` wird abgelehnt.
- **Kein lokaler Datenträger.** `QUIRE_STORAGE_DRIVER=local` wird abgelehnt.
- **Kein gemeinsam genutzter Speicher zwischen Aufrufen.** `QUIRE_REALTIME_DRIVER=inprocess` wird abgelehnt. Server-Sent Events sind auf das Funktionszeitlimit begrenzt; der Client verbindet sich mit einem Cursor erneut, sodass kein Ereignis verloren geht, aber Präsenz ist nicht verfügbar.
- **Angeheftete Mandantendatenbanken sind** auf etwa acht beschränkt, weil jede davon einen weiteren Verbindungspool in einer Umgebung bedeutet, die Pools nicht gemeinsam nutzen kann.

## Bereitstellung <!--quire:deploying-->

1. Erstellen Sie aus dem Repository ein Vercel-Projekt mit **Root Directory** `apps/web`. `apps/web/vercel.json` legt Installations- und Build-Befehle fest (`NITRO_PRESET=vercel`) und liefert `/sw.js` ohne Cache aus.
2. Legen Sie die Umgebungsvariablen fest. Übernehmen Sie mindestens folgende Werte aus `docker/.env.example`: `QUIRE_DEPLOY_TARGET=vercel`, `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN`, `QUIRE_PLATFORM_DOMAINS`, `QUIRE_SECRET_KEY`, `QUIRE_MASTER_KEY`, `DATABASE_URL` (Adresse des Poolers), `QUIRE_REPORT_DATABASE_URL`, `QUIRE_AUDIT_DATABASE_URL`, `QUIRE_DATABASE_ID`, `QUIRE_EMAIL_PROVIDER_CONFIG`, `QUIRE_MAIL_FROM`, die Speichereinstellungen sowie `QUIRE_COLLAB_URL` und `QUIRE_COLLAB_SIGNING_KEY` mit Verweis auf den Collab-Dienst des ergänzenden Hosts.
   `QUIRE_REPORT_DATABASE_URL` gehört zur physischen Datenbank, die durch `DATABASE_URL` bezeichnet wird. Fügen Sie für jede weitere registrierte Datenbank deren eigene `quire_report`-Verbindungs-URL sowohl in der Web- als auch in der Worker-Umgebung hinzu. Registrieren Sie anschließend den Namen ihrer Umgebungsvariable als `env:NAME` in der Plattformkonsole. Fehlt die Report-URL einer Datenbank, werden Analytics-Aufrufe geschlossen abgelehnt.
3. Führen Sie auf dem ergänzenden Host `docker/compose.yaml` ohne den Dienst `web` und mit derselben `docker/.env` aus:
   ```sh
   docker compose -f docker/compose.yaml up -d migrate init worker scheduler collab content
   ```
   Migrationen laufen dort, bevor jede Vercel-Bereitstellung freigegeben wird.
4. Stellen Sie die Anwendung bereit. Bei einer abgelehnten Konfiguration beginnt das Funktionsprotokoll mit „The web tier did not start on vercel“ und nennt jede zu ändernde Einstellung.

## Aktualisierung <!--quire:upgrading-->

Führen Sie zuerst die Migrationen auf dem ergänzenden Host aus, geben Sie dann die neue Vercel-Bereitstellung frei und rollen Sie zuletzt die Worker des ergänzenden Hosts aus – in der Reihenfolge aus [upgrade.md](/de/ops/upgrade/). Ein sofortiges Vercel-Rollback setzt den Code zurück und ist innerhalb einer Version immer sicher.

Source: https://docs.quirelms.com/de/ops/vercel/index.mdx
