The “FATAL: password authentication failed for user” error is one of the most common PostgreSQL issues developers encounter. Whether you’re setting up a new database, working with Docker containers, or managing production systems, this error can stop your work in its tracks.
Don’t worry – I’ve dealt with this error countless times across different environments, and I’ll walk you through a systematic approach to diagnose and fix it quickly.
1. Quick Diagnosis Checklist
Before diving into complex solutions, let’s identify what’s causing your authentication failure:
Check these first:
- ✅ Username and password are correct (no typos)
- ✅ You’re connecting to the right host and port
- ✅ PostgreSQL service is actually running
- ✅ Your user account exists in the database
Get the full error message:
psql -h localhost -U postgres -d mydb
# Note: Save the complete error output for reference
Check PostgreSQL logs:
# Linux
sudo tail -f /var/log/postgresql/postgresql-*.log
# Docker
docker logs your_postgres_container
2. Most Common Causes and Solutions
Solution 1: Wrong Password or Forgotten Password
This is the #1 cause. Here’s how to reset it:
For local PostgreSQL installation:
# Switch to postgres user and connect
sudo -u postgres psql
# Reset the password
ALTER USER postgres WITH PASSWORD 'your_new_password';
For Docker containers:
# Connect to container
docker exec -it your_postgres_container psql -U postgres
# Reset password
ALTER USER postgres WITH PASSWORD 'your_new_password';
Solution 2: User Doesn’t Have a Password
If the cause of the error is the creation of a user or role without a password, log in to your PostgreSQL instance and set the password for the role.
-- Check if user exists but has no password
SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'your_username';
-- Set password for existing user
ALTER USER your_username WITH PASSWORD 'secure_password';
-- Create new user with password
CREATE USER new_user WITH PASSWORD 'secure_password';
Solution 3: pg_hba.conf Configuration Issues
PostgreSQL uses the pg_hba.conf file to configure client authentication. This file controls who can connect and how.
Step 1: Find your pg_hba.conf file:
# Find the file location
sudo -u postgres psql -c "SHOW hba_file;"
# Common locations:
# Linux: /etc/postgresql/[version]/main/pg_hba.conf
# Docker: /var/lib/postgresql/data/pg_hba.conf
Step 2: Edit the configuration:
# Edit the file (use your actual path)
sudo nano /etc/postgresql/14/main/pg_hba.conf
Step 3: Fix the authentication method:
Change this (problematic):
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 ident
To this (working):
# TYPE DATABASE USER ADDRESS METHOD
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
Step 4: Reload PostgreSQL:
# Linux
sudo systemctl reload postgresql
# Or
sudo -u postgres pg_ctl reload
# Docker
docker restart your_postgres_container
3. Docker-Specific Solutions
Docker environments have unique authentication challenges. Here’s how to handle them:
Fix Environment Variables
POSTGRES_HOST_AUTH_METHOD=scram-sha-256 POSTGRES_INITDB_ARGS=–auth-host=scram-sha-256
Complete Docker Compose setup:
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_HOST_AUTH_METHOD: md5
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Common Docker Troubleshooting
Problem: Port conflict with local PostgreSQL When you try to connect on docker postgres port 5432 you are connecting to your local machine postgres server
# Stop local PostgreSQL service
sudo systemctl stop postgresql
# Or use different port
docker run -p 5433:5432 postgres:15
Problem: Old volume data conflicts
# Remove old volumes and start fresh
docker-compose down -v
docker-compose up -d
Problem: Can’t connect from host machine
# Connect directly to container first
docker exec -it postgres_container psql -U postgres
# If this works, the issue is networking
# Check your connection string: postgresql://user:pass@localhost:5432/db
4. Authentication Method Guide
Understanding PostgreSQL’s authentication methods helps prevent future issues.
Recommended Methods by Use Case
Use Case | Method | Configuration |
---|---|---|
Local development | md5 |
Safe and widely supported |
Production | scram-sha-256 |
Most secure, requires newer clients |
Docker containers | md5 or scram-sha-256 |
Specify in environment variables |
Trusted network only | trust |
⚠️ No password required – use carefully |
Upgrading to SCRAM-SHA-256 (More Secure)
The method scram-sha-256 performs SCRAM-SHA-256 authentication, as described in RFC 7677. It is a challenge-response scheme that prevents password sniffing on untrusted connections
Step-by-step upgrade:
-- 1. Enable SCRAM encryption for new passwords
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();
-- 2. Reset all user passwords (even if same password)
ALTER USER postgres WITH PASSWORD 'same_password';
ALTER USER your_user WITH PASSWORD 'their_password';
-- 3. Update pg_hba.conf
-- Change 'md5' to 'scram-sha-256' in your pg_hba.conf file
-- 4. Reload configuration
SELECT pg_reload_conf();
5. Step-by-Step Troubleshooting Process
Follow this systematic approach when the error occurs:
Step 1: Verify Basic Connection
# Test if PostgreSQL is running and accepting connections
pg_isready -h localhost -p 5432
# Try connecting with different users
psql -h localhost -U postgres
psql -h localhost -U your_username
Step 2: Check User Existence and Password
-- Connect as superuser and check user
sudo -u postgres psql
-- List all users
\du
-- Check specific user details
SELECT rolname, rolcanlogin, rolpassword FROM pg_authid WHERE rolname = 'your_user';
Step 3: Review Authentication Configuration
# Check current authentication settings
sudo -u postgres psql -c "SHOW hba_file;"
sudo cat /path/to/pg_hba.conf | grep -v "^#" | grep -v "^$"
Step 4: Test Different Authentication Methods
# Edit pg_hba.conf temporarily to use 'trust' method
# This allows connection without password for testing
# ⚠️ Remember to change back to secure method after testing
# Reload and test
sudo systemctl reload postgresql
psql -h localhost -U postgres
Step 5: Check Logs for Detailed Error Information
# Monitor logs while attempting connection
sudo tail -f /var/log/postgresql/postgresql-*.log
# Look for specific error patterns:
# - "no pg_hba.conf entry for host"
# - "password authentication failed"
# - "role does not exist"
The “FATAL: password authentication failed” error is frustrating, but it’s almost always one of a few common issues: wrong credentials, missing user passwords, or authentication method mismatches. By following this systematic approach – starting with the most common causes and working through the troubleshooting steps – you’ll resolve the issue quickly and understand how to prevent it in the future.