Infrastructure & DevOps· 11 min

Fait partie du guide Lancer un SaaS : les décisions qu'on ne reprend pas sans payer

Ce que coûte vraiment ton infra, ce n'est pas le prix affiché

Pixel art : un serveur rack dont un tuyau déverse des pièces vertes dans des pots de plus en plus grands, le dernier en pointillés.
Le prix affiché est le petit pot. Les paliers suivants sont dessinés en pointillés, jusqu’à ce qu’on y soit.

Le 18 septembre 2026, sycode.fr s’est mis à répondre disk I/O error. Pas une page d’erreur propre, pas une alerte : la base SQLite du site n’arrivait plus à écrire, parce que le disque du serveur était plein. En regardant, j’ai trouvé 72 images Docker qui pesaient 13,8 Go. Chaque déploiement en laissait une derrière lui, taguée, et mon nettoyage automatique ne les touchait pas.

Sur le même serveur, le 15 juin, Hetzner avait déjà relevé ses prix d’un coup, un lundi à 8 h. Deux événements sans rapport, sauf sur la ligne « hébergement » du prévisionnel : ni l’un ni l’autre n’y figurait. Cet article, c’est cette ligne, réécrite avec ce qui s’y cache. Il complète lancer un SaaS côté exploitation.

Tous les prix ci-dessous : relevés le 14/09/2026, sur les pages officielles des éditeurs. Si tu lis ça dans six mois, revérifie avant de recopier.

Hetzner a changé de prix un lundi matin

Le 15 juin 2026, Hetzner a publié la table complète de ses anciens et nouveaux tarifs. Le CX23, le petit serveur partagé à 2 vCPU et 4 Go, est passé de 3,99 € à 5,49 €. Le CCX13, à vCPU dédiés, de 15,99 € à 42,99 €, soit +169 %. Les gammes partagées ont pris 30 à 38 %, les gammes dédiées plus du double.

Pour toi, fondateur, ça veut dire une chose : les articles qui expliquent qu’« un serveur, c’est 4 € » ont été écrits avant juin et sont faux aujourd’hui. Pas approximatifs, faux. Et le prix du serveur reste pourtant le poste le plus stable de ta facture. Celui qui bouge vraiment, c’est ce qui sort du serveur vers internet.

Le gigaoctet sortant, ce n’est pas un écart de pourcentage entre fournisseurs, c’est un changement d’ordre de grandeur. Voilà ce que j’ai relevé, du moins cher au plus cher. La colonne « inclus » compte autant que le prix unitaire.

Fournisseur / produitInclusGo sortant supplémentaire
Cloudflare R210 Go stockés0 $
OVHcloud VPS« illimité »annoncé nul
Hetzner Cloud (EU-Central)20 Toau-delà, facturé par blocs de 100 Mo, tarif affiché dans la console
Supabase Pro250 Go0,09 $
Vercel Pro1 To0,15 $
Firebase Hosting360 Mo par jour0,15 $

Le calcul que je fais pour un prévisionnel tient en une ligne. Sur Vercel Pro, chaque téraoctet au-delà du premier coûte 150 $ dans le mois. Sur un serveur Hetzner en Europe, les 20 premiers téraoctets ne déclenchent aucune ligne. Chez Hetzner toujours, le trafic inclus dépend de l’emplacement : 20 To en Europe, à partir de 1 To aux États-Unis. Le même serveur, déplacé, change de modèle économique.

Ce tableau ne dit pas combien tu vas sortir, et personne ne peut le dire à ta place. Le levier le plus sûr sur cette ligne reste ce que tu n’as pas construit, exports lourds et galeries d’images en tête, et ça se décide au moment de définir le MVP.

Ce qui remplit un disque sans qu’on le voie

Le disque plein du 18 septembre s’explique en deux lignes de script. Le serveur héberge sycode.fr et quatre autres sites, chacun déployé par une image Docker. Mon nettoyage lançait docker image prune sans option, ce qui ne retire que les images orphelines, celles qui n’ont plus de tag. Or chaque déploiement laissait une image taguée derrière lui. Résultat : 72 images, 13,8 Go, sur un disque de 40 Go partagé par une trentaine de conteneurs.

Le fix, c’est docker image prune -a, qui retire aussi les images taguées que plus aucun conteneur n’utilise, lancé en fin de chaque déploiement pour ne plus y penser. Le coût de l’incident, lui, ne se lit pas sur la facture Hetzner : c’est un site qui ne répondait plus et une soirée passée à comprendre pourquoi une base SQLite qui marchait depuis des mois refusait d’écrire.

Ce genre de seuil silencieux existe chez tous les fournisseurs, et il n’apparaît dans aucun comparatif de prix. Ceux que j’ai relevés, et sur lesquels je vérifie mes clients :

  • Supabase Free met le projet en pause après une semaine d’inactivité. Pour tout ce qui doit rester joignable, le palier réel est donc 25 $/mois, pas 0 $.
  • Firebase Hosting plafonne au jour, pas au mois : 360 Mo de transfert par jour sur le plan gratuit, puis 0,15 $/Go.
  • Vercel Pro n’est pas un forfait, c’est 20 $ de crédit d’usage réparti sur plusieurs compteurs consommables en parallèle. Ta facture peut décrocher sans que le trafic ait bougé.
  • Un disque de VPS, lui, ne prévient pas. Il se remplit, puis ta base s’arrête.

En gros, un plan gratuit n’est pas un prix. C’est une promesse avec une condition de rupture, et la seule question utile devant un palier, c’est ce qui se passe à la seconde d’après : on te facture, on te bloque, ou on te coupe. C’est sous cet angle, la dépendance plutôt que le prix, que je relis le choix de ses prestataires.

Les minutes CI, une monnaie qu’on n’a pas budgétée

Sur asap.cool, mon produit en Rust, le pipeline GitHub Actions construisait l’image en une vingtaine de minutes. Sur un dépôt privé, ces minutes sont comptées, et en juin 2026 j’ai épuisé le quota mensuel. Plus de déploiement automatique, alors que le code était prêt.

Le premier levier a été technique : avec cargo-chef, qui met en cache les dépendances compilées, le build est passé de vingt minutes à quelques-unes. Le second a été moins glorieux : un script de déploiement manuel, lancé depuis le VPS, pour contourner le quota les jours où il ne restait rien. Et le drill de restauration que j’ai ajouté en septembre, celui qui vérifie que le backup se restaure, ne se lance jamais sur push. Le commentaire dans le workflow dit pourquoi : les minutes sont rares ici.

Pour te donner l’échelle, un build Rust à froid sur ce projet, c’est 67 Go d’artefacts et 37 minutes. C’est le prix concret de Rust pour un solo, et il ne figure sur aucune page de tarifs. Il se paie en quota, en attente et en workarounds. Si ton produit est en Next.js, tu n’auras pas ces chiffres, mais tu auras le même poste, plus petit.

Un backup jamais restauré n’est pas un backup

Le 6 septembre 2026, sur asap.cool, j’ai enfin coché une case de ma checklist de prod qui était décochée depuis mai : « backups testés ». Pendant ces quatre mois, les sauvegardes partaient tous les jours, chiffrées, sur un stockage objet. J’avais une procédure de restauration documentée. Je ne l’avais jamais exécutée.

Quand je l’ai fait, elle ne pouvait pas marcher. Le dump chiffré avec age était envoyé directement dans pg_restore, sans passer par le déchiffrement. Et les tables de la file de tâches, pgmq, manquaient au dump : une restauration aurait relancé le produit sans ses jobs en attente, factures et emails compris. Un backup qui s’écrit tous les jours et ne se restaure jamais, c’est une ligne de coût sans contrepartie.

Le truc, c’est que cette ligne est petite. Chez Hetzner, les sauvegardes automatiques du serveur coûtent 20 % du prix du serveur, soit 1,10 €/mois sur un CX23. Chez OVHcloud, la sauvegarde quotidienne est incluse dans le VPS. Ce n’est pas le prix qui manque dans les prévisionnels, c’est le test. Moi, depuis septembre, je restaure sur une base vide toutes les semaines, et la case ne se recoche pas toute seule.

La sortie réseau et les limites qu’on croit connaître

Fin août 2026, un SaaS que je maintiens sur Supabase et Vercel a reçu un avertissement de Supabase : quota de sortie réseau dépassé de 390 %, restriction annoncée. Rien n’avait changé dans le produit. Ce qui avait changé, c’est ce qui lisait la base : les pages publiques rechargées à chaque visite, les préversions Vercel qui partageaient la base de prod et se faisaient crawler, et quelques scripts lancés depuis mon poste sur la base distante.

La réponse a tenu en trois correctifs : un cache sur les pages publiques, noindex sur les préversions, et des scripts qui refusent de tourner si la base n’est pas locale. Aucune de ces corrections n’est visible pour l’utilisateur. Toutes évitent une facture.

Sur le même projet, quand j’ai ajouté la purge RGPD des données périmées, j’ai écrit dans le commit que c’était la « 2e et dernière tâche autorisée par le plan Hobby ». C’était vrai en 2025 ; depuis janvier 2026, Vercel autorise cent tâches par projet sur tous les plans, et la vraie contrainte du plan gratuit est ailleurs : une exécution par jour et par tâche. J’ai codé contre une limite qui n’existait plus. La leçon coûte moins cher que l’inverse, mais elle vaut pour tout ce tableau : la limite qui compte est celle de la page du jour, pas celle du tutoriel.

Et sur GoPronos, une application mobile sur Supabase aussi, le 9 août 2026, deux applications perdaient chacune un bout opposé du calendrier des matchs. Pas de bug dans le code : Supabase plafonne toute réponse à 1 000 lignes par défaut, et le calendrier venait de dépasser ce nombre. Une limite gratuite, silencieuse, qui ne coûte rien et qui a coûté une après-midi.

Migrer Vercel → VPS en un jour, presque

Le 13 septembre 2026, j’ai sorti sycode.fr de Vercel pour le poser sur le VPS partagé. Sur le papier, une journée : adaptateur Node pour Astro, une base SQLite à la place du stockage Vercel, des quotas mémoire sur le conteneur, et Caddy devant. La journée a effectivement suffi pour que le site réponde.

Ce qui a suivi ne rentre pas dans une journée. Le premier déploiement a échoué sur une clé SSH. Les en-têtes de sécurité ont éclaté à cause du quoting : Caddy a reçu un en-tête nommé 'self', parce qu’une valeur de CSP à plusieurs mots n’était pas entre guillemets. Le quota de requêtes de l’agent commercial se contournait en forgeant X-Real-IP. Le SMTP local refusait le port 587 et n’écoutait que le 25. Et deux jours plus tard, un correctif de build que j’avais poussé trop vite est reparti en revert, avec « mauvais diagnostic de ma part » dans le message.

Mutualiser cinq sites sur une machine a aussi un coût de coordination, que j’ai payé deux fois. Le 15 juin, deux projets clients sur le même serveur ont partagé le même nom de projet Compose, et l’un a écrasé l’autre au déploiement. Le 13 septembre, jour de la migration, un certificat Origin Cloudflare manquant sur le disque a fait refuser la configuration Caddy entière : pas le site concerné, les quatre autres sites avec. Le déploiement s’est annulé en vol, et c’était le bon comportement.

Voilà à quoi ressemble une migration d’hébergeur quand on la raconte depuis le journal de commits plutôt que depuis la page marketing. Le coût de l’auto-hébergement n’est pas nul, il est libellé en temps. Ce qui change, c’est sa forme : une soirée de diagnostic reste une soirée, alors que 4 To sortis au-delà du To inclus chez Vercel font 600 $ sur la facture, que le trafic vienne de clients ou d’un bot qui aspire tes images.

Ce que je fais à la place

Le pattern que j’ai gardé vient de callmatch.io, un projet perso de visio 1

lancé en mai 2026 avec un budget d’environ 5 €/mois, serveur et domaine compris. Il a été le premier sur le VPS mutualisé, et sycode.fr puis les sites clients ont suivi le même schéma : un Caddy central qui lit les labels Docker de chaque conteneur, Cloudflare devant pour le DNS et le TLS, et un déploiement par image.

Pour un site ou un SaaS à ses débuts, je prends SQLite plutôt qu’une base managée. Le volume ne justifie pas 25 $/mois de Supabase Pro ni un quota d’egress à surveiller, et le fichier se sauvegarde avec le reste. Ce n’est pas un choix universel : un produit multi-tenant comme asap.cool tourne sur Postgres avec de la RLS, et c’est justifié. La frontière entre les deux, je la pose dans choisir son architecture.

Le backup se relit, il ne s’écrit pas seulement. Le drill de restauration tourne chaque semaine sur une base vide, et je regarde le résultat. Les images Docker se purgent avec -a, en fin de déploiement, depuis le 19 septembre. Et le prévisionnel d’un client que j’accompagne a désormais ces lignes : sauvegarde testée, minutes de pipeline, sortie réseau, tâches planifiées, disque. Aucune n’est chère seule. Toutes ont fait tomber quelque chose au moins une fois cette année.

Ce que je peux te dire de mes propres projets, c’est que la facture d’hébergement n’a jamais été le problème. Ce qui coûte, c’est ce qui casse entre deux factures, et ça se paie en soirées. Si tu as un produit en ligne et que tu veux qu’on reprenne cette liste de postes sur ton infra à toi, avec tes chiffres et tes seuils, c’est exactement ce que je fais en TMA.

infrastructurehébergementvpshetznervercelsupabasebackupcoûts

Recevoir la suite

Un article comme celui-ci par semaine, dans Sycode Dispatch.

Tu recevras un e-mail pour confirmer. Ouvertures et clics mesurés, désinscription en un clic.

Un projet à concrétiser ?

Parlons-en. Je peux t'aider à transformer une idée en produit livré et itéré.

Un appel de 30 minutes, sans engagement. Je réponds sous 24 h. ★ Avis vérifiés sur Trustpilot