Bases de données9 min de lecture

PostgreSQL auto-hébergé vs Amazon RDS : le comparatif ROI

La facture Amazon RDS grossit à mesure que la base grossit — stockage, IOPS, connexions, Multi-AZ : chaque paramètre est une ligne de coût supplémentaire. PostgreSQL auto-hébergé sur un VPS dédié retourne l'équation : coût fixe et prévisible, extensions libres, accès root complet. Ce guide compare les deux modèles chiffres en main, couvre les étapes d'installation et de migration, et répond à l'objection la plus courante : qui administre le serveur au quotidien.

Pourquoi réévaluer RDS en 2026

Amazon RDS for PostgreSQL est une base managée solide, mais son modèle de facturation est conçu pour que la facture suive la croissance de façon non linéaire. Chaque composant se facture séparément : le compute de l'instance, le stockage gp3 au Go, les IOPS provisionnés, les nœuds de réplication en Multi-AZ, les sauvegardes au-delà de la fenêtre incluse, les transferts de données sortants. Une instance db.r6g.4xlarge en Multi-AZ avec 500 Go de stockage gp3 dépasse 3 000 $/mois sur us-east-1 au tarif à la demande. La même charge de travail sur un cluster Hetzner Cloud à trois nœuds tourne autour de 835 $/mois — soit une économie de 2 315 $/mois, environ 27 800 $ sur douze mois (source : selfhost.dev, mai 2026, HN item #48816129). Ce chiffre concerne un cluster haute disponibilité complet. Pour une base de développement, de staging ou un workload métier sans réplication, un nœud unique suffit à une fraction du coût. Le contexte tarifaire a aussi évolué en 2026 : Hetzner a revu ses grilles en avril puis en juin 2026, OVHcloud a augmenté ses VPS en avril 2026. Ces hausses modifient les chiffres absolus — elles ne changent pas la logique : l'auto-hébergement reste structurellement moins coûteux dès lors que la base dépasse quelques dizaines de Go et que le trafic impose une instance non-burstable. La question n'est plus de savoir si l'auto-hébergement est moins cher — les chiffres le confirment — mais de savoir si la charge opérationnelle vaut l'économie réalisée.

Ce que vous gagnez en passant sur VPS

  • Coût fixe et prévisible — pas de facturation au Go, aux IOPS supplémentaires ni aux connexions simultanées ; vous dimensionnez votre VPS une fois et le prix ne change pas avec le volume de requêtes.
  • Extensions libres — PostGIS, TimescaleDB, pg_partman, pgvector, citus : aucune restriction arbitraire sur les extensions, contrairement aux instances RDS où la liste est fermée et les extensions non supportées absentes.
  • Accès root et configuration finepostgresql.conf, pg_hba.conf, huge_pages, wal_level, poolers de connexion : vous ajustez chaque paramètre sans passer par une console cloud et sans restrictions sur les outils système.
  • Versions maîtrisées — vous choisissez quand passer de PostgreSQL 16 à 17, sans fenêtre de maintenance imposée ni dépréciation forcée par le fournisseur.
  • Données dans votre périmètre — choix du datacenter, chiffrement des volumes selon votre politique interne, pas de transfert de données inter-région facturé à chaque lecture analytique.
  • Portabilité totalepg_dump ou la réplication logique migrent vos données vers n'importe quel autre hôte sans friction de fournisseur et sans frais de sortie.
  • Option administration disponible — si la charge opérationnelle reste l'objection principale, l'option administration VPS couvre les tâches courantes (mises à jour, monitoring, sauvegardes) ; le contrôle reste le vôtre, la charge non.

PostgreSQL sur VPS vs Amazon RDS : tableau comparatif

CritèrePostgreSQL sur VPSAmazon RDS for PostgreSQL
Coût mensuel (workload standard)Fixe — proportionnel au serveur choisiVariable — compute + stockage + IOPS + Multi-AZ + sorties réseau
Exemple haute dispo (3 nœuds / Multi-AZ)~835 $/mois (Hetzner CCX53 cluster, mai 2026)~3 150 $/mois (db.r6g.4xlarge Multi-AZ, us-east-1)
Extensions PostgreSQLToutes, y compris PostGIS, pgvector, TimescaleDB, citusListe restreinte ; extensions non officielles absentes
Accès root / OSOui — choix d'OS, Docker, cron, tuning kernel, pgBouncerNon — API AWS uniquement, paramètres restreints
Mises à jour de versionÀ votre rythme, sans fenêtre de maintenance imposéePlanifiées ou imposées par AWS à la dépréciation
Charge opérationnelleSauvegardes, mises à jour, monitoring à gérerAutomatisée par AWS : sauvegardes, patches, failover
PortabilitéTotale — `pg_dump` ou réplication logique, sans fraisLiée à l'écosystème AWS, export de données payant

