← Projects
Booking platformmulti-tenant SaaS
Bookings for businesses that work by appointment. One API serves several businesses at once, and each one has its own website.
- Status:
- final phase
- Built with:
- Java, Spring Boot, Vue, PostgreSQL, RabbitMQ, Redis, Prometheus, Grafana, Docker, Nginx
- Code:
- private


Two different businesses, two different Vue sites, the same API underneath.
How it’s built
Barbershop siteVueTattoo siteVue…another business
NginxHTTPS · the business arrives by subdomain and by header
Gatewayresolves the real tenant and routes every call
Microservices hexagonal architecture
appointmentsclientsuserstenantsnotificationspaymentsbillinginventoryfilesstatisticsworker
My own shared libraries: auth · commons · rest · tenant · WhatsApp notifications
PostgreSQLdataRediscacheRabbitMQasync tasksDocker volumephotosPrometheus + Grafanametrics
All of it runs in Docker, on my own server.
Multi-tenantEach business is a tenant. The subdomain and the header only announce it: the real tenant comes from a shared database table that belongs to no business, and everything has to match. That way nobody sees anyone else’s data.
Async tasksAnything that doesn’t need to happen right away goes to a RabbitMQ queue: reminding someone of an appointment, asking them to confirm it. Notices go out over WhatsApp.
SecurityPublic pages for booking and private areas for managing. What you see depends on who you’re logged in as.
Cache and photosRedis keeps what gets read often. The photos each business uploads go to a Docker volume.
MetricsPrometheus collects metrics from every service and Grafana shows them on dashboards.
My own librariesWhat kept repeating across services (login, tenant, REST calls, WhatsApp) I moved into libraries. The WhatsApp one is open source.
Later I took the same hexagonal architecture into a monolith for a smaller project: twelve services were too much for it, and the structure works just as well without splitting it up.