PG::ConnectionBad: fe_sendauth: no password supplied
Ruby on-RailsPostgresqlAuthenticationRuby on-Rails Problem Overview
When I attempt to run "rake test" on a local postgres database, it throws the above exception.
Here is my pg_hba.conf file: # Database administrative login by Unix domain socket local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all username peer
local myapp_dev myapp md5
local myapp_test myapp md5
local myapp_prod myapp md5
#local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 md5
#host replication postgres ::1/128 md5
and here is the relevant section from my database.yml
test:
adapter: postgresql
database: myapp_test
pool: 5
timeout: 5000
host: localhost
username: username
password:
In the real database.yml, 'username' is replaced with my actual user name that I am logged in as. Since the authentication method is defined as 'peer', no password should be required.
I have also taken care to restart Postgres
sudo -u postgres pg_ctlcluster 9.3 main restart
What else am I missing here?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
localhost
as a host refers to a TCP connection, which means the auth method is md5
(password required) per your pg_hba.conf
:
IPv4 local connections:
host all all 127.0.0.1/32 md5
IPv6 local connections:
host all all ::1/128 md5
For the peer
method to be taken, you'd need to connect through Unix domain sockets, and since you seem to be using a debian-like OS, that means putting /var/run/postgresql
in the host
field, or nothing at all (it's the default unless environment variables say otherwise).
EDIT: if using database URIs (supported since Rails-4.1, as announced in http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/), the syntax could be:
-
for localhost:
test: "postgresql://localhost/myapp_test"
-
for the default Unix socket domain (host field left empty):
test: "postgresql:///myapp_test"
Solution 2 - Ruby on-Rails
Change the code as below and it will work
pg_hba.conf:
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
Below its explanation:
> trust > > Allow the connection unconditionally. This method allows anyone that > can connect to the PostgreSQL database server to login as any > PostgreSQL user they wish, without the need for a password or any > other authentication. > > md5 > > Require the client to supply a double-MD5-hashed password for > authentication.
refer for more here
Solution 3 - Ruby on-Rails
If your hb_conf has already been modified to force passwords, then make sure your rails app's database configuration includes a password in both development and test environments.
default: &default
adapter: postgresql
encoding: unicode
pool: 5
host: localhost
username: your_user
password: your_password
development:
<<: *default
database: your_db_development
test:
<<: *default
database: your_db_test
production:
url: <%= ENV['DATABASE_URL'] %>
I was getting this error when I failed to supply a password for the test database.
Solution 4 - Ruby on-Rails
I met this question, too. I checked my database config, /var/www/myproject/shared/config/database.yml
:
production:
adapter: postgresql
pool: 5
timeout: 5000
encoding: utf8
host: localhost
database: myproject
username: myname
password: <%= ENV['name_DATABASE_PASSWORD'] %>
I found the last paragraph is wrong, the right code is
password: <%= ENV['myproject_DATABASE_PASSWORD'] %>
Solution 5 - Ruby on-Rails
I use Postgres App. Which is really great because you don't have to supply username and password in the default part of the database.yml
database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: my-app_development
test:
<<: *default
database: my-app_test
production:
<<: *default
database: my-app_production
username: my-app
password: <%= ENV['MY-APP_DATABASE_PASSWORD'] %>
My problem: I changed the path and wasn't able to get postgres to work.
Solution: use the https://postgresapp.com/documentation/install.html">documentation</a> to:
-
Uninstall the app
-
Stop the postgres process using this answer"">https://stackoverflow.com/questions/42416527/postgres-app-port-in-use?rq=1">answer</a>;, which says to use
sudo pkill -u postgres
-
Reinstall and start the app
Everything should work fine now, have a great day!
Note: Doing this also solves the problem Postgres.app port 5432 in use
Solution 6 - Ruby on-Rails
I had this problem, solved by a coworker: You need to set a local user and password in postgres
createuser --interactive --pwprompt
It will ask you for the name of the role (the user) and the password you want to have.
Then you have to add this username and password to your database.yml file
Solution 7 - Ruby on-Rails
rename method from peer
to trust
in /etc/postgresql/<postgres-version>/main/pg_hba.conf
file.
# Database administrative login by Unix domain socket
local all postgres trust
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust