---
title: "U nivellu web nant'à Cloudflare Workers"
description: "Eseguite un nivellu web riduttu di Quire nant'à Cloudflare Workers."
image: "https://docs.quirelms.com/og.png"
---

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

# U nivellu web nant'à Cloudflare Workers

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

U disignu hè in a sezzione 6 di `docs/architecture/23-ops.md`. Workers esegue un nivellu
web riduttu. A parità di funzioni nant'à Workers ùn face micca parte di u scopu (PRD sezzione 12): ciò
ch'ellu ùn pò fà stu target hè ricusatu à l'avviu, per nome.

## Statu in sta versione <!--quire:status-in-this-release-->

A cunfigurazione hè pronta (`apps/web/wrangler.jsonc`, u preset Nitro
`cloudflare-module`, u ponte Hyperdrive è i cuntrolli à l'avviu). Un Worker hà bisognu d'un almacenamentu cumpatibile cù S3 per R2
(`QUIRE_STORAGE_DRIVER=s3`), d'un driver in tempu reale trà dumande
(`QUIRE_REALTIME_DRIVER=durable_objects` o `centrifugo`), d'una cache spartuta
(`QUIRE_CACHE_DRIVER=postgres` o `valkey`) è d'un fornitore di posta HTTP.
Senza elli, u Worker ricusa d'avvià è u so registru nomina ogni paràmetru.
U driver Durable Objects hè un cliente di u Worker in tempu reale in
`apps/realtime-worker` (un Durable Object per canale per a distribuzione, a presenza
è a storia, unu per persona per e disconnessioni); distribuite lu accantu cum'è quì sottu,
o aduprate Centrifugo.

## I cumpunenti <!--quire:the-pieces-->

| Cumpunente | Nant'à Cloudflare |
| --- | --- |
| `web` | Un Worker cù `nodejs_compat` |
| Postgres | Esternu, accessu via Hyperdrive: `HYPERDRIVE` per u rollu di l'applicazione, `REPORT_HYPERDRIVE` per u rollu di rapportu nantu à a stessa basa fisica. U nivellu web copia ogni stringa di cunnessione in `DATABASE_URL` è `QUIRE_REPORT_DATABASE_URL` à l'avviu |
| Schedarii | R2, via a so API S3 (`S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com`); u binding `FILES` attacca u bucket |
| Travaglii in sfondu | pg-boss sopra Hyperdrive quandu u travagliu deve esse accodatu cù una scrittura. Cù `QUIRE_QUEUE_DRIVER=cloudflare` nant'à u worker cumpagnu, i travaglii ligeri (cunsigne è cunsegne webhook senza ordine) passanu invece per Cloudflare Queues, dunque Postgres ùn hè micca interrugatu per elli. U worker cumpagnu esegue i dui |
| In tempu reale | U Worker in tempu reale, `apps/realtime-worker`, cù Durable Objects |
| `worker`, `scheduler`, `collab`, `content`, ClamAV, Gotenberg, ffmpeg | Un host di cuntainer cumpagnu. Un Worker ùn li pò eseguisce |
| Tracciamentu | Osservabilità Workers, attivata in `wrangler.jsonc` |

`REPORT_HYPERDRIVE` furnisce u rollu di rapportu per a basa fisica indicata
da `HYPERDRIVE`. Stu target ùn serve tenant fissati à altre
basi fisiche, cum'è discrittu quì sottu.

## Ciò ch'ellu ùn pò fà stu target <!--quire:what-this-target-cannot-do-->

Ricusatu à l'avviu, cù tutti i prublemi elencati inseme:

- **Nisun SMTP.** Aduprate un fornitore HTTP in `QUIRE_EMAIL_PROVIDER_CONFIG`.
- **Nisun discu lucale.** `QUIRE_STORAGE_DRIVER` deve indicà un almacenamentu d'ogetti.
- **Nisuna cache o funzione in tempu reale in prucessu.** Workers ùn spartenu micca memoria trà
  dumande, dunque `QUIRE_REALTIME_DRIVER=inprocess` è
  `QUIRE_CACHE_DRIVER=memory` sò ricusati.
- **Nisun ClamAV, Gotenberg o ffmpeg in u Worker.** `CLAMAV_URL`,
  `GOTENBERG_URL` è `FFMPEG_PATH` stabiliti nant'à u Worker sò ricusati; stabiliteli nant'à
  u worker cumpagnu invece.
- **Nisuna urganizazione cù basa di dati dedicata.** I binding Hyperdrive d'un Worker sò
  fissati à a distribuzione, dunque un'urganizazione cù a so propria basa vede una pagina chjara
  «micca dispunibule quì». Servitela da Compose o Vercel.

È una cosa chì ùn hè micca ricusata ma ci vole à sapela: **a previsualizazione anticipata è
rigenerazione statica incrementale ùn funzionanu micca nant'à Workers**, qualunque sia a
ducumentazione di u framework. Ogni strada hè resa per dumanda.

Nant'à stu target, tenite e transazzioni corte è ùn ne mantenite mai una durante una chjama
à a rete: Hyperdrive ristabilisce u statu di sessione quandu una cunnessione torna à u pool,
dunque u cuntestu di tenant hè stabilitu per ogni transazzione.

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

1. Create e risorse:
   ```sh
   bun run --bun wrangler hyperdrive create quire-app --connection-string="postgres://quire_app:...@db.example.com:5432/quire"
   bun run --bun wrangler hyperdrive create quire-report --connection-string="postgres://quire_report:...@db.example.com:5432/quire"
   bun run --bun wrangler r2 bucket create quire-files
   bun run --bun wrangler queues create quire-jobs
   ```
   Mettite i dui ID Hyperdrive in `apps/web/wrangler.jsonc`.
2. Stabilite i sicreti, unu à volta cù `bun run --bun wrangler secret put <NAME>` da
   `apps/web`: `QUIRE_SECRET_KEY`, `QUIRE_MASTER_KEY`,
   `QUIRE_EMAIL_PROVIDER_CONFIG`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`,
   `QUIRE_COLLAB_SIGNING_KEY`, `QUIRE_REALTIME_WORKER_SECRET`. I paràmetri nurmali
   (`QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN`, `QUIRE_PLATFORM_DOMAINS`,
   `QUIRE_DATABASE_ID`, `S3_ENDPOINT`, `S3_BUCKET`, `QUIRE_COLLAB_URL`) vanu in
   `vars`.
3. Custruite è distribuite da `apps/web`:
   ```sh
   NITRO_PRESET=cloudflare-module bun run build
   bun run --bun wrangler deploy
   ```
4. Distribuite u Worker in tempu reale, cù `QUIRE_REALTIME_WORKER_SECRET` di u nivellu web
   è u so sicretu di gettone cum'è `QUIRE_REALTIME_TOKEN_SECRET` (u nivellu web firma
   gettoni in tempu reale cù u so propiu `QUIRE_REALTIME_TOKEN_SECRET`, o cù
   `QUIRE_SECRET_KEY` quandu ùn hè micca stabilitu; aduprate dunque quellu chì usa), è stabilite
   `QUIRE_REALTIME_WORKER_URL` nant'à u nivellu web à u so indirizzu:
   ```sh
   cd apps/realtime-worker
   bun run --bun wrangler secret put QUIRE_REALTIME_WORKER_SECRET
   bun run --bun wrangler secret put QUIRE_REALTIME_TOKEN_SECRET
   bun run --bun wrangler deploy
   ```
5. Per i travaglii ligeri in Cloudflare Queues, create una fila per ogni fila ligera è
   stabilite i paràmetri annantu à u worker cumpagnu (un gettone API cù permessi di lettura è
   scrittura per Queues):
   ```sh
   bun run --bun wrangler queues create quire-events-notifications
   bun run --bun wrangler queues create quire-events-notifications-dead
   bun run --bun wrangler queues create quire-events-webhooks
   bun run --bun wrangler queues create quire-events-webhooks-dead
   ```
   `QUIRE_QUEUE_DRIVER=cloudflare`, `CLOUDFLARE_ACCOUNT_ID`,
   `CLOUDFLARE_QUEUES_TOKEN`, è `QUIRE_QUEUE_PREFIX` s'ellu ùn hè micca `quire-`.
6. Eseguite l'host cumpagnu cum'è discrittu in a [guida Vercel](/co/ops/vercel/), passu 3.
   E migrazioni si facenu quì, prima di ogni distribuzione Worker.

Una cunfigurazione ricusata apparisce in `bun run --bun wrangler tail` cum'è «The web tier did
not start on cloudflare», seguitatu da ogni paràmetru da cambià.

Source: https://docs.quirelms.com/co/ops/cloudflare/index.mdx
