156

I am running my development on Ubuntu 11.10, and RubyMine

Here is my development settings for the database.yml: which RubyMine created for me

development: adapter: postgresql encoding: unicode database: mydb_development pool: 5 username: myuser password: 

when I try to run the app, I get this error below, it seems that I didn't create a 'project' user yet, but, how can I create a user and grant it a database in postgres ? if this is the problem, then, what is the recommended tool to use in Ubuntu for this task ? if this is not the problem, then, please advice.

Exiting /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `initialize': FATAL: Peer authentication failed for user "project" (PG::Error) from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `new' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `connect' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:329:in `initialize' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `new' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `postgresql_connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:303:in `new_connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:313:in `checkout_new_connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:237:in `block (2 levels) in checkout' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:232:in `loop' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:232:in `block in checkout' from /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:229:in `checkout' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:95:in `connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:398:in `retrieve_connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:168:in `retrieve_connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:142:in `connection' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/model_schema.rb:308:in `clear_cache!' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/railtie.rb:91:in `block (2 levels) in <class:Railtie>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:418:in `_run__757346023__prepare__404863399__callbacks' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:405:in `__run_callback' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:385:in `_run_prepare_callbacks' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:81:in `run_callbacks' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/actionpack-3.2.3/lib/action_dispatch/middleware/reloader.rb:74:in `prepare!' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/actionpack-3.2.3/lib/action_dispatch/middleware/reloader.rb:48:in `prepare!' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/application/finisher.rb:47:in `block in <module:Finisher>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `instance_exec' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `run' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:55:in `block in run_initializers' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `each' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `run_initializers' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/application.rb:136:in `initialize!' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/railtie/configurable.rb:30:in `method_missing' from /home/sam/RubymineProjects/project/config/environment.rb:5:in `<top (required)>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `block in require' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:236:in `load_dependency' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require' from /home/sam/RubymineProjects/project/config.ru:4:in `block in <main>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:51:in `instance_eval' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:51:in `initialize' from /home/sam/RubymineProjects/project/config.ru:1:in `new' from /home/sam/RubymineProjects/project/config.ru:1:in `<main>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:40:in `eval' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:40:in `parse_file' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:200:in `app' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands/server.rb:46:in `app' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:301:in `wrapped_app' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:252:in `start' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands/server.rb:70:in `start' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:55:in `block in <top (required)>' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:50:in `tap' from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:50:in `<top (required)>' from /home/sam/RubymineProjects/project/script/rails:6:in `require' from /home/sam/RubymineProjects/project/script/rails:6:in `<top (required)>' from -e:1:in `load' from -e:1:in `<main>' Process finished with exit code 1 
0

9 Answers 9

339

If you installed postresql on your server then just host: localhost to database.yml, I usually throw it in around where it says pool: 5. Otherwise if it's not localhost definitely tell that app where to find its database.

development: adapter: postgresql encoding: unicode database: kickrstack_development host: localhost pool: 5 username: kickrstack password: secret 

Make sure your user credentials are set correctly by creating a database and assigning ownership to your app's user to establish the connection. To create a new user in postgresql 9 run:

sudo -u postgres psql 

set the postgresql user password if you haven't, it's just backslash password.

postgres=# \password 

Create a new user and password and the user's new database:

postgres=# create user "guy_on_stackoverflow" with password 'keepitonthedl'; postgres=# create database "dcaclab_development" owner "guy_on_stackoverflow"; 

Now update your database.yml file after you've confirmed creating the database, user, password and set these privileges. Don't forget host: localhost.

Sign up to request clarification or add additional context in comments.

9 Comments

if you're still having trouble logging in and completing the connection over localhost then go back into postgresql through terminal and apply some these 8.2 conventions to establish your connecting user's privileges, syntax is GRANT ALL ON DATABASE [dbname] to [usrname]. This syntax works on psql 9+ just the same, but you probably can only toggle permissions on databases owned by the user before it will GRANT ALL: postgresql.org/docs/8.2/static/sql-grant.html
host: localhost and pool: 5 was missing in my config. After adding them, error disappeared.
For me host: localhost was missing. after I added that, everything worked. This is in Ubuntu 13.04
Also important to stress: DON'T FORGET THE SEMICOLONS.
Personally I think it's important to be able to run the setup with rake db:setup. Otherwise you are going to have issues generating a fresh deployment environment, but this description does work for a development environment.
|
59

