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.