Prérequis avant de migrer

Un VPS de 4 Go de RAM et 2 vCPU suffit pour la plupart des bases de données d'applications web inférieures à 50 Go avec un trafic moyen et des connexions inférieures à 50 simultanées. Pour une base plus sollicitée, un schéma analytique avec beaucoup de jointures, ou un service exposé à des pics de trafic, prévoir 8 Go de RAM minimum. Le stockage SSD NVMe est indispensable : les accès aléatoires de PostgreSQL sur un disque rotatif ou un SSD SATA d'entrée de gamme dégradent les performances de façon significative, particulièrement lors des vides de cache après un redémarrage. Un accès root est requis — c'est le cas sur tout VPS cloud. Côté réseau, vous aurez besoin d'une adresse IPv4 fixe ou d'un nom de domaine interne pour pointer vos connexions applicatives. Prévoyez enfin une fenêtre de migration où les deux bases tournent en parallèle : l'application pointe sur RDS, vous remplissez le VPS, vous vérifiez la cohérence, puis vous basculez la variable de connexion. La durée dépend du volume : un dump de 5 Go restauré en parallèle prend quelques minutes ; 200 Go peuvent en prendre plusieurs dizaines.

Installer et configurer PostgreSQL sur un VPS

01

Installer PostgreSQL depuis le dépôt officiel PGDG

Sur Ubuntu 24.04 ou Debian 12, ajoutez le dépôt PostgreSQL Global Development Group pour obtenir la version courante plutôt que celle packagée par la distribution : curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg puis echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list. Ensuite : sudo apt update && sudo apt install -y postgresql-17.

02

Créer un utilisateur et une base dédiés

Connectez-vous en tant que postgres : sudo -u postgres psql. Puis créez un utilisateur applicatif et une base isolée : CREATE USER monapp WITH PASSWORD 'mot-de-passe-fort'; suivi de CREATE DATABASE monapp OWNER monapp;. Quittez avec \q. N'utilisez jamais le rôle postgres dans votre chaîne de connexion applicative : un bug ou une injection opèrerait avec les droits superutilisateur.

03

Configurer postgresql.conf pour la charge attendue

Le fichier de configuration se trouve dans /etc/postgresql/17/main/postgresql.conf. Paramètres clés pour un VPS de 4 Go : shared_buffers = 1GB (25 % de la RAM), effective_cache_size = 3GB, work_mem = 16MB, maintenance_work_mem = 256MB, max_connections = 100. Relancez après toute modification : sudo systemctl restart postgresql. Pour un VPS de 8 Go, montez shared_buffers à 2 Go et effective_cache_size à 6 Go.

04

Restreindre les connexions réseau dans pg_hba.conf

Par défaut, PostgreSQL n'écoute que sur localhost. Si votre application est sur le même serveur, c'est parfait — ne modifiez rien. Pour une application sur une autre machine, éditez /etc/postgresql/17/main/pg_hba.conf et ajoutez : host monapp monapp <IP-application>/32 scram-sha-256. Dans postgresql.conf, posez listen_addresses = 'localhost,<IP-VPS>'. Rechargez : sudo systemctl reload postgresql.

05

Exporter depuis RDS et importer sur le VPS

Sur une machine avec accès aux deux hôtes, exportez avec le format custom de pg_dump : pg_dump -h <endpoint-rds> -U <user> -Fc <base> -f dump.pgc. Puis importez sur le VPS en parallèle sur 4 workers : pg_restore -h localhost -U monapp -d monapp -j 4 dump.pgc. Vérifiez le compte de lignes sur quelques tables critiques avant de basculer la connexion applicative.

06

Automatiser les sauvegardes avec un cron

Créez /usr/local/bin/pg-backup.sh : PGPASSWORD='mot-de-passe' pg_dump -U monapp monapp -Fc > /var/backups/pg/monapp-$(date +%Y%m%d-%H%M).pgc. Rendez-le exécutable : chmod +x /usr/local/bin/pg-backup.sh. Ajoutez la crontab : 0 3 * * * /usr/local/bin/pg-backup.sh. Conservez les dumps chiffrés sur un stockage externe ou transférez-les via rsync vers un second VPS pour garantir une copie hors site.

07

Activer la supervision avec pg_stat_statements