This is the most foolproof way to get your rails app working with postgres in the development environment in Ubuntu 13.10.

1) Create rails app with postgres YAML and 'pg' gem in the Gemfile:

$ rails new my_application -d postgresql 

2) Give it some CRUD functionality. If you're just seeing if postgres works, create a scaffold:

$ rails g scaffold cats name:string age:integer colour:string 

3) As of rails 4.0.1 the -d postgresql option generates a YAML that doesn't include a host parameter. I found I needed this. Edit the development section and create the following parameters:

encoding: UTF-8 host: localhost database: my_application_development username: thisismynewusername password: thisismynewpassword 

Note the database parameter is for a database that doesn't exit yet, and the username and password are credentials for a role that doesn't exist either. We'll create those later on!

This is how config/database.yml should look (no shame in copypasting :D ):

development: adapter: postgresql pool: 5 # these are our new parameters encoding: UTF-8 database: my_application_development host: localhost username: thisismynewusername password: thisismynewpassword test: # this won't work adapter: postgresql encoding: unicode database: my_application_test pool: 5 username: my_application password: production: # this won't work adapter: postgresql encoding: unicode database: my_application_production pool: 5 username: my_application password: 

4) Start the postgres shell with this command:

$ psql 

4a) You may get this error if your current user (as in your computer user) doesn't have a corresponding administration postgres role.

psql: FATAL: role "your_username" does not exist 

Now I've only installed postgres once, so I may be wrong here, but I think postgres automatically creates an administration role with the same credentials as the user you installed postgres as.

4b) So this means you need to change to the user that installed postgres to use the psql command and start the shell:

$ sudo su postgres 

And then run

$ psql 

5) You'll know you're in the postgres shell because your terminal will look like this:

$ psql psql (9.1.10) Type "help" for help. postgres=# 

6) Using the postgresql syntax, let's create the user we specified in config/database.yml's development section:

postgres=# CREATE ROLE thisismynewusername WITH LOGIN PASSWORD 'thisismynewpassword'; 

Now, there's some subtleties here so let's go over them.

  • The role's username, thisismynewusername, does not have quotes of any kind around it
  • Specify the keyword LOGIN after the WITH. If you don't, the role will still be created, but it won't be able to log in to the database!
  • The role's password, thisismynewpassword, needs to be in single quotes. Not double quotes.
  • Add a semi colon on the end ;)

You should see this in your terminal:

postgres=# CREATE ROLE postgres=# 

That means, "ROLE CREATED", but postgres' alerts seem to adopt the same imperative conventions of git hub.

7) Now, still in the postgres shell, we need to create the database with the name we set in the YAML. Make the user we created in step 6 its owner:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername; 

You'll know if you were successful because you'll get the output:

CREATE DATABASE 

8) Quit the postgres shell:

\q 

9) Now the moment of truth:

$ RAILS_ENV=development rake db:migrate 

If you get this:

== CreateCats: migrating ================================================= -- create_table(:cats) -> 0.0028s == CreateCats: migrated (0.0028s) ======================================== 

Congratulations, postgres is working perfectly with your app.

9a) On my local machine, I kept getting a permission error. I can't remember it exactly, but it was an error along the lines of

Can't access the files. Change permissions to 666. 

Though I'd advise thinking very carefully about recursively setting write privaledges on a production machine, locally, I gave my whole app read write privileges like this:

9b) Climb up one directory level:

$ cd .. 

9c) Set the permissions of the my_application directory and all its contents to 666:

$ chmod -R 0666 my_application 

9d) And run the migration again:

$ RAILS_ENV=development rake db:migrate == CreateCats: migrating ================================================= -- create_table(:cats) -> 0.0028s == CreateCats: migrated (0.0028s) ======================================== 

Some tips and tricks if you muck up

Try these before restarting all of these steps:

The mynewusername user doesn't have privileges to CRUD to the my_app_development database? Drop the database and create it again with mynewusername as the owner:

1) Start the postgres shell:

$ psql 

2) Drop the my_app_development database. Be careful! Drop means utterly delete!

postgres=# DROP DATABASE my_app_development; 

3) Recreate another my_app_development and make mynewusername the owner:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername; 

4) Quit the shell:

postgres=# \q 

The mynewusername user can't log into the database? Think you wrote the wrong password in the YAML and can't quite remember the password you entered using the postgres shell? Simply alter the role with the YAML password:

1) Open up your YAML, and copy the password to your clipboard:

 development: adapter: postgresql pool: 5 # these are our new parameters encoding: UTF-8 database: my_application_development host: localhost username: thisismynewusername password: musthavebeenverydrunkwheniwrotethis 

2) Start the postgres shell:

$ psql 

3) Update mynewusername's password. Paste in the password, and remember to put single quotes around it:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`; 

4) Quit the shell:

postgres=# \q 

Trying to connect to localhost via a database viewer such as Dbeaver, and don't know what your postgres user's password is? Change it like this:

1) Run passwd as a superuser:

$ sudo passwd postgres 

2) Enter your accounts password for sudo (nothing to do with postgres):

[sudo] password for starkers: myaccountpassword 

3) Create the postgres account's new passwod:

Enter new UNIX password: databasesarefun Retype new UNIX password: databasesarefun passwd: password updated successfully 

Getting this error message?:

Run `$ bin/rake db:create db:migrate` to create your database $ rake db:create db:migrate PG::InsufficientPrivilege: ERROR: permission denied to create database 

4) You need to give your user the ability to create databases. From the psql shell:

ALTER ROLE thisismynewusername WITH CREATEDB 

6 Comments

I wish I could give you more +1 s for this brilliant solution, I'd be even happier if it worked for me. still brilliant answer. quick question, are those backticks around the password in alter role? also, you don't need to use backticks earlier do you?
@MikeH-R Thanks, shame it doesn't work for you! Are you sure your relevant YAML has host: localhost? That was the real gotcha for me. Around the password you need single quotes. On my keyboard that's shift + @. With the psql shell you only need single quotes around some parameters. You need them around the password, and not around role's name, for example. It's very fiddly to be honest, but okay once you know it's nuances :)
@MikeH-R I've tweak my answer to make things clearer. Consider having another crack at it!
sorted it out now, thanks again for a brilliant answer, most other answers I encountered were about loosening security which is obviously no good in production.
for the CREATE ROLE and CREATE DATABASE parts you can also alternatively do sudo -u postgres createuser -s {}; sudo -u postgres psql; postgres=# \password {} and rake db:create
|
34

For permanent solution:

The problem is with your pg_hba. This line:

local all postgres peer 

Should be

local all postgres md5 

Then restart your postgresql server after changing this file.

If you're on Linux, command would be

sudo service postgresql restart 

1 Comment

Save everyone a step, if you need to know where pg_hba is: SHOW hba_file;
11

I was facing same problem on Ubuntu machine so I removed this error by following some steps. Switch to postgres user

$ sudo su - postgres 

it will ask for password and by default password is postgres

After switch the user to postgres, open psql console

$ psql 

so check the version of postgres if multiple versions are available

psql=# select VERSION(); PostgreSQL 9.1.13 on x86_64-unk.... # so version is 9.1 

Now Open postgres user

vim /etc/postgresql/9.1/main/pg_hba.conf 

9.1 is version return form upper command

and replace

local all postgres peer 

to

local all postgres md5 

Restart the service

sudo service postgresql restart 

I write steps on my blog also

http://tarungarg402.blogspot.in/2014/10/set-up-postgresql-on-ubuntu.html

2 Comments

You have given right answer, only missed one thing you do not need to check the version. You can change the password by running this command after psql Alter user "username" set password 'xyz';
Remember that md5 authentication requires a non-null password for your database user (just got bit by that today while trying to maximize laziness when creating a a Rails application).
6

Adding host: localhost was the magic for me

development: adapter: postgresql database: database_name_here host: localhost username: user_name_here 

Comments

5

You can go to your /var/lib/pgsql/data/pg_hba.conf file and add trust in place of Ident It worked for me.

local all all trust host all 127.0.0.1/32 trust 

For further details refer to this issue Ident authentication failed for user

1 Comment

Centos 6.6, try: /var/lib/pgsql/9.2/data/pg_hba.conf
3

I also faced this same issue while working in my development environment, the problem was that I left host: localhost commented out in the config/database.yml file.

So my application could not connect to the PostgreSQL database, simply uncommenting it solved the issue.

development: <<: *default database: database_name username: database_username password: database_password host: localhost 

That's all.

I hope this helps

Comments

0

If you get that error message (Peer authentication failed for user (PG::Error)) when running unit tests, make sure the test database exists.

Comments

0

In my case i was missing host: localhost in:

development: host: localhost 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.