Skip to content

Deployment Topology

This document describes the infrastructure topology for local, staging, and production environments.

Docker Compose (Local/Staging)

Local development uses Docker Compose for simplified service orchestration.

graph TB
    subgraph "Docker Compose Network"
        Frontend[Frontend Container<br/>Port 3000]
        Backend[Backend Container<br/>Port 8000]
        DB[(PostgreSQL<br/>Port 5432)]
        Redis[(Redis<br/>Port 6379)]
        Worker[Celery Worker]
        Storage[MinIO/S3<br/>Port 9000]

        Frontend -->|HTTP| Backend
        Backend -->|SQL| DB
        Backend -->|Tasks| Redis
        Redis -->|Jobs| Worker
        Worker -->|SQL| DB
        Worker -->|Files| Storage
        Backend -->|Files| Storage
    end

    User[Developer] -->|localhost:3000| Frontend

    style Frontend fill:#e1f5ff
    style Backend fill:#fff4e1
    style DB fill:#e1ffe1
    style Redis fill:#ffe1e1
    style Worker fill:#f5e1ff
    style Storage fill:#ffe1f5

Key characteristics:

  • Single docker-compose.yml file
  • Shared network for service communication
  • Volume mounts for data persistence
  • Hot reload for development

Kubernetes Cluster (Production)

Production deployments use Kubernetes for scalability and reliability.

graph TB
    subgraph "External"
        User[Users]
        LB[EPFL Load Balancer]
    end

    subgraph "Kubernetes Cluster"
        Ingress[NGINX Ingress Controller]

        subgraph "Frontend Namespace"
            FE1[Frontend Pod 1]
            FE2[Frontend Pod 2]
            FESvc[Frontend Service]
        end

        subgraph "Backend Namespace"
            BE1[Backend Pod 1]
            BE2[Backend Pod 2]
            BESvc[Backend Service]
        end

        subgraph "Worker Namespace"
            W1[Worker Pod 1]
            W2[Worker Pod 2]
            Redis[(Redis)]
        end

        subgraph "Data Namespace"
            PG[(PostgreSQL Primary)]
            PGR[(PostgreSQL Replica)]
            PGB[PgBouncer]
        end

        subgraph "Monitoring"
            Prom[Prometheus]
            Graf[Grafana]
        end
    end

    subgraph "External Services"
        S3[Azure Blob Storage]
        Entra[Microsoft Entra ID]
    end

    User -->|HTTPS| LB
    LB --> Ingress
    Ingress --> FESvc
    FESvc --> FE1 & FE2
    FE1 & FE2 --> BESvc
    BESvc --> BE1 & BE2
    BE1 & BE2 --> PGB
    BE1 & BE2 --> Redis
    BE1 & BE2 --> S3
    Redis --> W1 & W2
    W1 & W2 --> PGB
    W1 & W2 --> S3
    PGB --> PG
    PGB --> PGR
    PG -->|Replication| PGR

    FE1 & FE2 --> Entra
    BE1 & BE2 --> Entra

    Prom --> BE1 & BE2
    Prom --> W1 & W2
    Graf --> Prom

    style User fill:#e1f5ff
    style LB fill:#ffe1e1
    style Ingress fill:#fff4e1
    style FESvc fill:#e1f5ff
    style BESvc fill:#fff4e1
    style PG fill:#e1ffe1
    style Redis fill:#ffe1e1

Key characteristics:

  • Helm charts for service deployment
  • ArgoCD for GitOps deployment management
  • Ingress controllers for external access
  • Horizontal pod autoscaling
  • Rolling updates with zero downtime

Service Mesh Overview

Currently not using a service mesh, but may adopt Istio in the future for:

  • Enhanced observability
  • Traffic management
  • Security policies

Ingress and Networking Patterns

graph LR
    subgraph "External Traffic"
        Internet[Internet]
        EPFLLB[EPFL Load Balancer]
    end

    subgraph "Kubernetes Ingress"
        Ingress[NGINX Ingress<br/>TLS Termination]
    end

    subgraph "Application Routes"
        Root[/ → Frontend SPA]
        API[/api → Backend]
        Docs[/docs → Documentation]
        ITMgr[/it-manager → IT App]
        TeamMgr[/team-manager → Team App]
    end

    Internet -->|HTTPS| EPFLLB
    EPFLLB -->|HTTPS| Ingress
    Ingress --> Root
    Ingress --> API
    Ingress --> Docs
    Ingress --> ITMgr
    Ingress --> TeamMgr

    style Internet fill:#e1f5ff
    style EPFLLB fill:#ffe1e1
    style Ingress fill:#fff4e1
    style Root fill:#e1f5ff
    style API fill:#e1ffe1

Networking features:

  • EPFL load balancer for external access
  • NGINX ingress controller for HTTP routing
  • TLS termination at ingress level
  • Network policies for service isolation
  • Path-based routing to services

For detailed deployment information, see Infrastructure Documentation.