Dans postgresql.conf, ajoutez shared_preload_libraries = 'pg_stat_statements'. Relancez PostgreSQL, puis activez l'extension dans votre base : CREATE EXTENSION pg_stat_statements;. Identifiez ensuite les requêtes lentes : SELECT query, mean_exec_time, calls FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;. Cela remplace avantageusement les métriques Performance Insights de RDS pour le diagnostic quotidien.

Durcissement post-install : désactivez le compte postgres système pour les connexions SSH (sudo passwd -l postgres) ; activez ssl = on dans postgresql.conf avec un certificat Let's Encrypt ou auto-signé pour chiffrer les connexions réseau entre l'application et la base ; activez ufw et n'ouvrez le port 5432 qu'aux IP applicatives connues (sudo ufw allow from <IP-app> to any port 5432). Ces trois gestes couvrent l'essentiel de la surface d'attaque d'une base exposée sur un réseau non privé.

Dépannage : erreurs courantes après migration

Les erreurs ci-dessous apparaissent fréquemment dans les premières heures après une migration RDS vers un VPS autonome. Chacune a un message précis et un remède ciblé — lisez le message complet avant d'agir, car plusieurs causes distinctes partagent le même code d'erreur.

Cinq erreurs fréquentes et leurs solutions

  • FATAL: password authentication failed for user "monapp" — le mot de passe envoyé ne correspond pas à celui en base, ou la méthode d'authentification diffère (md5 vs scram-sha-256). Vérifiez la ligne dans pg_hba.conf et rechargez : sudo systemctl reload postgresql. Si vous avez changé le mot de passe depuis psql, assurez-vous que la chaîne de connexion applicative reflète le nouveau.
  • FATAL: no pg_hba.conf entry for host "<IP>", user "monapp", database "monapp", SSL off — l'IP source de la connexion n'est pas autorisée dans pg_hba.conf. Ajoutez l'entrée manquante pour cet IP et rechargez. Si vous n'utilisez pas SSL, vérifiez que la ligne porte host et non hostssl.
  • ERROR: extension "uuid-ossp" does not exist (ou toute extension absente sur RDS) — l'extension est disponible dans PostgreSQL mais pas activée dans cette base. Exécutez depuis psql : CREATE EXTENSION IF NOT EXISTS "uuid-ossp";. Si l'extension manque au paquet, installez : sudo apt install postgresql-17-<extension>.
  • FATAL: remaining connection slots are reserved for non-replication superuser connectionsmax_connections est atteint. Augmentez-le dans postgresql.conf et relancez, ou installez pgBouncer pour mutualiser les connexions : un pool de 10 connexions réelles peut servir des centaines de clients applicatifs.
  • pg_restore: error: could not execute query: ERROR: role "rdsadmin" does not exist — RDS crée des rôles internes absents de tout PostgreSQL hors AWS. Ajoutez --no-owner --no-privileges à la commande pg_restore : pg_restore --no-owner --no-privileges -h localhost -U monapp -d monapp dump.pgc. Les objets sont importés sans tenter de réassigner la propriété aux rôles RDS.

Ce que ce comparatif ne couvre pas — et ce qu'il faut savoir avant de décider

L'auto-hébergement transfère vers votre équipe la charge de gestion des sauvegardes, des mises à jour de sécurité et du monitoring. C'est une réalité, pas un argument contre : elle s'évalue face au coût économisé. Pour un développeur seul ou une petite équipe sans expertise opérationnelle, l'option administration VPS couvre les tâches courantes — mises à jour, surveillance, sauvegardes vérifiées — sans que vous ayez à les orchestrer. RDS reste pertinent dans deux situations bien précises : quand la résilience multi-région est un prérequis contractuel et que vous n'avez pas les ressources pour la mettre en place manuellement, et quand la facturation à la consommation est réellement avantageuse pour une base très petite qui tourne peu (un VPS tourne et se facture 24 h/24 même à charge nulle). Pour tout le reste — base de taille moyenne, workload stable, équipe avec un minimum de compétences système — les chiffres plaident clairement pour l'auto-hébergement. Les articles <a href="/blog/heberger-postgresql-vps">PostgreSQL sur VPS : installation et bonnes pratiques</a> et <a href="/blog/postgresql-fin-de-vie-planifier-montee-version">PostgreSQL en fin de vie : planifier la montée de version</a> complètent ce guide sur le volet opérationnel et la gestion des versions majeures.

Déployez PostgreSQL sur un VPS à ressources dédiées

Accès root, stockage SSD NVMe, IPv4 incluse, sans surcoût au Go stocké. Choisissez votre configuration et mettez votre base en orbite.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou écrivez à notre équipe — support en français, anglais et arabe.