התכנון נמצא בסעיף 6 של docs/architecture/23-ops.md. Workers מפעילים שכבת אינטרנט
מצומצמת. שוויון מלא בתכונות של Workers אינו בתחום (PRD סעיף 12): מה שהיעד הזה אינו
יכול לעשות נדחה עם ציון מפורש של הדבר בעת ההפעלה.
מצב בגרסה זו
התצורה מוכנה (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.
הרכיבים
רכיב
ב-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 אינו יכול להפעיל אותם
מעקב
תצפיתיות של Workers, מופעלת ב-wrangler.jsonc
REPORT_HYPERDRIVE מספק תפקיד דוחות עבור המסד הפיזי ששמו נקבע ב-HYPERDRIVE.
היעד הזה אינו משרת tenants שמוצמדים למסדי נתונים פיזיים נוספים, כפי שמתואר בהמשך.
מה יעד זה אינו יכול לעשות
ההפעלה נדחית מיד וכל הבעיות מוצגות יחד:
אין 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 מוגדר בכל
טרנזקציה.
פריסה
צרו את המשאבים:
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-filesbun run --bun wrangler queues create quire-jobs
הכניסו את שני מזהי Hyperdrive ל-apps/web/wrangler.jsonc.
הגדירו סודות, אחד בכל פעם באמצעות 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.
בנו ופרסו מתוך apps/web:
NITRO_PRESET=cloudflare-module bun run buildbun run --bun wrangler deploy
פרסו את Worker ה-realtime עם QUIRE_REALTIME_WORKER_SECRET של שכבת האינטרנט
ועם סוד האסימון שלו בתור QUIRE_REALTIME_TOKEN_SECRET (שכבת האינטרנט חותמת
אסימוני realtime עם QUIRE_REALTIME_TOKEN_SECRET משלה, או עם QUIRE_SECRET_KEY
אם הראשון לא הוגדר, לכן השתמשו בערך שהיא משתמשת בו), והגדירו בשכבת האינטרנט את
QUIRE_REALTIME_WORKER_URL לכתובת שלו:
cd apps/realtime-workerbun run --bun wrangler secret put QUIRE_REALTIME_WORKER_SECRETbun run --bun wrangler secret put QUIRE_REALTIME_TOKEN_SECRETbun run --bun wrangler deploy
לעבודות קלות ב-Cloudflare Queues, צרו תור לכל תור קל והגדירו אותם בעובד הנלווה
(אסימון API עם הרשאות קריאה וכתיבה לתורים):
bun run --bun wrangler queues create quire-events-notificationsbun run --bun wrangler queues create quire-events-notifications-deadbun run --bun wrangler queues create quire-events-webhooksbun run --bun wrangler queues create quire-events-webhooks-dead
הגדירו QUIRE_QUEUE_DRIVER=cloudflare, CLOUDFLARE_ACCOUNT_ID,
CLOUDFLARE_QUEUES_TOKEN, ואת QUIRE_QUEUE_PREFIX אם אינו quire-.
הפעילו את המארח הנלווה כמתואר בשלב 3 של מדריך Vercel. המיגרציות
מתבצעות שם לפני כל פריסת Worker.
תצורה שנדחתה מופיעה ב-bun run --bun wrangler tail בתור “The web tier did not start on cloudflare”,
ואחריו מופיעות ההגדרות שיש לשנות.