CloudVault is a cloud-native personal storage platform built with a modern event-driven architecture.
It allows users to securely upload, store, preview, and manage images, with scalable backend processing powered by Kafka workers and Cloudflare R2 object storage.
This project demonstrates real-world distributed system architecture, containerized deployment, and cloud integrations.
Repository:
https://github.com/jeet7122/personal_cloud_storage
- Project Overview
- Architecture
- Key Features
- Tech Stack
- Installation
- Local Development
- Deployment
- Future Improvements
- Contributing
CloudVault is designed to mimic the core architecture of modern cloud storage platforms.
Instead of uploading files synchronously, the system uses an asynchronous event-driven pipeline to process uploads reliably and scalably.
Uploading files directly to storage can cause:
- slow APIs
- blocked threads
- poor scalability
CloudVault solves this by introducing Kafka-based background workers.
Frontend (Next.js)
│
▼
Spring Boot API
│
▼
Kafka Event (photo-upload)
│
▼
Worker Service
│
▼
Cloudflare R2 Storage
│
▼
PostgreSQL Metadata
This architecture allows the system to scale independently for:
- API traffic
- file processing
- storage operations
CloudVault uses a microservice-style architecture with two backend services:
Responsible for:
- authentication validation
- upload request validation
- event publishing to Kafka
- metadata queries
Responsible for:
- consuming Kafka events
- uploading files to Cloudflare R2
- storing metadata in PostgreSQL
- deleting temporary files
Next.js Frontend (Vercel)
│
▼
Spring Boot API (Oracle Cloud)
│
▼
Kafka (Docker)
│
▼
Worker Service (Docker)
│
▼
Cloudflare R2 + PostgreSQL
Uploads are processed via Kafka events, enabling high scalability.
Files are stored using Cloudflare R2 (S3-compatible object storage).
Frontend authentication powered by Clerk JWT tokens.
Background workers process uploads asynchronously.
Modern Next.js + TailwindCSS interface with drag-and-drop uploads.
Photos are loaded with paginated APIs and intersection observers.
Kafka, API, and worker services run in Docker containers.
| Layer | Technology |
|---|---|
| Frontend | Next.js 16, React, TailwindCSS |
| Backend API | Spring Boot 3, Java 21 |
| Worker Service | Spring Boot Kafka Consumer |
| Messaging | Apache Kafka |
| Database | PostgreSQL |
| Storage | Cloudflare R2 |
| Authentication | Clerk JWT |
| Containers | Docker + Docker Compose |
| Deployment | Oracle Cloud VM |
| Frontend Hosting | Vercel |
Clone repository
git clone https://github.com/jeet7122/personal_cloud_storage.git
cd personal_cloud_storageStart the entire system:
docker compose up --build- Kafka
- Zookeeper
- Spring Boot API
- Worker Service
cd photo-store-backend
./mvnw spring-boot:run http://localhost:8080 cd photo-store-frontend
npm install
npm run dev http://localhost:3000DB_URL=
DB_USER=
DB_PASSWORD=
R2_ACCESS_KEY=
R2_SECRET_KEY=
R2_ENDPOINT=
R2_BUCKET=
JWKS_URI=
FRONTEND_URL=
APP_APPROVED_USERID=- Deploy Docker containers on an Oracle Cloud VM
- Expose port 8080
- Configure environment variables
- Connect GitHub repo
- Add environment variables
- Deploy automatically
- image thumbnails
- drag-to-folder organization
- search with metadata indexing
- background virus scanning
- multi-user support
- signed URL downloads
- Redis caching
- rate limiting
Contributions are welcome! If you’d like to improve CloudVault, please follow these steps.
Click the Fork button on the top right of the repository page.
git clone https://github.com/<your-username>/personal_cloud_storage.git
cd personal_cloud_storageCreate a feature branch for your changes.
git checkout -b feature/your-feature-nameImplement your feature or bug fix and ensure the code follows the project structure and conventions.
Write clear and descriptive commit messages.
git commit -m "Add: description of the feature or fix" git push origin feature/your-feature-name- Go to the original repository
- Click New Pull Request
- Describe your changes clearly
- Code is clean and readable
- No unnecessary dependencies are added
- Existing functionality is not broken
- Commit messages are meaningful
- Documentation is updated when necessary
If you find a bug or want to request a feature:
- Go to the Issues tab
- Create a new issue
- Provide a clear description and steps to reproduce