Backend
Application Architecture
Monorepo Architecture

1. Monorepo আসলে কী?

Monorepo (Monolithic Repository) মানে হলো একটা single Git repository-তে অনেকগুলো project / service / app একসাথে রাখা। অন্যদিকে Polyrepo মানে হলো প্রতিটা service বা app আলাদা repository-তে রাখা।

Analogy: ধরুন একটা কোম্পানির ভেতরে অনেক ডিপার্টমেন্ট আছে → HR, Sales, Marketing, IT.

  • যদি প্রতিটা ডিপার্টমেন্ট আলাদা আলাদা বিল্ডিং-এ থাকে → Polyrepo.
  • যদি সব ডিপার্টমেন্ট একটা বড় বিল্ডিং-এর ভেতরে থাকে, কিন্তু আলাদা ফ্লোরে ভাগ করা → Monorepo.

2. Monorepo কেন দরকার?

  • সবকিছু একই repo-তে থাকায় → সহজে manage, develop, test, deploy করা যায়।
  • Shared code (utils, types, constants, config ইত্যাদি) সহজে reuse করা যায়।
  • CI/CD pipeline এক জায়গা থেকে run করা যায়।
  • Dependency management সহজ হয় (যেমন একই eslint config সব জায়গায়)।
  • Cross-team collaboration সহজ হয়।

3.Example: Trip Booking CMS

ধরি আপনি একটা বড় SaaS বানাচ্ছো:

  • Frontend Apps

    • admin-dashboard → Super Admin manage করবে
    • saas-landing-page → আপনি SaaS এর main website
    • b2b-site → প্রতিটা company (agency) এর booking site
    • b2b-dashboard → Agency (B2B client) এর backend dashboard
    • b2c-dashboard → End user / traveler এর booking panel
  • Backend

    • auth-service (NestJS) → Login, JWT, OAuth ইত্যাদি
    • booking-service (NestJS) → Flight, Hotel booking logic
    • payment-service (NestJS + Stripe)
    • notification-service (NestJS + Mail/SMS/Push)
  • Shared Packages (Libraries)

    • ui → Common React/Tailwind UI components (button, modal, form ইত্যাদি)
    • utils → Helper functions (date formatting, validation)
    • types → Shared TypeScript interfaces/types
    • config → ESLint, Prettier, Tailwind config

👉 এগুলো সবকিছু এক repo-র ভেতরে থাকবে।


4. Folder Structure (Practical Example)

trip-booking-cms/

├── apps/                        # Main applications
│   ├── admin-dashboard/         # Next.js / React
│   ├── saas-landing-page/       # Next.js / React
│   ├── b2b-site/                # Next.js / React
│   ├── b2b-dashboard/           # Next.js / React
│   ├── b2c-dashboard/           # Next.js / React
│   └── backend/                 # NestJS microservices
│       ├── auth-service/
│       ├── booking-service/
│       ├── payment-service/
│       └── notification-service/

├── packages/                    # Shared reusable code
│   ├── ui/                      # UI Components
│   ├── utils/                   # Helper functions
│   ├── types/                   # TypeScript types/interfaces
│   └── config/                  # Shared config (eslint, prettier)

├── turbo.json                   # Turborepo config
├── package.json                 # Root dependencies (dev tools)
└── tsconfig.json                # Base TS config

5. Microservice Approach (NestJS)

আপনি backend টা NestJS দিয়ে microservices আকারে ভাগ করবেন:

  • প্রতিটা service (auth, booking, payment, notification) self-contained হবে।

  • আলাদা আলাদা NestJS project হবে, কিন্তু সব একই repo-র ভেতরে।

  • একে অপরের সাথে কথা বলবে message broker (RabbitMQ, Kafka) বা REST/gRPC দিয়ে।

  • Example:

    • User login করলে → auth-service JWT issue করবে
    • User booking করলে → booking-service payment initiate করবে → payment-service
    • Payment success হলে → notification-service user কে email/SMS পাঠাবে

6. Dependency Management

Shared dependencies

  • Root package.json-এ রাখেন → eslint, prettier, turbo, typescript ইত্যাদি।

Service-specific dependencies

  • প্রতিটা app/service এর আলাদা package.json থাকবে।

    • যেমন auth-service-এ থাকবে @nestjs/jwt, কিন্তু payment-service-এ থাকবে stripe
  • যদি common dependency লাগে (যেমন axios, class-validator), সেটা packages/utils থেকে share করতে পারো।

Example:

apps/backend/auth-service/package.json
apps/backend/payment-service/package.json

7. Tools for Monorepo

1. Turborepo (Best for JS/TS projects)

  • Vercel এর বানানো tool।
  • Fast build, caching, parallel execution।
  • Example: একবার ui build করলে → cache করে রাখে, আবার build করতে হয় না।
  • Config ফাইল: turbo.json

2. Nx

  • আরেকটা powerful monorepo tool।
  • NestJS এর সাথে অনেক ভালো integration আছে।
  • More strict but feature rich.

3. Lerna

  • Old কিন্তু popular।
  • Mostly package publishing এর জন্য ভালো।
  • Nowadays Turborepo/Nx বেশি ব্যবহার হয়।

8. Turborepo Example Config

turbo.json

{
  "$schema": "https://turbo.build/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "dist/**"]
    },
    "lint": {},
    "dev": {
      "cache": false
    }
  }
}
  • build → সব app build করবে
  • lint → ESLint run করবে
  • dev → local dev mode

9. Workflow (Developer Experience)

  1. আপনি যখন apps/admin-dashboard-এ কাজ করবেন → শুধু ওই app run করতে পারবে

    cd apps/admin-dashboard
    npm run dev
  2. Shared ui package এ কোনো component change করলে → সব app automatically আপডেট পাবে।

  3. Turborepo caching এর কারণে build/test super fast হবে।

  4. CI/CD pipeline থেকে আপনি আলাদা আলাদা app deploy করতে পারবে।


10. Final Takeaway

  • Monorepo = এক repo-তে সবকিছু → easy management, code sharing, CI/CD simplification।
  • Trip Booking CMS Example = apps + backend microservices + shared packages।
  • Dependencies → root dev tools + service specific local package.json
  • Tools → Turborepo (Next.js friendly), Nx (NestJS friendly)।
  • Microservice Approach → প্রতিটা NestJS service independent, communication via API or broker।