Architecture

Duaba Architecture

How the Duabalabs products are organised and how they share infrastructure.

Product map

                          ┌──────────────────────────────┐
                          │   duabalabs.com (umbrella)   │
                          └──────────────┬───────────────┘

   ┌────────────┬───────────────┬────────┴────────┬───────────────┬─────────────┐
   │            │               │                 │               │             │
┌──────┐  ┌──────────┐  ┌──────────────┐  ┌────────────┐   ┌────────────┐  ┌─────────┐
│Sellub│  │   DPS    │  │   3y3anaa    │  │   Proxy    │   │ Duabanti / │  │  TBD    │
│      │  │ (Parse-  │  │  (delivery)  │  │  Fidelity  │   │ Duabaforge │  │Logistics│
│      │  │ as-a-svc)│  │              │  │            │   │ /Connect   │  │         │
└───┬──┘  └────┬─────┘  └──────┬───────┘  └──────┬─────┘   └─────┬──────┘  └────┬────┘
    │          │               │                 │               │               │
    └──────────┴───────────────┴─────────┬───────┴───────────────┴───────────────┘

                              ┌────────────────────┐
                              │  Shared infra      │
                              │  (Swarm + DBs +    │
                              │   secrets + auth)  │
                              └────────────────────┘

Shared building blocks

LayerToolingNotes
ComputeDocker Swarm on Azure VMsPer-product stacks; see Infrastructure
DatastoresPostgres (Sellub, Vendure), MongoDB (DPS, Parse)Per-product, no cross-product DB sharing
Cache / queueRedisShared cluster, per-product DB index
Object storageAzure BlobPer-product container
Edge / CDNNetlify (landing + storefronts + docs), Cloudflare DNS
PaymentsPaystack (cards, MoMo, bank)Used by Sellub and Duabanti
EmailResend (transactional), Mailchimp (marketing)
AuthPer-product (Vendure for Sellub, Parse for DPS-hosted apps)No SSO between products yet
CI/CDGitHub Actions → ACR → SSH deploySee Infrastructure → Deployment

Repository layout

The umbrella monorepo duabalabs/duaba uses Git submodules for each product. Top-level structure:

duaba/
├── apps/
│   ├── sellub/              ← submodule (server, dashboard, storefront)
│   ├── dps/                 ← submodule (server, dashboard, templates)
│   ├── 3y3anaa/             ← submodule (server, app, landing)
│   ├── proxy-fidelity/      ← submodule
│   ├── duabanti-landing/    ← submodule
│   ├── duabaforge-landing/  ← submodule
│   ├── duabaconnect-landing/← submodule
│   ├── tbdlogistics-landing/← submodule
│   ├── duabalabs-landing/   ← submodule
│   ├── automation/          ← n8n workflows shared across products
│   └── duaba-docs/          ← THIS docs site
├── packages/
│   └── dps-client/          ← shared @duabalabs/dps-client SDK
├── ci/                      ← shared CI scripts and Dockerfiles
├── docs/                    ← legacy docs (being migrated into duaba-docs)
└── tools/                   ← provisioning + admin scripts

How docs are aggregated

Each product owns the content for its own section under apps/duaba-docs/pages/<product>/. PRs to docs go through the same review as code.

Long-form runbooks and API specs typically live in the product’s own repo (under docs/); the umbrella docs link to them with edit-on-GitHub routes pointed at the source repo.

Where the lines are between products

Hard rule: no product talks directly to another product’s database. All cross-product data flows go through HTTP / GraphQL APIs or the shared event bus. This keeps deploys independent and makes it possible to spin a product down without breaking the others.

Cross-product flowMechanism
Sellub → DPS (storefront-as-a-service for sellers)DPS Provisioning API
3y3anaa → Sellub (deliveries for marketplace orders)Sellub Webhooks → 3y3anaa Dispatch API
Duabanti → Sellub (donation checkout)Sellub Shop API
All → DPS (analytics events)DPS Events ingress