PostgreSQL : connection refused
psql: error: connection to server at "db.example.com" (10.0.0.12), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
Cette erreur ne provient pas de PostgreSQL — il n'a jamais vu la connexion. « Connection refused » est le système d'exploitation de l'hôte cible qui dit que rien n'écoute sur cette adresse et ce port (ou qu'un pare-feu a activement rejeté le paquet). Cette distinction restreint immédiatement la recherche.
Ce que signifie cette erreur
Trois modes d'échec au moment de la connexion se ressemblent mais signifient des choses différentes :
| Symptôme | Signification |
|---|---|
Connection refused | Le TCP a atteint l'hôte, rien n'écoute sur ce port (ou pare-feu REJECT). PostgreSQL pas impliqué. |
| Connexion timeout | Paquets silencieusement rejetés — typiquement un pare-feu ou un groupe de sécurité, ou un mauvais hôte. |
no pg_hba.conf entry for host ... | Vous avez atteint PostgreSQL ; c'est désormais un problème de configuration d'authentification, une autre page du manuel. |
Donc « Connection refused » signifie : mauvais endroit, mauvais port, ou aucun serveur qui tourne là.
Causes fréquentes
- PostgreSQL n'est pas démarré — planté, échec de démarrage après un changement de config, ou l'hôte a redémarré et le service n'est pas activé.
- Il n'écoute que sur localhost. La valeur par défaut
listen_addresses = 'localhost'n'accepte aucune connexion TCP distante. - Mauvais port. Le serveur peut être sur un port non standard — sur Debian/Ubuntu, un second cluster sur le même hôte obtient typiquement le 5433.
- Réseau Docker : le port du conteneur n'est pas publié (
-p 5432:5432), ou vous utilisezlocalhostdepuis un autre conteneur au lieu du nom du service. - Un pare-feu configuré pour rejeter (plutôt que de laisser tomber) sur ce port.
Comment la diagnostiquer
Depuis le client :
pg_isready -h db.example.com -p 5432
Sur l'hôte du serveur :
# Le service tourne-t-il ?
systemctl status postgresql
# Quelque chose écoute-t-il, et sur quelle adresse/quel port ?
ss -lntp | grep -E '5432|postgres'
Si le service est arrêté, la raison de l'échec du démarrage est dans les journaux (journalctl -u postgresql ou le répertoire de journaux de PostgreSQL) — une faute de frappe dans postgresql.conf après une modification est un classique. S'il tourne mais lié à 127.0.0.1 uniquement, c'est listen_addresses.
Comment la corriger
- Service arrêté → lisez l'erreur de démarrage dans le journal, corrigez-la,
systemctl start postgresql(etenable-le). - Accès distant nécessaire → définissez
listen_addressesdanspostgresql.conf(nécessite un redémarrage), ajoutez une règlepg_hba.confcorrespondante, et ouvrez le pare-feu — vers les réseaux clients spécifiques uniquement. Exposer 5432 à Internet attire un trafic d'attaque constant ; restreignez par CIDR et exigez une authentification forte (scram-sha-256) et TLS. - Mauvais port → vérifiez
portdanspostgresql.conf(ou la liste des clusters sur les systèmes de la famille Debian) et corrigez la chaîne de connexion. - Docker → publiez le port, ou depuis un autre conteneur connectez-vous au nom du service compose, pas à
localhost.
