---
title: "שכבת האינטרנט ב-Cloudflare Workers"
description: "הפעילו שכבת אינטרנט מצומצמת של Quire ב-Cloudflare Workers."
image: "https://docs.quirelms.com/og.png"
---

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

# שכבת האינטרנט ב-Cloudflare Workers

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

התכנון נמצא בסעיף 6 של `docs/architecture/23-ops.md`. Workers מפעילים שכבת אינטרנט
מצומצמת. שוויון מלא בתכונות של Workers אינו בתחום (PRD סעיף 12): מה שהיעד הזה אינו
יכול לעשות נדחה עם ציון מפורש של הדבר בעת ההפעלה.

## מצב בגרסה זו <!--quire:status-in-this-release-->

התצורה מוכנה (`apps/web/wrangler.jsonc`, קביעת Nitro בשם `cloudflare-module`, גשר
Hyperdrive ובדיקות ההפעלה). Worker זקוק לאחסון תואם S3 עבור R2
(`QUIRE_STORAGE_DRIVER=s3`), ל-driver realtime בין בקשות
(`QUIRE_REALTIME_DRIVER=durable_objects` או `centrifugo`), למטמון משותף
(`QUIRE_CACHE_DRIVER=postgres` או `valkey`) ולספק דוא״ל דרך HTTP. בלעדיהם ה-Worker
מסרב לעלות והיומן מציין כל הגדרה חסרה. Driver של Durable Objects הוא לקוח של Worker
ה-realtime שב-`apps/realtime-worker` (אובייקט Durable אחד לכל ערוץ עבור fan-out,
נוכחות והיסטוריה, ואחד לכל אדם עבור ניתוקים); פרסו אותו לצדו כמתואר בהמשך או השתמשו
ב-Centrifugo.

## הרכיבים <!--quire:the-pieces-->

| רכיב | ב-Cloudflare |
| --- | --- |
| `web` | Worker עם `nodejs_compat` |
| Postgres | חיצוני, נגיש דרך Hyperdrive:‏ `HYPERDRIVE` עבור תפקיד היישום, ו-`REPORT_HYPERDRIVE` עבור תפקיד הדוחות באותו מסד פיזי. בעת ההפעלה שכבת האינטרנט מעתיקה כל מחרוזת חיבור אל `DATABASE_URL` ו-`QUIRE_REPORT_DATABASE_URL` |
| קבצים | R2 באמצעות S3 API (`S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com`); הקישור `FILES` מחבר את ה-bucket |
| עבודות רקע | pg-boss מעל Hyperdrive כשצריך להכניס עבודה לתור יחד עם כתיבה. כאשר `QUIRE_QUEUE_DRIVER=cloudflare` מוגדר בעובד הנלווה, העבודות הקלות (שליחות notification ו-webhook שאינן לפי סדר) עוברות דרך Cloudflare Queues ולכן Postgres אינו נשאל עליהן. העובד הנלווה מפעיל את שני סוגי העבודות |
| Realtime | Worker ה-realtime,‏ `apps/realtime-worker`, עם Durable Objects |
| `worker`, `scheduler`, `collab`, `content`,‏ ClamAV,‏ Gotenberg,‏ ffmpeg | מארח קונטיינרים נלווה. Worker אינו יכול להפעיל אותם |
| מעקב | תצפיתיות של Workers, מופעלת ב-`wrangler.jsonc` |

`REPORT_HYPERDRIVE` מספק תפקיד דוחות עבור המסד הפיזי ששמו נקבע ב-`HYPERDRIVE`.
היעד הזה אינו משרת tenants שמוצמדים למסדי נתונים פיזיים נוספים, כפי שמתואר בהמשך.

## מה יעד זה אינו יכול לעשות <!--quire:what-this-target-cannot-do-->

ההפעלה נדחית מיד וכל הבעיות מוצגות יחד:

