Stack tecnico
Le componenti runtime di FireFeed e come comunicano.
┌──────────────────┐ HTTPS ┌──────────────────┐
│ Browser utente │ ───────────────────► │ exp.fire-feed │ (web container)
└──────────────────┘ │ Next.js 15 │
▲ │ App Router │
│ SSE pipeline events │ API routes │
└─────────────────────────────────┤ NextAuth v5 │
└────────┬─────────┘
│
┌────────────────────┼──────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Postgres │ │ Redis │ │ Keycloak │
│ (managed) │ │ (pubsub + │ │ 26 SSO │
│ schemas │ │ BullMQ) │ │ (remoto) │
│ per tenant │ └─────▲──────┘ └────────────┘
└────────────┘ │
│ jobs
┌───────┴────────┐
│ worker Fastify │
│ BullMQ workers │
│ pipeline jobs │
└────────────────┘Componenti
| Componente | Tecnologia | Ruolo |
|---|---|---|
| web | Next.js 15 (App Router, React 19, Tailwind 4) | Feed Manager UI + API REST |
| oms | Next.js 15 (App Router, React 19, Tailwind 4) | OMS UI + API operative tenant-scoped |
| worker | Fastify 5 + BullMQ + Node 20 | Esecuzione async dei job pipeline |
| shared | TypeScript library | Connettori, regole, Prisma client, schemi OpenAPI |
| auth | NextAuth v5 wrapper | Adapter Keycloak |
| Resend SDK + react-email | Mail transazionali | |
| docs | Next.js 16 + Fumadocs | Questo sito |
| Postgres | Postgres 16 | Persistenza, multi-schema per company |
| Redis | Redis 7 (managed) | BullMQ + pubsub SSE |
| Keycloak | Keycloak 26 (remoto) | SSO multi-client |
Monorepo
Gestito con pnpm workspaces + Turborepo:
packages/
├── auth/ # NextAuth + Keycloak adapter
├── docs/ # Fumadocs site (questo)
├── mail/ # Resend templates + client
├── oms/ # Next.js OMS: ordini, stock, spedizioni e resi
├── shared/ # Connettori, regole, Prisma, schemi OpenAPI
├── *-sdk/ # SDK TypeScript indipendenti per marketplace e carrier
├── web/ # Next.js app (UI + API)
└── worker/ # Fastify + BullMQ
tools/
└── openapi-gen/ # CLI per generare openapi.json da ZodDatabase
Una sola istanza Postgres. Tabelle control plane in public, dati prodotto in
company_<companyId> e dominio operativo in oms_<companyId> per ciascuna company.
Vedi Multi-tenant.
Prisma 7 come ORM per il control plane; per i dati prodotto (colonne dinamiche dai database_fields) si usa SQL diretto via pg driver, con identifier sanitization in SchemaService.