
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.

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.

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:

And the Overdue tab showing rentals that need immediate attention:

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.

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:

Booking Management with status tracking across the full lifecycle:

User Management with role-based access control:

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
- TorqueBooks: Workshop Management System Case Study — Exploring similar modular architectures using PocketBase.
- Self-Hosted CI/CD on a Home Rack — Behind the scenes of the automation pipeline that deploys our Dockerized services.
- Inside the NemesisNet Homelab — The hardware infrastructure running these Dockerized services.