---
title: "Vercel 上の Web 層"
description: "Vercel と連携 worker で Quire の Web 層を実行します。"
image: "https://docs.quirelms.com/og.png"
---

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

# Vercel 上の Web 層

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

設計は `docs/architecture/23-ops.md` のセクション 5 にあります。Vercel で動くのは Web 層だけです。それ以外は運用者が管理する連携ホストで実行し、必須です。

## このリリースの状態 <!--quire:status-in-this-release-->

設定は用意されています (`apps/web/vercel.json`、`vercel` Nitro プリセット、起動時チェック)。Vercel では共有ファイルストレージ (`QUIRE_STORAGE_DRIVER=s3` または `azure`)、関数インスタンス間で動作するリアルタイムドライバー (`QUIRE_REALTIME_DRIVER=sse` または `centrifugo`)、HTTP メールプロバイダーが必要です。設定がない場合、Web 層は起動を拒否し、ログに不足している各設定名を表示します。

## 各コンポーネント <!--quire:the-pieces-->

| コンポーネント | 実行場所 |
| --- | --- |
| `web` | Vercel Functions、Bun runtime: ページ、REST、MCP、LTI、受信 webhook |
| `worker`、`scheduler`、`collab`、`content` | Fly、Railway、ECS、または `docker/compose.yaml` を使う独自 Docker ホストなどの連携ホスト |
| Postgres | トランザクションプーラーの背後にある外部サービス: Neon、Supabase、PgBouncer を使う RDS |
| ファイル | S3 または R2。永続ディスクはありません |
| バックグラウンドジョブ | リクエストのトランザクション内で pg-boss に登録し、連携 worker が実行します。連携 worker で `QUIRE_QUEUE_DRIVER=vercel` にすると、軽量ジョブ (順序を問わない通知と webhook 配信) は Vercel Queues (`VERCEL_QUEUE_REGION`、`VERCEL_QUEUE_TOKEN`) 経由になり、プール済み Postgres をポーリングしません |
| 定期ジョブ | 連携 scheduler。関数内で処理するとタイムアウトするため、Vercel Cron route は使いません |
| トレース | OpenTelemetry を `OTEL_EXPORTER_OTLP_ENDPOINT` で指定したコレクターに送信 |

## この環境でできないこと <!--quire:what-this-target-cannot-do-->

後でメールが送れないなどの問題になる前に、Web 層は起動時にすべて確認し、問題点を明記して起動を拒否します。

- **SMTP は使えません。** Vercel は送信 SMTP をブロックします。`QUIRE_EMAIL_PROVIDER_CONFIG` に Postmark、SES、Mailgun、SendGrid、Resend などの HTTP プロバイダーを設定します。`QUIRE_SMTP_URL` は拒否されます。
- **ローカルディスクは使えません。** `QUIRE_STORAGE_DRIVER=local` は拒否されます。
- **呼び出し間でメモリーを共有できません。** `QUIRE_REALTIME_DRIVER=inprocess` は拒否されます。Server-sent events は関数のタイムアウトで制限されます。クライアントはカーソルを使って再接続するためイベントは失われませんが、プレゼンスは利用できません。
- **固定テナントデータベースの数は約 8 個までです。** プールを共有できない環境で、それぞれが別の接続プールを必要とするためです。

## デプロイ <!--quire:deploying-->

1. リポジトリから Vercel プロジェクトを作り、**Root Directory** を `apps/web` にします。`apps/web/vercel.json` ではインストールとビルドのコマンド (`NITRO_PRESET=vercel`) を設定し、`/sw.js` をキャッシュせずに配信します。
2. 環境変数を設定します。少なくとも `docker/.env.example` の `QUIRE_DEPLOY_TARGET=vercel`、`QUIRE_APP_ORIGIN`、`QUIRE_CONTENT_ORIGIN`、`QUIRE_PLATFORM_DOMAINS`、`QUIRE_SECRET_KEY`、`QUIRE_MASTER_KEY`、`DATABASE_URL` (プーラーのアドレス)、`QUIRE_REPORT_DATABASE_URL`、`QUIRE_AUDIT_DATABASE_URL`、`QUIRE_DATABASE_ID`、`QUIRE_EMAIL_PROVIDER_CONFIG`、`QUIRE_MAIL_FROM`、ストレージ設定、連携ホストの collab サービスを指す `QUIRE_COLLAB_URL` と `QUIRE_COLLAB_SIGNING_KEY` を設定します。`QUIRE_REPORT_DATABASE_URL` は `DATABASE_URL` が示す物理データベース用です。登録済みの追加 DB ごとに、Web と worker の環境へ専用 `quire_report` 接続 URL を追加し、プラットフォームコンソールに環境変数名を `env:NAME` として登録します。DB のレポート URL がない場合、分析機能は安全のため動きません。
3. 連携ホストで `docker/compose.yaml` の `web` サービスを除いて、同じ `docker/.env` を使います。
   ```sh
   docker compose -f docker/compose.yaml up -d migrate init worker scheduler collab content
   ```
   Vercel デプロイを公開する前に、そこでマイグレーションを実行します。
4. デプロイします。設定が拒否される場合、関数ログは 「Web 層が Vercel で起動しませんでした」 で始まり、変更が必要な設定を列挙します。

## アップグレード <!--quire:upgrading-->

まず連携ホストでマイグレーションし、次に新しい Vercel デプロイを公開し、最後に連携ホストの worker を更新します。順序は [upgrade.md](/ja/ops/upgrade/) を参照してください。Vercel の即時ロールバックはコードのロールバックで、リリース内なら常に安全です。

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