---
title: "Web tier di Cloudflare Workers"
description: "Jalankan web tier Quire dengan kemampuan terbatas di Cloudflare Workers."
image: "https://docs.quirelms.com/og.png"
---

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

# Web tier di Cloudflare Workers

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

Desainnya ada di `docs/architecture/23-ops.md`, bagian 6. Workers menjalankan web tier dengan kemampuan terbatas. Kesetaraan fitur pada Workers berada di luar cakupan (PRD bagian 12): hal yang tidak dapat dilakukan target ini ditolak saat mulai dengan menyebutkan namanya.

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

Konfigurasi sudah tersedia (`apps/web/wrangler.jsonc`, preset Nitro `cloudflare-module`, jembatan Hyperdrive, dan pemeriksaan saat mulai). Worker memerlukan penyimpanan yang kompatibel dengan S3 untuk R2 (`QUIRE_STORAGE_DRIVER=s3`), driver realtime lintas permintaan (`QUIRE_REALTIME_DRIVER=durable_objects` atau `centrifugo`), cache bersama (`QUIRE_CACHE_DRIVER=postgres` atau `valkey`), dan penyedia email HTTP. Tanpanya, Worker menolak mulai dan log menyebut setiap pengaturan. Driver Durable Objects menggunakan Worker realtime di `apps/realtime-worker` sebagai klien (satu Durable Object per kanal untuk distribusi, kehadiran, dan riwayat; satu per orang untuk pemutusan koneksi); deploy bersamanya seperti di bawah atau gunakan Centrifugo.

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

| Komponen | Di Cloudflare |
| --- | --- |
| `web` | Worker dengan `nodejs_compat` |
| Postgres | Eksternal, diakses melalui Hyperdrive: `HYPERDRIVE` untuk peran aplikasi dan `REPORT_HYPERDRIVE` untuk peran laporan pada basis data fisik yang sama. Saat mulai, web tier menyalin setiap string koneksi ke `DATABASE_URL` dan `QUIRE_REPORT_DATABASE_URL` |
| Berkas | R2 melalui API S3 (`S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com`); binding `FILES` menghubungkan bucket |
| Pekerjaan latar belakang | pg-boss melalui Hyperdrive saat pekerjaan perlu dimasukkan ke antrean bersama penulisan. Jika worker pendamping memakai `QUIRE_QUEUE_DRIVER=cloudflare`, pekerjaan ringan (notifikasi tanpa urutan dan pengiriman webhook) dialihkan ke Cloudflare Queues sehingga Postgres tidak disurvei untuk pekerjaan itu. Worker pendamping menjalankan keduanya |
| Realtime | Worker realtime, `apps/realtime-worker`, dengan Durable Objects |
| `worker`, `scheduler`, `collab`, `content`, ClamAV, Gotenberg, ffmpeg | Host container pendamping. Worker tidak dapat menjalankannya |
| Pelacakan | Workers observability, diaktifkan dalam `wrangler.jsonc` |

`REPORT_HYPERDRIVE` menyediakan peran laporan untuk basis data fisik yang disebut `HYPERDRIVE`. Target ini tidak melayani tenant yang dipatok ke basis data fisik tambahan, seperti dijelaskan di bawah.

## Hal yang tidak dapat dilakukan target ini <!--quire:what-this-target-cannot-do-->

Saat mulai, semua masalah berikut langsung dicantumkan dan konfigurasi ditolak:

- **Tidak ada SMTP.** Gunakan penyedia HTTP melalui `QUIRE_EMAIL_PROVIDER_CONFIG`.
- **Tidak ada disk lokal.** `QUIRE_STORAGE_DRIVER` harus menyebut penyimpanan objek.
- **Tidak ada realtime atau cache dalam proses.** Workers tidak berbagi memori antarpermintaan, sehingga `QUIRE_REALTIME_DRIVER=inprocess` dan `QUIRE_CACHE_DRIVER=memory` ditolak.
- **Worker tidak menjalankan ClamAV, Gotenberg, atau ffmpeg.** `CLAMAV_URL`, `GOTENBERG_URL`, dan `FFMPEG_PATH` yang ditetapkan pada Worker ditolak; tetapkan pada worker pendamping.
- **Organisasi dengan basis data khusus tidak didukung.** Binding Hyperdrive Worker tetap saat deployment, sehingga organisasi dengan basis data sendiri mendapat halaman "unavailable here". Layani dari Compose atau Vercel.

Ada satu hal yang tidak ditolak, tetapi harus diketahui: **prerendering dan regenerasi statis inkremental tidak berfungsi di Workers**, apa pun kata dokumentasi framework. Setiap route dirender untuk setiap permintaan.

Pada target ini, pertahankan transaction tetap singkat dan jangan membiarkannya terbuka selama panggilan jaringan: Hyperdrive mengatur ulang status sesi saat koneksi kembali ke pool, jadi konteks tenant ditetapkan per transaction.

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

1. Buat 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 ID Hyperdrive ke `apps/web/wrangler.jsonc`.
2. Tetapkan rahasia satu per satu dengan `bun run --bun wrangler secret put <NAME>` dari `apps/web`: `QUIRE_SECRET_KEY`, `QUIRE_MASTER_KEY`, `QUIRE_EMAIL_PROVIDER_CONFIG`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, `QUIRE_COLLAB_SIGNING_KEY`, dan `QUIRE_REALTIME_WORKER_SECRET`. Pengaturan biasa (`QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN`, `QUIRE_PLATFORM_DOMAINS`, `QUIRE_DATABASE_ID`, `S3_ENDPOINT`, `S3_BUCKET`, `QUIRE_COLLAB_URL`) dimasukkan ke `vars`.
3. Build dan deploy dari `apps/web`:
   ```sh
   NITRO_PRESET=cloudflare-module bun run build
   bun run --bun wrangler deploy
   ```
4. Deploy Worker realtime menggunakan `QUIRE_REALTIME_WORKER_SECRET` milik web tier dan rahasia tokennya sebagai `QUIRE_REALTIME_TOKEN_SECRET`. Web tier menandatangani token realtime dengan `QUIRE_REALTIME_TOKEN_SECRET` sendiri atau `QUIRE_SECRET_KEY` jika yang pertama tidak diatur; gunakan nilai yang dipakainya. Tetapkan `QUIRE_REALTIME_WORKER_URL` di web tier ke alamat Worker:
   ```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 pekerjaan ringan melalui Cloudflare Queues, buat satu antrean untuk tiap antrean ringan dan atur nilainya pada worker pendamping (token API dengan izin 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
   ```
   Tetapkan `QUIRE_QUEUE_DRIVER=cloudflare`, `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_QUEUES_TOKEN`, dan `QUIRE_QUEUE_PREFIX` jika bukan `quire-`.
6. Jalankan host pendamping seperti langkah 3 di [panduan Vercel](/id/ops/vercel/). Migration dijalankan di sana sebelum setiap deployment Worker.

Konfigurasi yang ditolak terlihat di `bun run --bun wrangler tail` sebagai "The web tier did not start on cloudflare", diikuti setiap pengaturan yang harus diubah.

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