---
title: "Lapisan web pada Cloudflare Workers"
description: "Jalankan lapisan web Quire yang terkurang pada Cloudflare Workers."
image: "https://docs.quirelms.com/og.png"
---

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

# Lapisan web pada Cloudflare Workers

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

Reka bentuknya ialah `docs/architecture/23-ops.md` seksyen 6. Workers menjalankan
satu lapisan web yang terkurang. Kesetaraan ciri pada Workers di luar skop (PRD
seksyen 12): apa yang sasaran ini tidak boleh lakukan ditolak semasa ia bermula,
mengikut nama.

## Status dalam keluaran ini <!--quire:status-in-this-release-->

Konfigurasi telah sedia (`apps/web/wrangler.jsonc`, pratetap Nitro
`cloudflare-module`, jambatan Hyperdrive dan semakan permulaan). Sebuah Worker
memerlukan storan serasi S3 untuk R2 (`QUIRE_STORAGE_DRIVER=s3`), satu pemandu
masa nyata merentas permintaan (`QUIRE_REALTIME_DRIVER=durable_objects` atau
`centrifugo`), satu cache dikongsi (`QUIRE_CACHE_DRIVER=postgres` atau `valkey`)
dan satu pembekal e-mel HTTP. Tanpanya, Worker enggan bermula dan lognya
menamakan setiap tetapan. Pemandu Durable Objects ialah klien kepada Worker masa
nyata dalam `apps/realtime-worker` (satu Durable Object setiap saluran untuk
pengedaran, kehadiran dan sejarah, satu setiap orang untuk putusan sambungan);
lepaskannya bersama, seperti di bawah, atau gunakan Centrifugo.

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

| Komponen | Pada Cloudflare |
| --- | --- |
| `web` | Sebuah Worker dengan `nodejs_compat` |
| Postgres | Luar, dicapai melalui Hyperdrive: `HYPERDRIVE` untuk peranan aplikasi, `REPORT_HYPERDRIVE` untuk peranan laporan pada pangkalan data fizikal yang sama. Lapisan web menyalin setiap string sambungan ke dalam `DATABASE_URL` dan `QUIRE_REPORT_DATABASE_URL` semasa ia bermula |
| Fail | R2, melalui API S3-nya (`S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com`); pengikat `FILES` melampirkan baldi tersebut |
| Tugas latar belakang | pg-boss melalui Hyperdrive apabila tugas mesti dijadualkan dengan satu tulisan. Dengan `QUIRE_QUEUE_DRIVER=cloudflare` pada pekerja pasangan, tugas ringan (penghantaran notis dan webhook tanpa pesanan) sebaliknya melalui Cloudflare Queues, jadi Postgres tidak dikerjakan untuknya. Pekerja pasangan menjalankan kedua-duanya |
| Masa nyata | Worker masa nyata, `apps/realtime-worker`, dengan Durable Objects |
| `worker`, `scheduler`, `collab`, `content`, ClamAV, Gotenberg, ffmpeg | Sebuah hos bekas teman. Sebuah Worker tidak boleh menjalankannya |
| Penjejakan | Kobservabiliti Workers, dihidupkan dalam `wrangler.jsonc` |

`REPORT_HYPERDRIVE` menyediakan peranan laporan untuk pangkalan data fizikal yang
dinamakan oleh `HYPERDRIVE`. Sasaran ini tidak melayani penyewa yang disemat pada
tambahan pangkalan data fizikal, seperti yang diterangkan di bawah.

## Apa yang sasaran ini tidak boleh lakukan <!--quire:what-this-target-cannot-do-->

Ditolak semasa bermula, dengan setiap masalah disenaraikan serentak:

- **Tiada SMTP.** Gunakan satu pembekal HTTP dalam `QUIRE_EMAIL_PROVIDER_CONFIG`.
- **Tiada cakera setempat.** `QUIRE_STORAGE_DRIVER` mesti menamakan storan objek.
- **Tiada masa nyata atau cache dalam proses.** Workers tidak berkongsi memori
  antara permintaan, jadi `QUIRE_REALTIME_DRIVER=inprocess` dan
  `QUIRE_CACHE_DRIVER=memory` ditolak.
- **Tiada ClamAV, Gotenberg atau ffmpeg dalam Worker.** `CLAMAV_URL`,
  `GOTENBERG_URL` dan `FFMPEG_PATH` yang ditetapkan pada Worker ditolak;
  tetapkannya pada pekerja pasangan sebaliknya.
- **Tiada organisasi pangkalan data khusus.** Pengikat Hyperdrive sebuah Worker
  tetap semasa pelepasan, jadi sebuah organisasi dengan pangkalan datanya sendiri
  mendapat satu halaman "tidak tersedia di sini" yang jelas. Layaninya daripada
  Compose atau Vercel.

Dan satu perkara yang tidak ditolak tetapi mesti diketahui: **prerendering dan
regenerasi statik berperingkat tidak berfungsi pada Workers**, apa sahaja yang
dinyatakan oleh dokumentasi rangka kerja. Setiap laluan dirender mengikut
permintaan.

Pada sasaran ini, kekalkan transaksi pendek dan jangan sekali-kali memegang satu
transaksi merentas satu panggilan rangkaian: Hyperdrive menetapkan semula keadaan
sesi apabila satu sambungan kembali ke kumpulan, jadi konteks penyewa ditetapkan
setiap transaksi.

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

1. Cipta sumber daya:
   ```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
   ```
   Masukkan kedua-dua ID Hyperdrive ke dalam `apps/web/wrangler.jsonc`.
2. Tetapkan rahsia, satu demi satu dengan `bun run --bun wrangler secret put <NAME>`
   daripada `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`. Tetapan biasa
   (`QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN`, `QUIRE_PLATFORM_DOMAINS`,
   `QUIRE_DATABASE_ID`, `S3_ENDPOINT`, `S3_BUCKET`, `QUIRE_COLLAB_URL`) pergi
   ke dalam `vars`.
3. Bina dan lepaskan daripada `apps/web`:
   ```sh
   NITRO_PRESET=cloudflare-module bun run build
   bun run --bun wrangler deploy
   ```
4. Lepaskan Worker masa nyata, dengan `QUIRE_REALTIME_WORKER_SECRET` milik
   lapisan web dan rahsia tokennya sebagai `QUIRE_REALTIME_TOKEN_SECRET`
   (lapisan web menandatangani token masa nyata dengan
   `QUIRE_REALTIME_TOKEN_SECRET`nya sendiri, atau dengan `QUIRE_SECRET_KEY`
   apabila yang itu tidak ditetapkan, jadi gunakan mana-mana yang ia gunakan),
   dan tetapkan `QUIRE_REALTIME_WORKER_URL` pada lapisan web ke alamatnya:
   ```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. Untuk tugas ringan pada Cloudflare Queues, cipta satu giliran setiap giliran
   ringan dan tetapkan ini pada pekerja pasangan (token API dengan baca dan
   tulis 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`, dan `QUIRE_QUEUE_PREFIX` jika bukan `quire-`.
6. Jalankan hos pasangan seperti dalam [panduan Vercel](/ms/ops/vercel/), langkah 3.
   Migrasi berjalan di sana, sebelum setiap pelepasan Worker.

Satu konfigurasi yang ditolak dipaparkan dalam `bun run --bun wrangler tail` sebagai "The
web tier did not start on cloudflare", diikuti oleh setiap tetapan yang perlu
diubah.

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