A scalable, microservice-driven web platform for managing international language programs.
The frontend layer consists of two independent PWA portals (React, TypeScript) maintained in a PNPM-based monorepository with shared UI and utility packages.
The backend is composed of isolated .NET microservices designed using Vertical Slice Architecture and Clean Architecture, each exposing its own bounded context and operating on a dedicated database. Binary data is handled through object storage with server-side validation and sanitization.
Inter-service communication is split between gRPC for high-throughput, low-latency synchronous RPC calls and RabbitMQ (MassTransit) for asynchronous, fire-and-forget operations and event distribution.
A YARP-based API Gateway provides centralized routing, request pre-processing, authentication enforcement, and load balancing across internal service clusters. The system runs fully containerized via Docker, enabling reproducible environments and horizontal scaling of individual services.
- .NET
- C#
- FastEndpoints
- xUnit
- Yarp.ReverseProxy
- ASP.NET Core
- Carter
- MediatR
- MassTransit
- RabbitMQ
- GRPC
- Entity Framework Core
- PostgreSQL
- FluentValidation
- Docker
-
Customer Portal: Application for users to register for international language courses in various countries, upload required documents, and track application status, solving the problem of a complicated registration process and lack of transparency.
-
Manager Portal: Application for administrators to manage educational programs, user data, and documents in real time, eliminating difficulties related to manual administration and lack of centralized data.
-
Gateway Service: Acts as the single entry point, handling routing, request validation and load balancing across internal services.
-
Identity Service: Handles authentication, authorization, JWT/refresh token lifecycle, role management, password hashing and security policies.
-
Storage Service: Manages secure binary file storage using MinIO, including validation, size checks and malicious-content protection.
-
Account Service: Stores and manages user account data, personal details, and selected program information.
-
Course Service: Manages educational programs, languages, schools and related administrative datasets.
-
Progress Service: Tracks and updates user application progress in real time across all registration stages.
-
MailSender Service: Asynchronous email dispatching for internal services through RabbitMQ (e.g., notifications, system messages).
-
gateway.service β reverse proxy gateway (YARP) container.
-
rabbitmq β message broker container for asynchronous communication.
-
minio β object storage container for binary file handling.
-
identity.service β ASP.NET Core container for the Identity microservice.
-
identity.database β PostgreSQL database container for the Identity service.
-
account.service β ASP.NET Core container for the Account microservice.
-
account.database β PostgreSQL database container for the Account service.
-
course.service β ASP.NET Core container for the Course microservice.
-
course.database β PostgreSQL database container for the Course service.
-
progress.service β ASP.NET Core container for the Progress microservice.
-
progress.database β PostgreSQL database container for the Progress service.
-
storage.service β ASP.NET Core container for the Storage microservice (MinIO integration).
-
mail-sender.service β ASP.NET Core container for the asynchronous email dispatching microservice.
-
customer-portal.frontend β React frontend container for the Customer Portal.
-
manager-portal.frontend β React frontend container for the Manager Portal.
Allows you to run all integration and unit tests.
> dotnet test # donet SKD is requiredmake commands work on Linux/macOS. Alternatively, Docker Compose can be used.
| Action | Make | Docker Compose |
|---|---|---|
| Build | make build-backend |
docker compose -f docker-compose.backend.yml build --no-cache |
| Start | make up-backend |
docker compose -f docker-compose.backend.yml up --build |
| Stop | make down-backend |
docker compose -f docker-compose.backend.yml down |
| Stop & remove volumes | make down-backend-clean-volumes |
docker compose -f docker-compose.backend.yml down -v |
| Action | Make | Docker Compose |
|---|---|---|
| Build | make build-frontend |
docker compose -f docker-compose.frontend.yml build --no-cache |
| Start | make up-frontend |
docker compose -f docker-compose.frontend.yml up |
| Stop | make down-frontend |
docker compose -f docker-compose.frontend.yml down |
SQL scripts automatically create tables and populate databases with test data when Docker containers start.
| Role | URL | Login | Password |
|---|---|---|---|
| Administrator | http://localhost:5174 (Manager portal) | admin@dev.com |
devDev123! |
| User | http://localhost:5173 (Customer portal) | dev@dev.com |
devDev123! |
- Account.database (Account.service)
- Course.database (Course.service)
- Identity.database (Identity.service)
- Progress.database (Progress.service)
- MinIO Storage (Storage.service)




























