Hébergement Spring Boot
Sur la JVM, c’est la mémoire qui dimensionne
Une application Spring Boot ne se dimensionne pas comme un site PHP. Ce n’est ni le disque ni le nombre de visites qui décident, c’est la mémoire — et c’est ce que nous regardons en premier.
- Serveur privé infogéré, mémoire dimensionnée sur l’usage réel
- Un seul livrable à déployer, sans environnement à reconstituer
- Compilation native GraalVM quand elle est possible
- Sauvegarde, supervision et astreinte comprises
Le principe
Ce que demande une application JVM
Le déploiement est la partie facile
C’est l’un des grands avantages de Spring Boot : on obtient un seul livrable, capable de fonctionner sur de nombreux systèmes d’exploitation. Rien à installer sur le serveur au-delà de la machine virtuelle Java — pas d’environnement à reconstituer, pas de dépendances à faire correspondre.
Le même fichier tourne sur le poste du développeur, en recette et en production. Cela supprime toute une catégorie d’incidents de mise en ligne, ceux où l’environnement diffère sans qu’on sache dire en quoi.
La mémoire, et le piège du conteneur
Une application JVM réserve de la mémoire et la garde : elle ne la rend pas au système comme le ferait un script PHP. Le dimensionnement se fait donc sur la mémoire, pas sur le disque ni sur le nombre de visites.
Il faut surtout lui fixer un plafond explicite, aligné sur ce que la machine peut offrir. Sans cela, la JVM se croit seule et prend tout — c’est le mode d’échec le plus fréquent d’une application Java en conteneur : le processus est tué par le système, sans erreur applicative pour l’expliquer, et cela ressemble à une panne aléatoire.
La compilation native change la donne
Quand le projet s’y prête, la compilation native via GraalVM et Native Image produit un binaire optimisé. Deux conséquences directes sur l’hébergement : un démarrage quasi instantané, et une empreinte mémoire nettement réduite.
Une application qui aurait demandé une machine confortable tient alors sur bien moins, et supporte d’être arrêtée et relancée souvent — ce qui rend enfin raisonnable de la mettre en conteneur. Tout ne s’y prête pas, et nous vérifions avant de le promettre.
Java et Kotlin en conteneur
C’est le mode de déploiement le plus fréquent aujourd’hui, et celui où une application JVM se comporte le moins bien si l’on n’y prend pas garde. Quatre points, dans l’ordre où ils font mal :
La mémoire, encore. Une JVM regarde la machine pour décider ce qu’elle peut prendre. Dans un conteneur, elle doit regarder la limite du conteneur, pas celle de l’hôte — sinon elle se croit seule sur une grosse machine, réserve en conséquence, et le système la tue. L’application disparaît sans erreur applicative : rien dans les journaux n’explique l’arrêt, et cela ressemble à une panne aléatoire pendant des semaines.
Le temps de démarrage. Une JVM classique met des dizaines de secondes à être prête. Or l’orchestrateur, lui, veut savoir vite si le conteneur va bien : sans un délai de grâce correctement réglé, il tue le conteneur avant qu’il ait fini de démarrer, et le relance — indéfiniment.
La taille de l’image. Construire l’image en deux temps — compilation d’un côté, exécution de l’autre — évite d’embarquer l’outillage de construction en production. On divise le poids, donc le temps de déploiement et la surface d’attaque.
La compilation native. C’est ce qui réconcilie vraiment la JVM et le conteneur : GraalVM et Native Image produisent un binaire qui démarre quasi instantanément et consomme une fraction de la mémoire. L’application supporte alors d’être arrêtée et relancée souvent, ce qui est le mode de vie normal d’un conteneur. Tout ne s’y prête pas — nous vérifions avant de le promettre.
Serveur privé ou conteneur
Le serveur privé reste le plus simple : la machine est à vous, l’application tourne dessus, nous l’exploitons. C’est le choix par défaut pour une application unique et stable.
Le conteneur prend l’avantage dès qu’il y a plusieurs applications à faire cohabiter, plusieurs environnements à garder identiques, ou des déploiements fréquents. Nous exploitons Docker en mode Swarm : les conteneurs sont répartis sur plusieurs machines, replanifiés si un nœud tombe, et mis à jour par remplacement progressif des instances.
Ce qu’il y a autour
Un reverse proxy devant l’application, qui porte le certificat SSL et permet de basculer d’une version à l’autre sans coupure. Les journaux sortis du processus. Les métriques de la machine surveillées comme sur nos autres serveurs. Et la base de données — Hibernate parlant volontiers à plusieurs sources à la fois, il faut savoir lesquelles vivent chez nous et lesquelles restent chez vous.
Le socle
Ce que nous mettons en place
-
Mémoire dimensionnée
Un plafond explicite, aligné sur la machine. C’est le réglage qui évite le mode d’échec le plus fréquent des applications Java : le processus tué sans erreur applicative.
-
Compilation native
GraalVM et Native Image quand le projet s’y prête : démarrage quasi instantané, empreinte mémoire réduite, conteneurisation enfin raisonnable.
-
Conteneur bien réglé
Plafond mémoire aligné sur la limite du conteneur, délai de grâce au démarrage, image construite en deux temps. Trois réglages qui évitent des semaines de fausses pannes.
-
Reverse proxy et SSL
Nginx, HAProxy ou Traefik devant l’application : certificat automatique et bascule d’une version à l’autre sans coupure.
-
Bases et sources multiples
MariaDB, PostgreSQL ou une base spécialisée. Hibernate parle volontiers à plusieurs sources : il faut décider lesquelles vivent chez nous.
-
Exploitation complète
Mises à jour du système et de la JVM, sauvegarde répliquée hors site, correction automatique sur alerte et administrateur d’astreinte.
Questions fréquentes
Hébergement Spring Boot : vos questions
Une autre question ? Le support répond directement, sans intermédiaire, de 9h à 12h et de 14h à 17h.
Combien de mémoire faut-il ?
Cela dépend de l’application, et c’est précisément ce que nous mesurons plutôt que d’estimer : la consommation d’une JVM en charge réelle est la seule donnée qui vaille. Ce qui est certain, c’est qu’il faut un plafond explicite — sans lui, la JVM prend tout et le système finit par tuer le processus.
Peut-on la mettre en conteneur ?
Oui, à condition de fixer le plafond de mémoire en tenant compte de la limite du conteneur, faute de quoi le processus sera tué sans erreur applicative. La compilation native via GraalVM rend l’exercice bien plus confortable : démarrage quasi instantané et empreinte réduite.
Faut-il un serveur dédié ?
Une machine, oui — serveur privé ou conteneur : une application Spring Boot tourne en permanence et ne peut pas vivre sur une plateforme mutualisée. Nous l’exploitons pour vous : mises à jour, supervision, correction automatique sur alerte et astreinte.
Comment déployer sans coupure ?
En faisant tourner plusieurs instances derrière le proxy et en les remplaçant l’une après l’autre. Le temps de démarrage devient alors un vrai sujet : c’est l’un des arguments les plus concrets en faveur de la compilation native.
Combien de mémoire consomme votre application en charge ?
Si vous ne savez pas, c’est la première chose à mesurer — et nous pouvons le faire avec vous avant de dimensionner quoi que ce soit.