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?
Questo errore non viene da PostgreSQL — non ha mai visto la connessione. "Connection refused" è il sistema operativo sull'host di destinazione che dice che nulla è in ascolto su quell'indirizzo e porta (o che un firewall ha rifiutato attivamente il pacchetto). Questa distinzione restringe subito la ricerca.
Cosa significa questo errore
Tre modalità di fallimento al momento della connessione sembrano simili ma significano cose diverse:
| Sintomo | Significato |
|---|---|
Connection refused | Il TCP ha raggiunto l'host, nulla in ascolto su quella porta (o firewall REJECT). PostgreSQL non è coinvolto. |
| Connection timeout | Pacchetti scartati silenziosamente — tipicamente un firewall o un security group, o host sbagliato. |
no pg_hba.conf entry for host ... | Hai davvero raggiunto PostgreSQL; ora è un problema di configurazione dell'autenticazione, un'altra pagina del manuale. |
Quindi "Connection refused" significa: posto sbagliato, porta sbagliata, o nessun server in esecuzione lì.
Cause comuni
- PostgreSQL non è in esecuzione — è crashato, non è partito dopo un cambio di configurazione, o l'host si è riavviato e il servizio non è abilitato.
- Ascolta solo su localhost. Il default
listen_addresses = 'localhost'non accetta alcuna connessione TCP remota. - Porta sbagliata. Il server potrebbe essere su una porta non di default — su Debian/Ubuntu, un secondo cluster sullo stesso host tipicamente prende la 5433.
- Networking Docker: la porta del container non è pubblicata (
-p 5432:5432), oppure stai usandolocalhostda dentro un altro container invece del nome del servizio. - Un firewall configurato per rifiutare (anziché scartare) su quella porta.
Come diagnosticarlo
Dal client:
pg_isready -h db.example.com -p 5432
Sull'host del server:
# Il servizio gira?
systemctl status postgresql
# Qualcosa ascolta, e su quale indirizzo/porta?
ss -lntp | grep -E '5432|postgres'
Se il servizio è spento, il motivo dell'avvio fallito è nei log (journalctl -u postgresql o la directory di log di PostgreSQL) — un refuso in postgresql.conf dopo una modifica è un classico. Se gira ma è in bind solo su 127.0.0.1, è listen_addresses.
Come risolverlo
- Servizio spento → leggi l'errore di avvio nel log, correggilo,
systemctl start postgresql(e faienable). - Serve accesso remoto → imposta
listen_addressesinpostgresql.conf(richiede un riavvio), aggiungi una regolapg_hba.confcorrispondente, e apri il firewall — solo verso le reti client specifiche. Esporre la 5432 su internet invita traffico d'attacco costante; restringi per CIDR e richiedi auth forte (scram-sha-256) e TLS. - Porta sbagliata → controlla
portinpostgresql.conf(o l'elenco dei cluster sui sistemi della famiglia Debian) e correggi la stringa di connessione. - Docker → pubblica la porta, o da un altro container connettiti al nome del servizio compose, non a
localhost.
