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")