ADRs
ADR 0005 — Dedicated Worker для API, не Pages Functions
  • Date: 2026-05-21
  • Status: Accepted
  • Phase: 8

Context

Phase 8 нужен HTTP backend для workflow + composition persistence. Cloudflare даёт два пути:

A. Pages Functions — функции рядом со static site в apps/web/functions/api/*.ts. Деплоятся вместе с CF Pages, тот же origin.

B. Dedicated Worker — отдельный CF Workers project, своя wrangler config, свой subdomain arno-api.{account}.workers.dev.

Decision

Dedicated Worker (apps/api/).

Главный driver — Workers Paid features нужны в фазах 11/13/16:

  • Durable Objects (Phase 11 push mutex per §I.3.3) — недоступны в Pages Functions даже на Paid Pages plan
  • Cloudflare Queues (Phase 13 webhook DAG ordering, retry queue per §I.3.8) — Workers-only
  • Cron Triggers (Phase 16 probes, reconciliation, token refresh per §III.2.4) — Workers-only

Pages Functions покрывают только REST CRUD scenarios. Phase 11+ всё равно потребовал бы переезд:

  • Сменить routing (arno-ijr.pages.dev/api/*arno-api.workers.dev)
  • Сменить CORS topology (same-origin → cross-origin)
  • Перенос session / auth cookies (domain change)
  • ~2 дня work + риск регрессии

Выбираем dedicated Worker сразу = pay-once архитектурное решение.

Trade-offs vs Pages Functions

Cons dedicated Worker:

  • Cross-origin: нужен CORS middleware (минимальный — hono/cors)
  • Auth куки доменно ограничены — Phase 9 решит через Bearer JWT в Authorization header (per master spec §III.2.6), что и так planned
  • Два deploy target'а (Pages для frontend, Worker для API) — manageable, оба через wrangler

Pros:

  • Architectural consistency с master spec §III (Workers paid backend)
  • Full feature set с Phase 8 day-one
  • Скейлится независимо от frontend
  • Easier observability (отдельный Worker logs / metrics)

Workers Paid cost

$5/mo activation. Master spec §III.6 сознательно проектировал стек вокруг этой цифры. Без Paid — Phase 11/13/16 ломаются.

Setup

# apps/api/wrangler.toml — name="arno-api", compatibility_flags=["nodejs_compat"]
cd apps/api
wrangler login
wrangler secret put DATABASE_URL   # paste Neon connection string
wrangler deploy                     # → https://arno-api.{account}.workers.dev

Frontend apps/web/src/lib/api-client.ts указывает на этот URL hardcoded (Phase 13 сделает per-project через .arno/config.json).

Cross-references

  • ADR-0001 — static export CF Pages для frontend (stays)
  • Master spec §III.1 — Workers Paid в stack
  • Master spec §III.2.1 — backend module structure (routes/, services/, repositories/)
  • Master spec §III.6 — cost ladder