OnTheGoRentals: Spring Boot and Vue 3 Platform

Part 3 of our OnTheGoRentals dev diary. We cover the infrastructure: MinIO object storage, the Prometheus + Grafana + Loki observability stack, Docker deployment, and the technical debt we identified along the way.

What You’ll Learn

  • MinIO Object Storage

    S3-compatible storage for car images with local fallback and cloud migration path.

  • Observability Stack

    Prometheus metrics, Loki log aggregation, and Grafana dashboards for production monitoring.

  • Docker Deployment

    Full containerized stack with health checks and dependency ordering.

Object Storage: MinIO for Car Images

Car images are the first thing customers see. We needed reliable, scalable storage that wouldn’t lock us into a single cloud provider. MinIO (S3-compatible object storage) was the perfect choice—it runs on-premise, integrates seamlessly with Spring Boot, and can migrate to AWS S3 or Digital Spaces with zero code changes.

The system uses a StorageManagementServiceImpl facade that routes between MinioStorageService and LocalFileStorageService based on configuration. This means development environments can use local file storage while production uses MinIO—no code changes required.

Admin Dashboard with Storage Metrics

The admin dashboard shows real-time storage metrics: 63 files stored, 29.6 MB total. The Storage Usage chart breaks down usage by folder (Cars, Docs, Selfies), giving operators instant visibility into storage consumption.

Observability Stack: Engineering with Eyes Open

You can’t manage what you don’t measure. For OnTheGoRentals, we built a production-grade monitoring stack directly into our Docker layout.

Observability Stack

The system uses Prometheus to scrape custom Actuator metrics, Loki with Promtail for centralized log collection, and Grafana for visual dashboards.

What We Monitor

Component Tool Metrics
Application Metrics Prometheus + Actuator Request latency, error rates, JVM memory, thread pools
Log Aggregation Loki + Promtail Application logs, error traces, audit trails
Visualization Grafana Custom dashboards, alerts, trend analysis
Infrastructure Docker Stats CPU, memory, network I/O per container

The admin dashboard provides real-time operational visibility. Here’s the Daily Operations page with Collections, Returns, and Overdue tabs:

Admin Daily Operations

And the Overdue tab showing rentals that need immediate attention:

Admin Overdue Rentals

Docker Deployment: From Dev to Production

OnTheGoRentals is fully containerized. The Docker Compose setup includes the Spring Boot application, MySQL database, MinIO object storage, Prometheus, Grafana, and Loki—all orchestrated with proper health checks and dependency ordering.

Docker Compose Deployment

Container Architecture

Service Image Purpose
app Spring Boot 3.5.0 REST API + Web Application
mysql MySQL 8.0 Primary database
minio MinIO Latest S3-compatible object storage
prometheus Prometheus Latest Metrics collection
grafana Grafana Latest Dashboard visualization
loki Loki Latest Log aggregation
promtail Promtail Latest Log shipping to Loki

The Admin Interface

The admin dashboard provides comprehensive fleet management. Here’s the Car Management page showing the full fleet with availability status:

Admin Car Management

Booking Management with status tracking across the full lifecycle:

Admin Booking Management

User Management with role-based access control:

Admin User Management

Looking Back: Technical Debt and Architectural Evolution

No project is perfect, and OnTheGoRentals is no exception. As we prepared the v2.0-beta release, we identified several structural areas ripe for future architectural evolution.

The Email Bottleneck

The most prominent bottleneck is our transactional email relay system. Currently, when a booking is confirmed, the Spring Boot application synchronously renders an HTML template using Thymeleaf and sends it to our email provider. This adds up to 1.5 seconds of latency to the checkout response.

The Concurrency Question

Our current JPQL overlap query works well for moderate traffic, but we’re aware of its limitations. Under extreme load, the READ_COMMITTED isolation level could still allow edge-case race conditions.

What We’d Do Differently

If we were starting over today, we’d invest earlier in event sourcing for the booking lifecycle. Every status transition would emit an event, creating a complete audit trail that’s queryable and replayable.

Need a Rental Platform?

OnTheGoRentals is a production-ready template that can be adapted for cars, bicycles, houses, tools, or any rentable asset. The core architecture — booking engine, authentication, admin dashboard, observability — is built to scale. If you’re looking for a foundation to build on, let’s talk.

Related Reading