Current Architecture: Per-Group Deployment Model


The current NGX Ramblers architecture deploys a single Docker image to multiple independent Fly.io apps. Each app connects to its own MongoDB database and S3 bucket, providing complete data isolation.

Architecture Diagram

flowchart TD
    IMG@{ icon: "logos:docker-icon", label: "Single Docker Image", pos: "b", h: 48 }

    IMG --> APP1@{ icon: "logos:fly-icon", label: "Group A (512MB)", pos: "b", h: 48 }
    IMG --> APP2@{ icon: "logos:fly-icon", label: "Group B (512MB)", pos: "b", h: 48 }
    IMG --> APP3@{ icon: "logos:fly-icon", label: "Group C (512MB)", pos: "b", h: 48 }
    IMG --> APPN["... x 13 apps"]

    APP1 --> DB1@{ icon: "ngx:mongodb", label: "Group A DB", pos: "b", h: 48 }
    APP2 --> DB2@{ icon: "ngx:mongodb", label: "Group B DB", pos: "b", h: 48 }
    APP3 --> DB3@{ icon: "ngx:mongodb", label: "Group C DB", pos: "b", h: 48 }

    APP1 --> S31@{ icon: "ngx:aws", label: "Group A bucket", pos: "b", h: 48 }
    APP2 --> S32@{ icon: "ngx:aws", label: "Group B bucket", pos: "b", h: 48 }
    APP3 --> S33@{ icon: "ngx:aws", label: "Group C bucket", pos: "b", h: 48 }

Key Characteristics

What Already Works

Capability Status
Single codebase One repo, one team
Single build artifact One Docker image for all sites
Automated group provisioning CLI tool creates new groups end-to-end
Per-group custom domains Each group has its own domain and branding
Complete data isolation Physically separate databases — no cross-group leakage possible

Strengths of This Model