Waarom Spring Boot hier draaien?

  • Vaste maandprijs: geen AWS bandbreedte-verrassingen of NAT gateway-kosten. Elke maand dezelfde factuur.
  • JVM-expertise inbegrepen: heap sizing, GC tuning en Actuator monitoring vanaf dag een. We draaien Java in productie sinds 2000.
  • Nederlandse datacenters: drie locaties, data blijft in de EU. ISO 27001-processen ingericht, certificering in voorbereiding.
  • Directe toegang tot engineers: als je app om 21:00 geheugen lekt, praat je met de mensen die het cluster draaien, niet met een helpdesk.

Twee manieren om je app te draaien

Je Spring Boot app is een container of een JAR. Hoe dan ook, we hebben een plek ervoor.

Pods CaffeineStacks
Wat je krijgt Een namespace op ons managed Kubernetes cluster Een dedicated VM met volledige root-toegang
Je deployt met kubectl, Helm, of CI/CD Docker Compose, Ansible, of CI/CD
Wij regelen Cluster, ingress, TLS, monitoring, scaling OS, firewall, backups, monitoring, SSL
Vanaf €100/maand €250/maand
Past bij Teams die vertrouwd zijn met kubectl en YAML Teams die een server willen waar ze in kunnen SSHen

Beide opties draaien op dezelfde infrastructuur: drie Nederlandse datacenters, privé backbone, ISO 27001 gecertificeerd. Het verschil zit in hoe je ermee werkt.

JVM in containers: wat we geleerd hebben

We draaien dagelijks Spring Boot apps in productie. Dit zijn de dingen die ertoe doen.

Geheugenlimieten

De JVM moet weten dat hij in een container draait. Moderne JVMs (17+) detecteren containerlimieten automatisch, maar stel alsnog -XX:MaxRAMPercentage=75 in. Dit geeft de JVM 75% van het geheugen van de container voor heap, met ruimte voor thread stacks, metaspace en native geheugen. Zonder deze instelling wordt je pod OOMKilled en ben je een middag Kubernetes events aan het lezen.

Health checks

Spring Boot Actuator geeft je /actuator/health/liveness en /actuator/health/readiness standaard mee. Deze mappen direct op Kubernetes liveness en readiness probes. Zet de initial delay op 30-60 seconden voor een typische Spring Boot app. Te laag en Kubernetes killt je pod voordat hij klaar is met opstarten.

livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
  initialDelaySeconds: 45
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /actuator/health/readiness
    port: 8080
  initialDelaySeconds: 20
  periodSeconds: 5

Garbage collection

G1GC is de standaard sinds Java 17 en werkt goed voor de meeste Spring Boot apps. Serveert je app latency-gevoelige APIs, overweeg dan ZGC (-XX:+UseZGC) voor voorspelbaardere pauzetijden. We monitoren GC-metrics automatisch en signaleren het als je app te veel tijd in GC doorbrengt.

Opstarttijd

Een typische Spring Boot app met Spring Data JPA en een paar dependencies start in 5-15 seconden. Duurt het langer, overweeg dan lazy initialization (spring.main.lazy-initialization=true) of Spring Boot's CDS-support voor snellere opstart. Op Pods betekent trage opstart ook trage scaling en trage rolling updates.

Database

De meeste Spring Boot apps hebben een database nodig. Op Pods maak je een PostgreSQL-instantie in je namespace via de CloudNativePG operator. Schrijf een manifest, apply het, en je hebt een beheerde database met geautomatiseerde backups en failover. MariaDB is ook beschikbaar.

Op CaffeineStacks richten we een dedicated PostgreSQL-instantie in op je VM of op een aparte database-VM (Cortado, €50/maand). Wij regelen backups, updates en monitoring.

In beide gevallen wijst je application.yml gewoon naar een JDBC URL. Geen code-aanpassingen nodig.

Monitoring

Spring Boot Actuator stelt Micrometer-metrics beschikbaar die we automatisch in Prometheus scrapen. Je krijgt Grafana-dashboards met:

  • JVM-metrics: heap-gebruik, GC-frequentie en pauzetijden, thread count
  • HTTP-metrics: request rate, responstijden, foutpercentages per endpoint
  • Custom metrics: alles wat je via Micrometer beschikbaar maakt verschijnt automatisch
  • Alerts: configureerbare drempels naar Slack, email of webhook

Geen agents installeren, geen configuratie nodig. Als je app Actuator gebruikt (waarschijnlijk wel), werkt monitoring out of the box.

Deployment

Bouw je container image in CI, push naar een registry, deploy naar je namespace of VM. Een typische GitHub Actions workflow:

- name: Build and push
  run: |
    ./mvnw spring-boot:build-image \
      -Dspring-boot.build-image.imageName=registry/my-app:${{ github.sha }}
    docker push registry/my-app:${{ github.sha }}

- name: Deploy
  run: |
    kubectl set image deployment/my-app \
      my-app=registry/my-app:${{ github.sha }}

We helpen je met het opzetten van de pipeline tijdens onboarding. Heb je er al een, dan sluiten we daarop aan.

Welke optie past bij jouw app?

Jouw situatie Onze aanbeveling
Eén Spring Boot app, vertrouwd met kubectl Pods Cortado (€100/maand) of Espresso (€150/maand) als je een database nodig hebt
Spring Boot app met PostgreSQL, iemand moet de server beheren CaffeineStacks Espresso (€250/maand) + Cortado database (€50/maand)
Meerdere Spring Boot services, microservices-architectuur Managed Clusters vanaf €1500/maand met dedicated staging en productie

Wat we niet doen

We beheren infrastructuur, niet je applicatiecode. We debuggen je Spring Boot configuratie niet en schrijven je Dockerfile niet. Maar we vertellen je wel wanneer je app geheugen lekt, wanneer je connection pool uitgeput is, of wanneer je health endpoint flapt. En als je hands-on Java-expertise nodig hebt, kan ons consulting team helpen.

Vertel ons over je app

Beschrijf wat je draait, wat je nodig hebt, en waar het nu staat. We adviseren de juiste setup en geven je een duidelijke prijs. De meeste teams gaan van eerste mail naar draaiende infrastructuur binnen een week.

Neem contact op
CoffeeSprout infrastructuur