Rails: FATAL - одноранговая аутентификация для пользователя не удалась (PG :: Error)

143

Я работаю над Ubuntu 11.10 и RubyMine

Вот мои настройки разработки для database.yml: который RubyMine создал для меня

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

Когда я пытаюсь запустить приложение, я получаю эту ошибку ниже, кажется, что я еще не создал пользователя проекта, но как я могу создать пользователя и предоставить ему базу данных в postgres? если это проблема, то какой инструмент рекомендуется использовать в Ubuntu для этой задачи? если это не проблема, то, пожалуйста, совет.

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
Симо
источник

Ответы:

315

Если вы установили postresql на своем сервере, то просто поместите: localhost to database.yml, я обычно добавляю его там, где говорится пул: 5. В противном случае, если это не localhost, определенно сообщите этому приложению, где найти его базу данных.

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

Убедитесь, что ваши учетные данные установлены правильно, создав базу данных и назначив права собственности на пользователя вашего приложения для установления соединения. Чтобы создать нового пользователя в postgresql 9, запустите:

sudo -u postgres psql

установите пароль пользователя postgresql, если у вас его нет, это просто пароль с обратной косой чертой.

postgres=# \password

Создайте нового пользователя и пароль и новую базу данных пользователя:

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

Теперь обновите файл database.yml после того, как подтвердите создание базы данных, пользователя, пароля и установите эти привилегии. Не забудьте host: localhost.

Бент Кардан
источник
2
если вам все еще не удается войти в систему и завершить соединение через localhost, затем вернитесь в postgresql через терминал и примените некоторые из этих 8.2 соглашений для установления привилегий подключаемого пользователя, синтаксис GRANT ALL ON DATABASE [dbname] - [usrname]. Этот синтаксис работает на psql 9+ точно так же, но вы, вероятно, можете переключать разрешения только для баз данных, принадлежащих пользователю, прежде чем он ВЫДАЕТ ВСЕ: postgresql.org/docs/8.2/static/sql-grant.html
Бент Кардан
38
host: localhostи pool: 5отсутствовал в моем конфиге. После их добавления ошибка исчезла.
Амит Патель
21
Для меня host: localhostне хватало. после того, как я добавил это, все работало. Это в Ubuntu 13.04
Джесси
7
Также важно подчеркнуть: НЕ ЗАБУДЬТЕ ПОЛУКОЛОНОВ .
Мартен
Лично я думаю, что важно иметь возможность запустить установку с помощью rake db: setup. В противном случае у вас возникнут проблемы с созданием новой среды развертывания, но это описание действительно подходит для среды разработки.
Эшли Райтери
54

Это самый надежный способ заставить ваше приложение rails работать с postgres в среде разработки. в Ubuntu 13.10.

1) Создайте приложение rails с помощью postgres YAML и gem 'pg' в Gemfile:

$ rails new my_application -d postgresql

2) Дайте ему некоторую функциональность CRUD. Если вы просто видите, работает ли postgres, создайте эшафот:

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

3) Начиная rails 4.0.1с -d postgresqlопции генерирует YAML, который не включает параметр хоста. Я обнаружил, что мне это нужно. Отредактируйте раздел разработки и создайте следующие параметры:

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

Обратите внимание, что databaseпараметр предназначен для базы данных, которая еще не завершена, а также usernameиpassword являются учетными данными для роли, которой еще не существует. Мы создадим их позже!

Вот как config/database.ymlдолжно выглядеть (не стыдно при копировании: 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) Запустите оболочку postgres с помощью этой команды:

$ psql

4a) Вы можете получить эту ошибку, если ваш текущий пользователь (как и пользователь вашего компьютера) не имеет соответствующей роли администратора postgres.

psql: FATAL:  role "your_username" does not exist

Сейчас я только один раз установил postgres, поэтому я могу ошибаться, но я думаю, что postgres автоматически создает роль администратора с теми же учетными данными, что и пользователь, с которым вы установили postgres.