- **אין SMTP.** השתמשו בספק HTTP ב-`QUIRE_EMAIL_PROVIDER_CONFIG`.
- **אין דיסק מקומי.** `QUIRE_STORAGE_DRIVER` חייב לציין אחסון אובייקטים.
- **אין realtime או cache בתוך התהליך.** Workers אינם חולקים זיכרון בין בקשות,
  לכן `QUIRE_REALTIME_DRIVER=inprocess` ו-`QUIRE_CACHE_DRIVER=memory` נדחים.
- **אין ClamAV,‏ Gotenberg או ffmpeg בתוך Worker.** ערכי `CLAMAV_URL`,‏
  `GOTENBERG_URL` ו-`FFMPEG_PATH` שמוגדרים ב-Worker נדחים; הגדירו אותם בעובד הנלווה.
- **אין ארגונים עם מסד נתונים ייעודי.** קישורי Hyperdrive של Worker מקובעים בזמן
  הפריסה, ולכן ארגון בעל מסד משלו מקבל עמוד ברור עם הכיתוב "unavailable here".
  שרתו אותו באמצעות Compose או Vercel.

ויש דבר שאינו נדחה אך חשוב לדעת: **עיבוד מראש והתחדשות סטטית מצטברת אינם פועלים
ב-Workers**, בלי קשר למה שכתוב בתיעוד של המסגרת. כל נתיב מוצג מחדש בכל בקשה.

ביעד הזה הקפידו על טרנזקציות קצרות ולעולם אל תשאירו טרנזקציה פתוחה במהלך קריאת רשת:
Hyperdrive מאפס את מצב ההפעלה כשהחיבור חוזר למאגר, ולכן הקשר ה-tenant מוגדר בכל
טרנזקציה.

## פריסה <!--quire:deploying-->

1. צרו את המשאבים:
   ```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
   ```
   הכניסו את שני מזהי Hyperdrive ל-`apps/web/wrangler.jsonc`.
2. הגדירו סודות, אחד בכל פעם באמצעות `bun run --bun wrangler secret put <NAME>` מתוך
   `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`.
   הגדרות רגילות (`QUIRE_APP_ORIGIN`,‏ `QUIRE_CONTENT_ORIGIN`,‏ `QUIRE_PLATFORM_DOMAINS`,‏
   `QUIRE_DATABASE_ID`,‏ `S3_ENDPOINT`,‏ `S3_BUCKET`,‏ `QUIRE_COLLAB_URL`) שייכות ל-`vars`.
3. בנו ופרסו מתוך `apps/web`:
   ```sh
   NITRO_PRESET=cloudflare-module bun run build
   bun run --bun wrangler deploy
   ```
4. פרסו את Worker ה-realtime עם `QUIRE_REALTIME_WORKER_SECRET` של שכבת האינטרנט
   ועם סוד האסימון שלו בתור `QUIRE_REALTIME_TOKEN_SECRET` (שכבת האינטרנט חותמת
   אסימוני realtime עם `QUIRE_REALTIME_TOKEN_SECRET` משלה, או עם `QUIRE_SECRET_KEY`
   אם הראשון לא הוגדר, לכן השתמשו בערך שהיא משתמשת בו), והגדירו בשכבת האינטרנט את
   `QUIRE_REALTIME_WORKER_URL` לכתובת שלו:
   ```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. לעבודות קלות ב-Cloudflare Queues, צרו תור לכל תור קל והגדירו אותם בעובד הנלווה
   (אסימון API עם הרשאות קריאה וכתיבה לתורים):
   ```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` אם אינו `quire-`.
6. הפעילו את המארח הנלווה כמתואר בשלב 3 של [מדריך Vercel](/he/ops/vercel/). המיגרציות
   מתבצעות שם לפני כל פריסת Worker.

תצורה שנדחתה מופיעה ב-`bun run --bun wrangler tail` בתור "The web tier did not start on cloudflare",
ואחריו מופיעות ההגדרות שיש לשנות.

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