What

I have always used spring (boot) in previous applications and quarkus is gaining quite some trajectory so I would like to check it out, including building for native using graal.

I will built a self-hostable photo gallery web application that allows photos to be easily uploaded, viewed and organized. It will be made with quarkus in kotlin and compiled to native using graal. Photos will be stored on S3/S3-compatible object storage. Fine grained permissions for photos/albums through keycloak.

The frontend will be made in angular but I will spent as little time as possible on the frontend as it is not the focus for the exploration days.

Goals

  • Learn about quarkus, how does it measure up against spring boot? How well does it integrate? (security, persistence, queuing, caching, ...)
  • Learn about graal/native.
  • Get more comfortable with Kotlin.
  • Integrate cloud native technologies such as S3

How I built it

The architecture consists of an Angular frontend with PrimeNG as component library, a quarkus backend in kotlin that is able to run natively using GraalVM. A PostgreSQL database was used for photo metadata. To store the photos itself an S3 compatible object storage was used: Minio. RabbitMQ is also used to decouple the application and the storagebackend making use of amqp bucket notifications.

General opinion on quarkus

  • Allows quick development of a web application just like Spring Boot
  • Good documentation for the common use cases, not so for others
  • Fast
  • Nice development tooling (quarkusDev: automatic live recompilation)
  • Some annoying issues (more later)
  • Gradle is second class citizen

Pain points

Quarkus:

  • RabbitMQ integration
  • CDI
  • Config (No Map config properties, all profiles in one file) Kotlin:
  • Functional interfaces
  • Type inference Reactive programming: HARD

Things I lacked time for

  • Authentication/Authorization
  • Features
    • generate thumbnails
    • extract/show image metadata (EXIF)

Built With

Share this project:

Updates