4b) Таким образом, это означает, что вам нужно перейти к пользователю, который установил postgres, чтобы использовать команду psql и запустить оболочку:

$ sudo su postgres

А потом беги

$ psql

5) Вы будете знать, что находитесь в оболочке postgres, потому что ваш терминал будет выглядеть так:

$ psql
psql (9.1.10)
Type "help" for help.

postgres=# 

6) Используя синтаксис PostGreSQL, давайте создадим пользователя мы , указанные в config/database.yml«S развития раздела:

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

Здесь есть некоторые тонкости, так что давайте рассмотрим их.

  • Имя пользователя роли, thisismynewusername , не имеет кавычек.
  • Укажите ключевое слово LOGIN после WITH . Если вы этого не сделаете, роль все равно будет создана, но она не сможет войти в базу данных!
  • Пароль роли, isismynewpassword , должен быть в одинарных кавычках. Не двойные кавычки .
  • Добавьте точку с запятой в конце;)

Вы должны увидеть это в своем терминале:

postgres=#
CREATE ROLE
postgres=#

Это означает, что «РОЛЬ СОЗДАНА», но предупреждения postgres, похоже, принимают те же императивные соглашения git hub.

7) Теперь, все еще в оболочке postgres, нам нужно создать базу данных с именем, которое мы установили в YAML. Сделайте пользователя, которого мы создали на шаге 6, своим владельцем:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

Вы узнаете, добились ли вы успеха, потому что получите результат:

CREATE DATABASE

8) Закройте оболочку postgres:

\q

9) Теперь момент истины:

$ RAILS_ENV=development rake db:migrate

Если вы получите это:

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

Поздравляем, postgres отлично работает с вашим приложением.

9a) На моей локальной машине я получал ошибку разрешения. Я не могу вспомнить это точно, но это была ошибка в духе

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

Хотя я бы посоветовал очень внимательно подумать о рекурсивной настройке привилегий записи на производственном компьютере, локально я дал всем своим приложением права на чтение и запись, например, так:

9b) Поднимитесь на один уровень каталога:

$ cd ..

9c) Установите права доступа к каталогу my_application и всему его содержимому на 666:

$ chmod -R 0666 my_application

9d) И снова запустите миграцию:

$ RAILS_ENV=development rake db:migrate

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

Некоторые советы и хитрости, если вы испортили

Попробуйте это, прежде чем перезапустить все эти шаги:

Пользователь mynewusername не имеет прав на CRUD для my_app_development базы данных? Удалите базу данных и создайте ее снова с mynewusername в качестве владельца:

1) Запустите оболочку postgres:

$ psql

2) Удалить my_app_developmentбазу данных. Быть осторожен! Бросить означает совершенно удалить!

postgres=# DROP DATABASE my_app_development;

3) Создайте еще одну my_app_developmentи сделайте mynewusername владельцем:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4) Выйти из оболочки:

postgres=# \q

mynewusernameПользователь не может войти в базу данных? Кажется, вы написали неправильный пароль в YAML и не можете вспомнить пароль, который вы ввели с помощью оболочки postgres? Просто измените роль с помощью пароля YAML:

1) Откройте свой YAML и скопируйте пароль в буфер обмена:

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

2) Запустите оболочку postgres:

$ psql    

3) Обновление mynewusernameпароля. Вставьте пароль и не забудьте заключить его в одинарные кавычки:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4) Выйти из оболочки:

postgres=# \q

Пытаетесь подключиться к localhost через средство просмотра базы данных, такое как Dbeaver, и не знаете, какой пароль у вашего пользователя postgres? Измените это так:

1) Запуск passwdот имени суперпользователя:

$ sudo passwd postgres

2) Введите пароль своей учетной записи для sudo(ничего общего с postgres):

[sudo] password for starkers: myaccountpassword

3) Создайте новый пароль для учетной записи postgres:

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

Получаете это сообщение об ошибке ?:

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) Вы должны дать своему пользователю возможность создавать базы данных. Из оболочки psql:

ALTER ROLE thisismynewusername WITH CREATEDB
Старкерс
источник
1
Хотел бы я дать вам еще +1 с за это блестящее решение, я был бы еще счастливее, если бы он сработал для меня. все еще блестящий ответ. Небольшой вопрос, эти пометки вокруг пароля в другой роли? Кроме того, вам не нужно использовать backticks раньше, не так ли?
Майк HR
@ MikeH-R Спасибо, позор, это не работает для вас! Вы уверены, что ваш соответствующий YAML имеет host: localhost? Это было для меня настоящим хитом. Вокруг пароля вам нужны одинарные кавычки. На моей клавиатуре это shift+ @. С оболочкой psql вам нужны только одинарные кавычки вокруг некоторых параметров. Они нужны вам, например, вокруг пароля, а не имени роли. Честно говоря, это очень сложно, но хорошо, когда узнаешь, что это нюансы :)
Starkers
@ MikeH-R Я подправил свой ответ, чтобы прояснить ситуацию. Подумайте о том, чтобы иметь еще одну трещину в этом!
Старкерс
разобрался сейчас, еще раз спасибо за блестящий ответ, большинство других ответов, с которыми я столкнулся, касалось ослабления безопасности, которая явно не годится для производства.
Майк HR
29

Для постоянного решения:

Проблема в вашем pg_hba. Эта строка:

local   all             postgres                                peer

Должно быть

local   all             postgres                                md5

Затем перезапустите ваш сервер postgresql после изменения этого файла.

Если вы работаете в Linux, команда будет

sudo service postgresql restart
Сумит Мунот
источник
1
Спасибо! Это настоящий ответ.
skplunkerin
9

Я столкнулся с той же проблемой на компьютере с Ubuntu, поэтому я удалил эту ошибку, выполнив несколько шагов. Переключиться на пользователя postgres

$ sudo su - postgres

он запросит пароль и по умолчанию пароль postgres

После переключения пользователя на postgres откройте консоль psql

$ psql

поэтому проверьте версию postgres, если доступно несколько версий

psql=# select VERSION();

PostgreSQL 9.1.13 on x86_64-unk....         # so version is 9.1

Теперь откройте postgres user

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

9.1 является версией версии из верхней команды

и заменить

local   all             postgres                                peer

в

local   all             postgres                                md5

Перезапустите сервис

sudo service postgresql restart

Я также пишу шаги в своем блоге

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

Тарун Гарг
источник
Вы дали правильный ответ, пропустили только одну вещь, вам не нужно проверять версию. Вы можете изменить пароль, выполнив эту команду после того, как psql Alter user "username" установит пароль 'xyz';
Вишу
Помните, что для md5аутентификации требуется ненулевой пароль для пользователя вашей базы данных (сегодня это стало немного утомительным при попытке максимизировать лень при создании приложения Rails).
Марк Лейтон Фишер
5

Вы можете перейти к своему файлу /var/lib/pgsql/data/pg_hba.conf и добавить доверие вместо идентификатора. У меня это сработало.

local   all all trust
host    all 127.0.0.1/32    trust

Для получения дополнительной информации обратитесь к этой проблеме. Идентификационная идентификация не удалась для пользователя.

Rastee
источник
Centos 6.6, попробуйте:/var/lib/pgsql/9.2/data/pg_hba.conf
Патрик
4

Добавление host: localhostбыло волшебством для меня

development:
  adapter: postgresql
  database: database_name_here
  host: localhost
  username: user_name_here
ispirett
источник
0

Если вы получаете это сообщение об ошибке ( Peer authentication failed for user (PG::Error)) при запуске модульных тестов, убедитесь, что тестовая база данных существует.

Дэвид Винецки
источник
0

Я также столкнулся с этой же проблемой, работая в моей среде разработки, проблема заключалась в том, что я оставил host: localhostкомментарий вconfig/database.yml файле.

Таким образом, мое приложение не может подключиться к базе данных PostgreSQL, просто раскомментировав это, решило проблему.

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

Вот и все.

надеюсь, это поможет

Обещание Престон
источник