A modern, full-stack Enterprise Resource Planning (ERP) system built with microservices architecture.
The ERP System is built using a microservices architecture with the following components:
Service | Technology | Port | Description image::docs/flowchart.png[ERP System Architecture Flowchart,alt="ERP System architecture flowchart",width=100%] |
Frontend | React + TypeScript | 3000 | Web application UI |
Webshop | React + TypeScript | 5174 | Customer-facing storefront UI |
Gateway | Apollo Gateway | 4000 | GraphQL Federation gateway |
UserService | .NET 8 | 5000 | User management and authentication |
ShopService | .NET 8 | 5003 | E-commerce and inventory |
AccountingService | .NET 8 | 5001 | Financial accounting (incoming & outgoing payments, journal entries, reports) |
MasterdataService | .NET 8 | 5002 | Master data management |
CompanyService | Java Spring | 8081 | Company management |
NotificationService | Java Spring | 8082 | Email/Push notifications |
TranslationService | Java Spring | 8083 | i18n translations |
ScriptingService | Java Spring | 8084 | Custom scripting |
TemplatesService | Node.js | 8087 | Document template generation |
Frontend: React 18, TypeScript, Vite, TailwindCSS, Apollo Client
Webshop: React 18, TypeScript, Vite, TailwindCSS, Apollo Client
Backend (.NET): .NET 8, HotChocolate GraphQL, Entity Framework Core
Backend (Java): Spring Boot 3.2, Netflix DGS GraphQL
Backend (Node.js): Node.js 20, Express, PostgreSQL
Databases: PostgreSQL (separate DB per service)
Gateway: Apollo Gateway (Federation)
Infrastructure: Docker, Kubernetes (Helm), Nginx
Pre Note
Development: Docker Compose → Testing → CI/CD → Production: Kubernetes
Software Requirements:
Kubernetes cluster
Hardware Requirements:
RAM: Minimum 4GB per service instance, 8GB recommended for optimal performance
CPU: 2+ cores per service
Storage: 20GB+ available disk space
Network: Stable internet connection for external services
JVM Memory Configuration:
Translation Service: -Xmx1024m (1GB heap)
Other Java Services: -Xmx2048m (2GB heap) recommended
.NET Services: 512MB minimum per service
Software Requirements:
Java Development Kit (JDK) 21
.NET 8 SDK
Node.js 20+ with npm
Docker & Docker Compose
PostgreSQL 15+ (local or containerized)
IDE with Java 21, .NET 8, and TypeScript support (VS Code, IntelliJ IDEA, etc.)
Git for version control
Hardware Requirements:
RAM: Minimum 8GB, 16GB recommended for running all services simultaneously
CPU: 4+ cores recommended
Storage: 30GB+ available disk space
Network: Stable internet connection for package downloads
Development Memory Allocation:
Frontend development: 2GB RAM
Individual service development: 2-4GB RAM per service
Full stack development: 8GB+ RAM total
The repository includes a separate customer-facing webshop at apps/webshop.
Default URL: http://localhost:5174
API Path:
/graphql(proxied by Vite to the ERP Gateway)Gateway Target:
GATEWAY_URLenv var orhttp://localhost:4000Company Context:
X-Company-Idheader is sent by the Apollo client (VITE_COMPANY_IDor fallback demo company)
Product catalog and category browsing
Product detail pages
Guest cart (session-based)
Checkout flow with shipping selection
Order confirmation page
For implementation details, see apps/webshop/README.md.
For deploying the full microservices stack to a local Kubernetes cluster (k3s, k3d, kind, or minikube):
# One-command automated deployment
bash scripts/k3s/k3s-local-deploy.sh full
# This will:# - Build all 14 Docker images# - Load them into your k3s cluster# - Deploy the Helm chart with PostgreSQL# - Setup port-forwards# Access the application
open http://localhost:3000For detailed instructions, configuration, and troubleshooting, see Local Kubernetes Deployment Guide.
For quick restarts after PC shutdown:
bash scripts/k3s/k3s-local-deploy.sh rebuildERP_System/
├── apps/
│ ├── frontend/ # React frontend application
│ ├── gateway/ # Apollo Federation gateway
│ └── services/
│ ├── dotnet/ # .NET microservices
│ │ ├── UserService/
│ │ ├── ShopService/
│ │ ├── AccountingService/
│ │ └── MasterdataService/
│ ├── java/ # Java microservices
│ │ ├── company-service/
│ │ ├── notification-service/
│ │ ├── translation-service/
│ │ ├── scripting-service/
│ │ └── templates-service/
│ └── nodejs/ # Node.js microservices
│ └── templates-service/
├── config/ # Configuration files
├── infrastructure/ # Deployment configs
│ ├── helm/ # Kubernetes Helm charts
│ ├── nginx/ # Nginx configuration
│ ├── grafana/ # Monitoring dashboards
│ └── prometheus/ # Metrics collection
└── libs/ # Shared libraries
├── i18n/ # Internationalization
└── shared-types/ # Shared TypeScript typesThe system uses JWT-based authentication:
Access Token: Short-lived (15 minutes)
Refresh Token: Long-lived (7 days)
JWT Secret: Configurable via environment variables
Default demo credentials:
Email: admin@erp-system.local
Password: Admin123!Access the GraphQL Playground at:
Gateway: GraphQL Playground
UserService: GraphQL Playground
ShopService: GraphQL Playground
# Get current userquery {
me {
idemailfirstNamelastName
}
}
# Get productsquery {
products(first: 10) {
nodes {
idnamepricestockQuantity
}
}
}
# Create ordermutation {
createOrder(input: {
customerId: "..."items: [{ productId: "...", quantity: 2 }]
}) {
idorderNumberstatus
}
}
# Create an outgoing (supplier) paymentmutation {
createPaymentRecord(input: {
type: "SUPPLIER_PAYMENT"amount: 1250.00currency: "EUR"method: "BANK_TRANSFER"payeeName: "Office Supplies GmbH"reference: "VENDOR-INV-2025-001"
}) {
idtypeamountpaymentMethodpayeeName
}
}| Variable | Description | Default |
|---|---|---|
| JWT signing key | - |
| PostgreSQL connection string | - |
| GraphQL Gateway URL |
End-to-end browser tests live in apps/e2e and cover the ERP frontend and the
webshop. They run against the real stack (PostgreSQL + services + gateway
frontend), so the backend must be running first.
Covered areas (see apps/e2e/tests/): authentication (login, errors, logout,
forgot-password link), dashboard, sidebar navigation, users, companies,
translations, settings, products, orders, accounting, master data, templates,
UI builder, and the webshop storefront (home, catalog, cart).
npm install # installs @playwright/test via the npm workspace
npm run e2e:install # downloads the Chromium browserAll settings have sensible defaults and can be overridden via environment
variables (see apps/e2e/.env.example):
E2E_BASE_URL=http://localhost:5173 # ERP frontend
E2E_WEBSHOP_URL=http://localhost:3008 # webshop
E2E_USER_EMAIL=admin@erp-system.local # seeded super admin
E2E_USER_PASSWORD=Admin123!The tests authenticate with the seeded super admin user
(admin@erp-system.local / Admin123!, see UserService UserDbContext seed).
# Start the backend stack first (frontend on 5173, webshop on 3008)
./scripts/dev/start-local.sh
# Run the full suite (frontend + webshop) from the repository root
npm run test:e2e
# Or via the helper script (also runs pre-flight health checks)
./scripts/test/test-e2e-playwright.sh
# Run a single project / file
npm --workspace @erp/e2e run test:webshop
npx playwright test users.spec.ts --project=chromiumThe HTML report is written to apps/e2e/playwright-report; open it with
npm run e2e:report.
Authentication first: the login flow is always the very first test executed (dedicated
setupproject).Fail-fast: if the authentication test fails, the entire suite stops immediately — no other test runs.
In CI the stack is started via
docker-compose.prod-local.ymland the suite runs againsthttp://localhost:8088(see thee2ejob in.github/workflows/ci-cd.yml).
See scripts/test/README.md for the shell-based integration and E2E test scripts.
Prometheus: Prometheus
Grafana: Grafana
