Architecture Deployment API

C4 Level 2 — Containers

How the platform’s runtime containers communicate.

C4Container
  title FlowerShop IoT Platform — Containers

  Person(customer, "Customer")
  Person(vendor, "Vendor")
  Person(admin, "Platform Admin")

  Container_Boundary(platform, "FlowerShop IoT Platform") {
    Container(api, "REST API", ".NET 8 / ASP.NET Core", "CQRS, multi-tenant, 29 controllers, MediatR pipeline")
    Container(adminPortal, "Admin Portal", "ASP.NET Razor Pages :5001", "Vendor management, analytics, vase registration")
    Container(vendorPortal, "Vendor Portal", "ASP.NET Razor Pages :5002", "Bouquet catalog, order management, analytics dashboard")
    Container(customerApp, "Customer Web App", "ASP.NET MVC :5003", "Browse map, cart, checkout, profile, subscriptions")
    ContainerDb(postgres, "PostgreSQL 15", "Database", "All domain aggregates: Vendor, Bouquet, Order, Cart, Customer, SmartVase, etc.")
    ContainerDb(redis, "Redis 7", "Cache + Blacklist", "Query cache (versioned), token blacklist, idempotency keys")
    Container(keycloak, "Keycloak 23", "Identity Provider", "OIDC, JWT issuance, user management, email verification (dev :8090; prod auth.findmyflowers.pl)")
    Container(rabbitmq, "RabbitMQ", "Message Broker", "Domain event bus (InMemoryEventBus active; RabbitMQEventBus is a stub)")
    Container(mqtt, "MQTT Broker", "IoT Broker", "Vase telemetry, heartbeat, command dispatch (dev: Mosquitto; prod: HiveMQ Cloud, TLS 8883)")
    Container(signalr, "SignalR Hub (in-process)", "WebSocket Hub (inside REST API process)", "BouquetHub — real-time bouquet updates, order tracking; runs in-process with the REST API")
  }

  System_Ext(stripe, "Stripe")
  System_Ext(fcm, "Firebase FCM")
  System_Ext(twilio, "Twilio")
  System_Ext(nominatim, "Nominatim OSM")

  Rel(customer, api, "REST/JSON", "HTTPS :8080")
  Rel(customer, customerApp, "HTTP", "HTTPS :5003")
  Rel(vendor, vendorPortal, "HTTP", "HTTPS :5002")
  Rel(admin, adminPortal, "HTTP", "HTTPS :5001")

  Rel(adminPortal, api, "API calls", "HTTPS")
  Rel(vendorPortal, api, "API calls", "HTTPS")
  Rel(customerApp, api, "API calls", "HTTPS")

  Rel(api, postgres, "EF Core", "TCP :5432")
  Rel(api, redis, "StackExchange.Redis", "TCP :6379")
  Rel(api, keycloak, "Admin REST API", "HTTPS :8090")
  Rel(api, rabbitmq, "AMQP", "TCP :5672")
  Rel(api, mqtt, "MQTT", "TCP :1883")
  Rel(mqtt, api, "Vase telemetry, heartbeats", "MQTT")
  Rel(api, signalr, "BouquetHub (in-process)", "WebSocket")
  Rel(api, stripe, "Stripe SDK", "HTTPS")
  Rel(api, fcm, "FCM HTTP", "HTTPS")
  Rel(api, twilio, "Twilio SDK", "HTTPS")
  Rel(api, nominatim, "REST", "HTTPS")