# Single-Instance Multi-Tenant Architecture Exploration



Ramblers head office is in discussions about adopting NGX Ramblers as a solution to roll out to groups nationally. **The primary driver is the Brevo email integration** — Ramblers Head Office wants to offer groups a ready-made email solution (newsletters, walk notifications, booking confirmations) without each group having to set up and manage their own email infrastructure. One of their preferences is that a single NGX instance could serve multiple groups rather than the current model of one deployment per group. **Scale target: up to 500 groups.**


## Target Architecture — outlined more detail in the following articles

```mermaid
flowchart TD
    D1@{ icon: "ngx:user", label: "group-a-ramblers.org.uk", pos: "b", h: 48 }
    D2@{ icon: "ngx:user", label: "group-b-ramblers.org.uk", pos: "b", h: 48 }
    DN@{ icon: "ngx:user", label: "...up to 500 domains", pos: "b", h: 48 }

    D1 --> CF
    D2 --> CF
    DN --> CF

    CF@{ icon: "ngx:cloudflare", label: "Cloudflare DNS", pos: "b", h: 48 }
    CF --> FLY

    subgraph FLY["Fly.io Application - 2 to 4 instances"]
        TM["Tenant Resolution Middleware<br/>Host header to groupCode"]
        CACHE["Domain-to-group cache<br/>refreshed periodically"]
        DBR["Database Router<br/>groupCode to mongoose.useDb"]
        TM --> CACHE
        TM --> DBR
    end

    DBR --> MDB1@{ icon: "ngx:mongodb", label: "Group A DB", pos: "b", h: 48 }
    DBR --> MDB2@{ icon: "ngx:mongodb", label: "Group B DB", pos: "b", h: 48 }
    DBR --> MDBN@{ icon: "ngx:mongodb", label: "Group N DB", pos: "b", h: 48 }

    MDB1 --> S3
    MDB2 --> S3
    MDBN --> S3

    S3@{ icon: "ngx:aws", label: "Single S3 Bucket<br/>/{groupCode}/images/", pos: "b", h: 48 }

    style FLY fill:#E8F5EE,stroke:#9BC8AB,stroke-width:2px,rx:12,ry:12,color:#404143
```


_____

This series of articles explores what would be required to re-architect NGX Ramblers so that any number of groups run off a single application instance, while maintaining the same segregated user experience — where navigating to a group's domain shows only that group's branding, members, walks, and content.


## Platform Overview

What NGX Ramblers provides beyond email — walks, bookings, galleries, CMS, and more

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)

## Current Architecture

How the per-group deployment model works today — one Docker image, 13 independent apps

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)

## Proposed Architecture

Single-instance multi-tenant design — tenant resolution, database switching, request lifecycle

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)

## Brevo Email at Scale

The primary rollout driver — outbound email, deliverability, and multi-tenant email isolation

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)

## Billing and Costs

Fly.io free-tier analysis, cost comparison at 500 groups, and billing risk assessment

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)

## Assessment and Recommendation

Honest pros and cons, effort estimates (AI-assisted vs manual), and recommended approach

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fb7500d8-1a94-4527-a62f-969e5843f960.jpg)