A cloud-native ERP system built with .NET 10, Aspire, Dapr, and deployed to Azure Container Apps.
| Service | Responsibility | Database |
|---|---|---|
| Auth | Authentication & Authorization | AuthDB |
| Billing | Invoice and billing management | BillingDB |
| Inventory | Stock and warehouse management | InventoryDB |
| Orders | Order processing | OrderDB |
| Purchasing | Procurement management | PurchasingDB |
| Sales | Sales operations | SalesDB |
# Prerequisites: .NET 10 SDK, Docker
cd AppHost
dotnet run
The Aspire dashboard will open automatically showing all services.
# Prerequisites: Azure Developer CLI (azd)
azd up
See QUICKSTART.md for detailed 5-minute deployment guide.
Browse the complete documentation site at https://ozymandros.github.io/ERP.Microservices/ (generated with DocFX)
ERP.Microservices/
├── AppHost/ # Aspire orchestration
├── ErpApiGateway/ # YARP API Gateway
├── MyApp.Auth/ # Auth microservice
├── MyApp.Billing/ # Billing microservice
├── MyApp.Inventory/ # Inventory microservice
├── MyApp.Orders/ # Orders microservice
├── MyApp.Purchasing/ # Purchasing microservice
├── MyApp.Sales/ # Sales microservice
├── MyApp.Shared/ # Shared libraries
├── infra/ # Azure infrastructure (Bicep)
│ ├── core/ # Reusable Bicep modules
│ ├── main.bicep # Main infrastructure definition
│ └── main.parameters.json # Parameters template
├── .github/workflows/ # CI/CD pipelines
├── docs/ # Documentation
├── azure.yaml # Azure Developer CLI config
└── README.md # This file
Each microservice follows Clean Architecture:
MyApp.[Service]/
├── MyApp.[Service].API/ # Web API layer
├── MyApp.[Service].Application/ # Application logic
├── MyApp.[Service].Domain/ # Domain entities
└── MyApp.[Service].Infrastructure/ # Data access
# Restore dependencies
dotnet restore
# Build all projects
dotnet build
# Run tests
dotnet test
# Using Aspire (recommended)
cd AppHost
dotnet run
# Or run individual services
cd MyApp.Auth/MyApp.Auth.API
dotnet run
Local development uses appsettings.Development.json in AppHost:
{
"Jwt": {
"SecretKey": "your-secret-key",
"Issuer": "MyApp.Auth",
"Audience": "MyApp.All"
},
"Parameters": {
"FrontendOrigin": "http://localhost:3000"
}
}
Production uses Azure Container Apps secrets and environment variables.
# One command deployment
azd up
This deploys:
See DEPLOYMENT.md for details.
Modular CI/CD with separate workflows for security and speed:
| Workflow | Purpose | Triggers |
|---|---|---|
| build.yml | Build, test, coverage | push/PR to main, develop |
| sonarcloud.yml | SonarCloud code quality & coverage analysis | push/PR to main, develop |
| codeql.yml | CodeQL security analysis | push/PR to main, develop |
| deploy.yml | Provision, Docker build, GHCR push, Azure deploy | after Build & Test succeeds on main/develop, or manual |
Coverage: Tests collect coverage using Coverlet (Cobertura format), merged to coverage/coverage.cobertura.xml and analyzed by SonarCloud.
Required secrets (deploy): AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID.
Required secrets (SonarCloud): SONAR_TOKEN.
Optional SonarCloud configuration: SONAR_PROJECT_KEY and SONAR_ORG can be provided as repository variables or secrets; otherwise the workflow falls back to Ozymandros_ERP.Microservices and the repository owner.
Contributions welcome! Please:
This project is licensed under the MIT License.
azd down to delete resources when not in useaz containerapp logs showA cloud-native ERP system built with .NET 10, Aspire, Dapr, and deployed to Azure Container Apps.
| Service | Responsibility | Database |
|---|---|---|
| Auth | Authentication & Authorization | AuthDB |
| Billing | Invoice and billing management | BillingDB |
| Inventory | Stock and warehouse management | InventoryDB |
| Orders | Order processing | OrderDB |
| Purchasing | Procurement management | PurchasingDB |
| Sales | Sales operations | SalesDB |
# Prerequisites: .NET 10 SDK, Docker
cd AppHost
dotnet run
The Aspire dashboard will open automatically showing all services.
# Prerequisites: Azure Developer CLI (azd)
azd up
See QUICKSTART.md for detailed 5-minute deployment guide.
Browse the complete documentation site at https://ozymandros.github.io/ERP.Microservices/ (generated with DocFX)
ERP.Microservices/
├── AppHost/ # Aspire orchestration
├── ErpApiGateway/ # YARP API Gateway
├── MyApp.Auth/ # Auth microservice
├── MyApp.Billing/ # Billing microservice
├── MyApp.Inventory/ # Inventory microservice
├── MyApp.Orders/ # Orders microservice
├── MyApp.Purchasing/ # Purchasing microservice
├── MyApp.Sales/ # Sales microservice
├── MyApp.Shared/ # Shared libraries
├── infra/ # Azure infrastructure (Bicep)
│ ├── core/ # Reusable Bicep modules
│ ├── main.bicep # Main infrastructure definition
│ └── main.parameters.json # Parameters template
├── .github/workflows/ # CI/CD pipelines
├── docs/ # Documentation
├── azure.yaml # Azure Developer CLI config
└── README.md # This file
Each microservice follows Clean Architecture:
MyApp.[Service]/
├── MyApp.[Service].API/ # Web API layer
├── MyApp.[Service].Application/ # Application logic
├── MyApp.[Service].Domain/ # Domain entities
└── MyApp.[Service].Infrastructure/ # Data access
# Restore dependencies
dotnet restore
# Build all projects
dotnet build
# Run tests
dotnet test
# Using Aspire (recommended)
cd AppHost
dotnet run
# Or run individual services
cd MyApp.Auth/MyApp.Auth.API
dotnet run
Local development uses appsettings.Development.json in AppHost:
{
"Jwt": {
"SecretKey": "your-secret-key",
"Issuer": "MyApp.Auth",
"Audience": "MyApp.All"
},
"Parameters": {
"FrontendOrigin": "http://localhost:3000"
}
}
Production uses Azure Container Apps secrets and environment variables.
# One command deployment
azd up
This deploys:
See DEPLOYMENT.md for details.
Modular CI/CD with separate workflows for security and speed:
| Workflow | Purpose | Triggers |
|---|---|---|
| build.yml | Build, test, coverage | push/PR to main, develop |
| sonarcloud.yml | SonarCloud code quality & coverage analysis | push/PR to main, develop |
| codeql.yml | CodeQL security analysis | push/PR to main, develop |
| deploy.yml | Provision, Docker build, GHCR push, Azure deploy | after Build & Test succeeds on main/develop, or manual |
Coverage: Tests collect coverage using Coverlet (Cobertura format), merged to coverage/coverage.cobertura.xml and analyzed by SonarCloud.
Required secrets (deploy): AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID.
Required secrets (SonarCloud): SONAR_TOKEN.
Optional SonarCloud configuration: SONAR_PROJECT_KEY and SONAR_ORG can be provided as repository variables or secrets; otherwise the workflow falls back to Ozymandros_ERP.Microservices and the repository owner.
Contributions welcome! Please:
This project is licensed under the MIT License.
azd down to delete resources when not in useaz containerapp logs show