---
title: "Il livello web su Vercel"
description: "Esegui il livello web di Quire su Vercel con un worker companion."
image: "https://docs.quirelms.com/og.png"
---

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

# Il livello web su Vercel

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

Il progetto è nella sezione 5 di `docs/architecture/23-ops.md`. Vercel esegue solo il livello
web. Tutto il resto gira su un host companion gestito da te, e non è
facoltativo.

## Stato in questa release <!--quire:status-in-this-release-->

La configurazione è pronta (`apps/web/vercel.json`, il preset Nitro `vercel`
e i controlli di avvio). Vercel richiede storage file condiviso
(`QUIRE_STORAGE_DRIVER=s3` oppure `azure`), un driver realtime che funzioni tra
istanze di funzione (`QUIRE_REALTIME_DRIVER=sse` oppure `centrifugo`) e un provider
email HTTP. Senza di essi il livello web rifiuta di avviarsi e il suo registro
nomina ciascuna impostazione mancante.

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

| Componente | Dove gira |
| --- | --- |
| `web` | Funzioni Vercel, runtime Node: pagine, REST, MCP, LTI, webhook ricevuti |
| `worker`, `scheduler`, `collab`, `content` | Un host companion: Fly, Railway, ECS oppure il tuo host Docker con `docker/compose.yaml` |
| Postgres | Esterno, dietro un pooler di transazioni: Neon, Supabase oppure RDS con PgBouncer |
| File | S3 o R2. Non c'è disco persistente |
| Job in background | Accodati con pg-boss dentro la transazione della richiesta, eseguiti dal worker companion. Con `QUIRE_QUEUE_DRIVER=vercel` sul worker companion, i job leggeri (consegne non ordinate di notifiche e webhook) passano per Vercel Queues (`VERCEL_QUEUE_REGION`, `VERCEL_QUEUE_TOKEN`), così il Postgres in pool non viene interrogato per essi |
| Job ricorrenti | Lo scheduler companion. Non c'è rotta Vercel Cron, perché un cron che lavora dentro una funzione va in timeout |
| Tracciamento | OpenTelemetry verso il tuo collector, `OTEL_EXPORTER_OTLP_ENDPOINT` |

## Cosa questo target non può fare <!--quire:what-this-target-cannot-do-->

Il livello web verifica questi punti all'avvio e rifiuta, nominando ogni problema,
anziché fallire in seguito alla prima email mai inviata:

- **Niente SMTP.** Vercel blocca l'SMTP in uscita. Imposta `QUIRE_EMAIL_PROVIDER_CONFIG`
  su un provider HTTP (Postmark, SES, Mailgun, SendGrid o Resend).
  `QUIRE_SMTP_URL` viene rifiutato.
- **Niente disco locale.** `QUIRE_STORAGE_DRIVER=local` viene rifiutato.
- **Niente memoria condivisa tra invocazioni.** `QUIRE_REALTIME_DRIVER=inprocess`
  viene rifiutato. Gli eventi server-sent sono limitati al timeout della funzione; il
  client si riconnette con un cursore, così nessun evento va perso, ma la presenza non è
  disponibile.
- **I database tenant fissati sono limitati** a circa otto, perché ciascuno è
  un altro pool di connessioni in un ambiente che non può condividerli.

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

1. Crea un progetto Vercel dal repository con **Directory radice**
   `apps/web`. `apps/web/vercel.json` imposta i comandi di installazione e build
   (`NITRO_PRESET=vercel`) e serve `/sw.js` senza cache.
2. Imposta le variabili d'ambiente. Da `docker/.env.example`, almeno:
   `QUIRE_DEPLOY_TARGET=vercel`, `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN`,
   `QUIRE_PLATFORM_DOMAINS`, `QUIRE_SECRET_KEY`, `QUIRE_MASTER_KEY`,
   `DATABASE_URL` (l'indirizzo del pooler), `QUIRE_REPORT_DATABASE_URL`,
   `QUIRE_AUDIT_DATABASE_URL`, `QUIRE_DATABASE_ID`,
   `QUIRE_EMAIL_PROVIDER_CONFIG`, `QUIRE_MAIL_FROM`, le impostazioni di storage,
   e `QUIRE_COLLAB_URL` e `QUIRE_COLLAB_SIGNING_KEY` che puntano al
   servizio collab del companion.
   `QUIRE_REPORT_DATABASE_URL` appartiene al database fisico nominato da
   `DATABASE_URL`. Per ciascun database registrato aggiuntivo, aggiungi il suo
   URL di connessione `quire_report` agli ambienti sia web sia worker, poi
   registra il nome della sua variabile d'ambiente come `env:NAME` nella console
   della piattaforma. Le analisi falliscono in modo chiuso se manca l'URL report di quel database.
3. Sull'host companion, esegui `docker/compose.yaml` senza il servizio `web`,
   con lo stesso `docker/.env`:
   ```sh
   docker compose -f docker/compose.yaml up -d migrate init worker scheduler collab content
   ```
   Le migrazioni girano lì, prima che ogni distribuzione Vercel venga promossa.
4. Distribuisci. Con una configurazione rifiutata il registro della funzione inizia con "The web
   tier did not start on vercel" ed elenca ciascuna impostazione da cambiare.

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

Migra prima dall'host companion, poi promuovi la nuova distribuzione Vercel,
poi fai rolling dei worker del companion: l'ordine in
[upgrade.md](/it/ops/upgrade/). Un rollback istantaneo Vercel è un rollback di codice ed è
sempre sicuro all'interno di una release.

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