স্থাপত্যের বিবরণ docs/architecture/23-ops.md-এর section 6-এ। Workers সীমিত web tier চালায়। Workers-এ পূর্ণ feature parity এই কাজের আওতায় নয় (PRD section 12): এই target যা পারে না, startup-এর সময় তার নাম উল্লেখ করে প্রত্যাখ্যান করে।
এই release-এর অবস্থা
Configuration প্রস্তুত আছে (apps/web/wrangler.jsonc, cloudflare-module Nitro preset, Hyperdrive bridge ও startup check)। Worker-এর জন্য R2-তে S3-compatible storage (QUIRE_STORAGE_DRIVER=s3), request জুড়ে কাজ করে এমন realtime driver (QUIRE_REALTIME_DRIVER=durable_objects অথবা centrifugo), shared cache (QUIRE_CACHE_DRIVER=postgres অথবা valkey) এবং HTTP email provider দরকার। এগুলো না থাকলে Worker চালু হতে অস্বীকার করে এবং log-এ প্রতিটি setting-এর নাম দেয়। Durable Objects driver হলো apps/realtime-worker-এর realtime Worker-এর client (fan-out, presence ও history-এর জন্য প্রতি channel-এ একটি Durable Object, disconnect-এর জন্য প্রতি ব্যক্তিতে একটি); নিচে বর্ণিত মতো এর পাশাপাশি এটি deploy করুন অথবা Centrifugo ব্যবহার করুন।
উপাদান
| উপাদান | Cloudflare-এ |
|---|---|
web |
nodejs_compat-সহ একটি Worker |
| Postgres | বাহ্যিক, Hyperdrive দিয়ে সংযুক্ত: application role-এর জন্য HYPERDRIVE, একই physical database-এ report role-এর জন্য REPORT_HYPERDRIVE। Startup-এর সময় web tier প্রতিটি connection string যথাক্রমে DATABASE_URL ও QUIRE_REPORT_DATABASE_URL-এ কপি করে |
| Files | R2, এর S3 API দিয়ে (S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com); FILES binding bucket যুক্ত করে |
| Background job | Write-সহ job enqueue করতে হলে Hyperdrive-এর ওপর pg-boss চলে। Companion worker-এ QUIRE_QUEUE_DRIVER=cloudflare হলে হালকা job (ক্রমবিহীন notification ও webhook delivery) Cloudflare Queues দিয়ে যায়, ফলে সেগুলোর জন্য Postgres poll হয় না। Companion worker উভয় ধরনের কাজ চালায় |
| Realtime | Durable Objects-সহ realtime Worker, apps/realtime-worker |
worker, scheduler, collab, content, ClamAV, Gotenberg, ffmpeg |
Companion container host-এ। Worker এগুলো চালাতে পারে না |
| Trace | Workers observability, wrangler.jsonc-এ চালু করা হয় |
REPORT_HYPERDRIVE HYPERDRIVE-এ উল্লেখ করা physical database-এর report role সরবরাহ করে। নিচে বর্ণিত কারণে এই target অতিরিক্ত physical database-এ বাঁধা tenant পরিবেশন করে না।
এই target-এ যা করা যায় না
Startup-এ অস্বীকার করে এবং প্রতিটি সমস্যা একসঙ্গে তালিকায় দেখায়:
- SMTP নেই।
QUIRE_EMAIL_PROVIDER_CONFIG-এ HTTP provider ব্যবহার করুন। - Local disk নেই।
QUIRE_STORAGE_DRIVER-এ object storage দিতে হবে। - In-process realtime বা cache নেই। request-এর মধ্যে Workers memory ভাগ করে না, তাই
QUIRE_REALTIME_DRIVER=inprocessওQUIRE_CACHE_DRIVER=memoryপ্রত্যাখ্যাত হয়। - Worker-এর মধ্যে ClamAV, Gotenberg বা ffmpeg নেই। Worker-এ দেওয়া
CLAMAV_URL,GOTENBERG_URLওFFMPEG_PATHপ্রত্যাখ্যাত হয়; এগুলো companion worker-এ দিন। - নির্দিষ্ট database-সহ প্রতিষ্ঠান নেই। Worker-এর Hyperdrive binding deploy-এর সময় স্থির হয়, তাই নিজস্ব database-সহ প্রতিষ্ঠানের জন্য স্পষ্ট “unavailable here” পৃষ্ঠা দেখায়। সেটিকে Compose অথবা Vercel থেকে পরিবেশন করুন।
আরেকটি বিষয় প্রত্যাখ্যাত হয় না, তবে জানা আবশ্যক: framework-এর documentation যা-ই বলুক, Workers-এ prerendering ও incremental static regeneration কাজ করে না। প্রতিটি route প্রতি request-এ render হয়।
এই target-এ transaction সংক্ষিপ্ত রাখুন এবং network call চলাকালে কখনো transaction ধরে রাখবেন না: connection pool-এ ফেরার সময় Hyperdrive session state reset করে, তাই প্রতিটি transaction-এ tenant context সেট হয়।
Deploy করা
- Resource তৈরি করুন:
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-jobsapps/web/wrangler.jsonc-এ দুটি Hyperdrive ID দিন। - Secret দেওয়ার জন্য
bun run --bun wrangler secret put <NAME>command একবারে একটি করে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। সাধারণ setting (QUIRE_APP_ORIGIN,QUIRE_CONTENT_ORIGIN,QUIRE_PLATFORM_DOMAINS,QUIRE_DATABASE_ID,S3_ENDPOINT,S3_BUCKET,QUIRE_COLLAB_URL)vars-এ দিন। apps/webথেকে build ও deploy করুন:NITRO_PRESET=cloudflare-module bun run build bun run --bun wrangler deploy- Web tier-এর
QUIRE_REALTIME_WORKER_SECRETএবং token secret-কেQUIRE_REALTIME_TOKEN_SECRETহিসেবে দিয়ে realtime Worker deploy করুন (web tier তার নিজস্বQUIRE_REALTIME_TOKEN_SECRETদিয়ে realtime token sign করে, অথবা সেটি unset থাকলেQUIRE_SECRET_KEYদিয়ে; তাই যেটি ব্যবহৃত হয় সেটিই দিন); web tier-এQUIRE_REALTIME_WORKER_URL-এ Worker-এর address দিন: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 - Cloudflare Queues-এ হালকা job চালাতে প্রতি light queue-র জন্য একটি queue তৈরি করে companion worker-এ এগুলো দিন (Queues read ও write অনুমতিসহ API token লাগবে):
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-deadQUIRE_QUEUE_DRIVER=cloudflare,CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_QUEUES_TOKENএবং prefix নির্ধারণেQUIRE_QUEUE_PREFIXদিন; default prefix হলোquire-। - Vercel নির্দেশিকা-এর 3 নম্বর ধাপের মতো companion host চালান। প্রতিটি Worker deployment-এর আগে সেখানেই migration চলে।
Configuration প্রত্যাখ্যাত হলে bun run --bun wrangler tail-এ “The web tier did not start on cloudflare” দেখা যায় এবং বদলাতে হবে এমন প্রতিটি setting-এর তালিকা থাকে।