A small event-driven incident-management platform, built to demonstrate a microservices architecture: an API gateway, a JWT-based identity service, an incident service with an explicit state machine, and two independent consumers of its domain events — a SignalR notification service and a public status page.
See docs/architecture.md for the full design, including why the incident service never talks to the notification service directly.
| Service | Port (docker-compose) | Port (dotnet run) |
|---|---|---|
| Gateway (dashboard + reverse proxy) | http://localhost:8080 | http://localhost:5080 |
| Identity.Api | http://localhost:8081 | http://localhost:5081 |
| Incidents.Api | http://localhost:8082 | http://localhost:5082 |
| StatusPage.Api | http://localhost:8083 | http://localhost:5083 |
| Notifications.Api (SignalR hub) | http://localhost:8084 | http://localhost:5084 |
| RabbitMQ management UI | http://localhost:15672 | — |
RabbitMQ and Postgres credentials in this repo are throwaway dev defaults
(incidentmanager / incidentmanager) — do not reuse them anywhere real.
docker compose up --buildThen open http://localhost:8080. Sign in with one of the seeded demo users:
admin@incidentmanager.local/ChangeMe123!responder@incidentmanager.local/ChangeMe123!
Create an incident and watch it land in the activity feed and status banner in real time —
that push comes over the SignalR connection from Notifications.Api, driven by the
IncidentCreated event Incidents.Api published to RabbitMQ.
Requires the .NET 10 SDK, plus a local Postgres and RabbitMQ (the ones from
docker compose up postgres rabbitmq work fine — their ports are published to localhost).
dotnet restore
dotnet run --project src/Identity.Api
dotnet run --project src/Incidents.Api
dotnet run --project src/StatusPage.Api
dotnet run --project src/Notifications.Api
dotnet run --project src/GatewayEach service applies its own EF Core migrations on startup. Open http://localhost:5080.
src/
Gateway/ YARP reverse proxy + static dashboard (wwwroot/)
Identity.Api/ JWT-based auth, user store
Incidents.Api/ Incident state machine, publishes domain events
Notifications.Api/ Consumes events, pushes to browsers via SignalR
StatusPage.Api/ Public status page, event-driven read model
Contracts/ Shared event contracts + JWT wiring
docker/
postgres-init/ Creates the per-service databases on first container start
docs/
architecture.md Full design write-up + diagram
docker-compose.yml Postgres + RabbitMQ + all five services