All projects

Backend & web applications

eBank · multi-tenant banking SaaS

A multi-tenant banking SaaS platform: each organization manages its customers, accounts, simulated transfers and permissions, strictly isolated from the others. Spring Boot, React and MySQL, with a transactional transfer engine, automated tests and deployment on AWS.

  • In active development
  • Individual project
roles, from client to platform admin
4
controlled steps per transfer
9
transaction for debit and credit
1
separate layers, from React to AWS
6

01Starting point

Context & mission

The problem

In a financial application, bugs do not show up on screen: they are a wrong balance, a transfer counted twice, or one organization reading another’s data. These are exactly the risks demo banking projects usually ignore.

The mission

Design a banking simulation platform as a real SaaS product: organization isolation, transfers that stay consistent under concurrency, server-side security, tests that check business invariants, then containerization, CI and cloud deployment. No real payments, no real banking network.

My role

A personal project I evolve step by step: domain modelling, business rules, security, testing, containerization, CI/CD and AWS infrastructure.

02Execution

What I did

  1. Multi-tenant architecture

    Data isolated per organization: customers, accounts, transactions and admin resources are only reachable inside their tenant. Four roles (platform admin, organization admin, agent, client), with authorization enforced in the backend.

  2. Transfer engine

    Server-side validation of amount, status, ownership and balance; atomic debit and credit in a single transaction; concurrency control against inconsistent balances; idempotency against duplicate requests; explicit rollback on failure.

  3. Ledger and integrity

    Consistent debit and credit entries for every transfer, persisted in the same transaction; completed records protected from modification; reconciliation checks between balances and recorded movements.

  4. Security

    Stateless JWT authentication, hashed passwords, RBAC with Spring Security, server-side ownership and tenant checks, request validation, consistent API errors, environment-based secrets and an audit trail of sensitive operations.

  5. SaaS administration

    Organization and user management, subscription plans and usage quotas enforced by the backend, subscription statuses and simulated billing. Platform administration is kept separate from organization permissions.

  6. React interface

    Dedicated views for customers, agents and administrators; account dashboards and paginated history; transfer forms with validation and confirmation; search, filters, loading, empty and error states; protected navigation.

  7. Testing strategy

    Unit tests for business rules, API and security tests, database integration with Testcontainers, regression tests for rollback and duplicates, concurrency tests on shared accounts, front-end and end-to-end tests, all run in CI.

  8. DevOps & AWS

    Docker and Docker Compose for reproducible environments; GitHub Actions for tests, builds and deployment, with short-lived AWS credentials through GitHub OIDC; infrastructure described as code.

03Design

Architecture

A modular monolith, split by business responsibility rather than into needless services: identity, organizations, customers, accounts, transfers, ledger, subscriptions and audit. Presentation, API, domain, persistence, security and infrastructure layers stay separate. The MySQL model uses relational constraints, indexes, precise decimal types for money and versioned migrations.

Application layers
  1. PresentationReact · routes · forms
  2. REST APIControllers · DTOs · validation
  3. DomainRules · transfers · subscriptions
  4. PersistenceJPA · Hibernate · MySQL
Supported by
  • SecuritySpring Security · JWT · tenant isolation
  • InfrastructureDocker · Nginx · CI/CD · AWS
The path of a transferEverything commits or nothing does: a debit without its credit is impossible.
  1. Access checkJWT · permissions · tenant
  2. ValidationAmount · status · currency · balance
  3. IdempotencyNo double processing
  4. TransactionConcurrency control
  5. Debit · credit+ ledger entries
  6. CommitOtherwise full rollback
Deployment on AWS
  1. CloudFront + S3React front end · CDN
  2. ECS FargateContainerized Spring Boot API
  3. RDS for MySQLManaged database
Supported by
  • IAMLeast privilege
  • Secrets ManagerSensitive configuration
  • CloudWatchLogs · alerts
  • Certificate ManagerTLS
  • Terraform / CloudFormationInfrastructure as Code
  • GitHub ActionsCI/CD · OIDC

04Impact

Results

  • A complete engineering project: front end, backend architecture, relational model, authentication, authorization, transactions, testing, containerization and cloud deployment.
  • Business invariants protected by code and by tests: consistent balances, traceable transfers, isolated organizations.
  • An openly educational simulation: no real payments, no real banking network.

05Wrap-up

Takeaways

What this project proves

That I can reason about business-critical workflows, design reliable REST APIs, enforce security boundaries, guarantee data integrity and take an application all the way to the cloud, with tests at every step.

Learnings and next steps

Principles followed throughout: separation of concerns, SOLID where it simplifies, explicit business invariants, secure-by-default authorization, automated regression tests, reproducible environments, Infrastructure as Code, observability, and documented architecture decisions.

06Technology

Full stack

  • Java 17
  • Spring Boot 3.2
  • Spring Security
  • Spring Data JPA
  • Hibernate
  • JWT
  • Bean Validation
  • MySQL 8
  • React 19
  • React Router
  • Axios
  • JUnit 5
  • Mockito
  • MockMvc
  • Testcontainers
  • Vitest
  • React Testing Library
  • Playwright
  • Docker
  • Docker Compose
  • Nginx
  • GitHub Actions
  • AWS ECS Fargate
  • Amazon RDS
  • Amazon S3
  • CloudFront
  • AWS IAM
  • Secrets Manager
  • CloudWatch
  • Terraform