A modern, scalable microservices-based auction bidding platform built with .NET 10 and Next.js 16. The system is designed for high availability and scalability using containerized deployments and cloud-native architecture patterns.
CarBidder is a distributed microservices application that enables users to create, search, and bid on auctions in real-time. The architecture follows modern cloud-native principles with service-oriented design, asynchronous message processing, and comprehensive API gateway patterns.
- Real-time Bidding: Live auction updates using SignalR
- Distributed Architecture: Independent microservices with API Gateway
- Event-Driven Communication: Asynchronous messaging via RabbitMQ
- Search Capability: Elasticsearch-powered auction search
- Identity & Authentication: Secure user authentication and authorization
- Notifications: Real-time notifications for auction events
- Cloud-Ready: Kubernetes deployment configurations included
- Docker Containerized: All services containerized for consistency
- CI/CD: Built CI/CD using Github Action's matrix strategy for integration and deployment to AWS EKS
| Service | Purpose | Tech Stack |
|---|---|---|
| Auction Service | Manages auction lifecycle | .NET, PostgreSQL, Entity Framework |
| Bidding Service | Handles bid placement and management | .NET, PostgreSQL |
| Search Service | Auction search and indexing | .NET, Elasticsearch |
| Notification Service | Sends auction notifications | .NET, SignalR |
| Identity Service | User authentication & authorization | .NET, IdentityServer |
| Gateway Service | API Gateway | .NET, API Gateway |
| Web App | Frontend application | Next.js, React, TypeScript |
- PostgreSQL: Primary relational database for auctions and bids
- MongoDB: Document database for flexible data storage
- RabbitMQ: Message broker for inter-service communication
- Elasticsearch: Search engine for auction indexing
- Docker: Containerization platform
- Kubernetes: Container orchestration (K8S manifests included)
- Docker & Docker Compose (v20.0+)
- .NET 8 SDK (for local development)
- Node.js 18+ (for frontend development)
- PostgreSQL client (optional, for database CLI access)
-
Clone the repository:
git clone https://github.com/yourusername/carbidder.git cd carbidder -
Start all services:
docker-compose up -d
This will spin up:
- PostgreSQL (port 5433)
- MongoDB (port 27017)
- RabbitMQ (ports 5672, 15672)
- All microservices
- Frontend application
-
Access the application:
- Web App:
http://localhost:3000 - RabbitMQ Management:
http://localhost:15672(guest/guest)
- Web App:
-
Stop services:
docker-compose down
-
Install .NET dependencies:
# Each service has its own project file cd src/AuctionService dotnet restore
-
Configure appsettings.Development.json with your connection strings
-
Run a service:
dotnet run
-
Install dependencies:
cd frontend/web-app npm install -
Run development server:
npm run dev
-
Build for production:
npm run build npm start
CarBidder/
βββ src/ # Backend microservices
β βββ AuctionService/ # Auction management
β βββ BiddingService/ # Bidding operations
β βββ SearchService/ # Search & indexing
β βββ NotificationService/ # Event notifications
β βββ IdentityService/ # Authentication
β βββ GatewayService/ # API Gateway
β βββ Contracts/ # Shared message contracts
βββ frontend/
β βββ web-app/ # Next.js frontend application
βββ infrastructure/
β βββ K8S/ # Kubernetes manifests
β β βββ *-deployment.yaml # Service deployments
β β βββ ingress.yaml # Ingress configuration
β β βββ config.yaml # ConfigMaps
β βββ dev-k8s/ # Development K8S configs
βββ tests/ # Test suites
β βββ AuctionService.IntegrationTests/
β βββ AuctionService.UnitTests/
β βββ SearchService.IntegrationTests/
β βββ SearchService.UnitTests/
βββ devcerts/ # Development SSL certificates
βββ docker-compose.yaml # Local development stack
βββ CarBidder.sln # Solution file
- Base URL:
http://localhost:6001
- Auction Service:
http://localhost:7001 - Bidding Service:
http://localhost:7002 - Search Service:
http://localhost:7003 - Notification Service:
http://localhost:7004 - Identity Service:
http://localhost:7005
- AuctionsDB: Auction and bidding data
- Auctions table
- Bids table
- User data
- Audit logs
- Document-based storage for flexible data
- Collections for supplementary data
The platform uses IdentityServer for OAuth2/OpenID Connect:
- User Registration: Via Identity Service
- Token Issuance: JWT tokens for API access
- Authorization: Role-based access control (RBAC)
- Frontend Integration: NextAuth.js for session management
Default Credentials (Development Only):
Username: user@example.com
Password: Check SeedData.cs or appsettings.Development.json
The platform publishes and consumes these domain events:
AuctionCreated: When a new auction is createdAuctionUpdated: When auction details changeAuctionDeleted: When an auction is deletedAuctionFinished: When bidding endsBidPlaced: When a user places a bid
These are defined in the Contracts project and consumed by respective services.
The GitHub Actions workflow automatically builds and pushes images to Docker Hub:
# Images are tagged as:
aleksandromilenkov/auction-svc:latest
aleksandromilenkov/search-svc:latest
aleksandromilenkov/bid-svc:latest
aleksandromilenkov/notify-svc:latest
aleksandromilenkov/identity-svc:latest
aleksandromilenkov/gateway-svc:latest
aleksandromilenkov/web-app:latest# Build a single service
docker build -f src/AuctionService/Dockerfile -t auction-svc:latest .
# Or use Docker Compose
docker-compose build [service-name]- Kubernetes cluster (EKS, GKE, AKS, or local Minikube)
kubectlconfigured and authenticated- Secret management setup for sensitive data
-
Create secrets (update with real values):
kubectl create secret generic db-credentials \ --from-literal=postgres-password=yourpassword \ --from-literal=mongo-password=yourpassword
-
Apply manifests:
kubectl apply -f infrastructure/K8S/
-
Verify deployment:
kubectl get deployments kubectl get pods kubectl get svc
-
Access via Ingress:
kubectl get ingress # Access via the ingress IP/domain configured in ingress.yaml
Update kubeconfig:
aws eks update-kubeconfig --name your-cluster-name --region us-east-1Then apply K8S manifests as above.
The .github/workflows/deployment.yaml includes:
-
Trigger Events:
- Manual workflow dispatch
- Push to
mainormasterbranches - Pull requests
-
Build Job (
build-and-push):- Checks for file changes in service paths
- Builds Docker images only for modified services
- Pushes to Docker Hub
- Requires:
DOCKER_USERNAME,DOCKER_TOKENsecrets
-
Deploy Job (
deploy-to-aws-eks):- Configured as dummy/simulation job
- Sets up AWS CLI and kubectl
- Applies K8S manifests
- Requires:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYsecrets
Add these to your repository settings:
DOCKER_USERNAME: Docker Hub usernameDOCKER_TOKEN: Docker Hub access tokenAWS_ACCESS_KEY_ID: AWS credentials (for real deployments)AWS_SECRET_ACCESS_KEY: AWS credentials (for real deployments)
# Auction Service tests
dotnet test tests/AuctionService.UnitTests
# Search Service tests
dotnet test tests/SearchService.UnitTests# Requires docker-compose running
dotnet test tests/AuctionService.IntegrationTests
dotnet test tests/SearchService.IntegrationTestsEach service has appsettings.{Environment}.json files:
appsettings.json: Base configurationappsettings.Development.json: Local developmentappsettings.Docker.json: Docker container environmentappsettings.Production.json: Production settings
Common Configuration Variables:
{
"Logging": { "LogLevel": { "Default": "Information" } },
"ConnectionStrings": {
"DefaultConnection": "Host=postgres:5432;..."
},
"RabbitMq": {
"Host": "rabbitmq",
"Username": "guest",
"Password": "guest"
},
"IdentityService": {
"Authority": "http://identity-svc",
"Audience": "auction-service"
}
}Services not communicating:
- Verify all services are running:
docker-compose ps - Check RabbitMQ is accessible:
http://localhost:15672 - Review service logs:
docker-compose logs [service-name]
Database connection errors:
- Ensure PostgreSQL is running and healthy
- Check connection string in appsettings
- Verify credentials match docker-compose.yaml
Frontend can't connect to API:
- Check Gateway Service is running
- Verify CORS settings in Gateway
- Check browser console for specific error messages
Kubernetes pod failures:
- Inspect pod logs:
kubectl logs [pod-name] - Describe pod:
kubectl describe pod [pod-name] - Check resource limits:
kubectl top pods
- API Documentation - Detailed API specifications
- Architecture Decisions - Architecture decision records
- Contributing Guidelines - How to contribute
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Commit changes:
git commit -am 'Add new feature' - Push to branch:
git push origin feature/your-feature - Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with modern cloud-native technologies
- Follows microservices best practices
- Implements event-driven architecture patterns
- Scalable and production-ready design
For issues, questions, or suggestions:
- Open an Issue
- Check existing Discussions
- Review Documentation
Last Updated: February 2026
Version: 1.0.0