Heroku — проблема с переходом с Sqlite на Postgres

#ruby-on-rails #postgresql #heroku #gem #bundler

#ruby-on-rails #postgresql #heroku #драгоценный камень #bundler

Вопрос:

Я создал приложение Rails со встроенной базой данных SQLITE 3. Я уже некоторое время пытаюсь развернуть приложение на Heroku. Я понял, что предпочтительной базой данных Heroku является Postgres, поэтому я столкнулся с проблемой изменения базы данных моего приложения с SQLITE на postgres.

Вот мой Gemfile, в котором указано, что теперь у меня установлен ‘pg’ вместо sqlite.

 source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
ruby '2.1.0'
gem 'rails', '4.1.1'

group :development, :test do
  gem 'pg', '0.17.1'
  gem 'rspec-rails', '3.0.1'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
end

gem 'sass-rails', '~> 4.0.2'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'sprockets-rails', '~> 2.1.3'
gem 'bootstrap-sass', '3.1.1.1'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.1.1'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]
  

В последнее время я много раз устанавливал gem pg, чтобы убедиться, что он установлен. Запуск psql —version дает мне следующее

 psql (PostgreSQL) 9.3.4
  

Запуск какого psql показывает мне каталог

 /usr/local/bin/psql
  

При преобразовании из SQLite в Postgres я обновил свой файл database.yml как мог.

 # SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
development:
  adapter: postgresql
  encoding: unicode
  database: games_development
  pool: 5
  timeout: 5000
  host:  localhost

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: postgresql
  database: games_test
  pool: 5
  timeout: 5000

production:
  adapter: postgresql
  database: games_production
  pool: 5
  timeout: 5000
  

Как вы можете видеть, я изменил адаптер с sqlite3 на postgresql, как показано на веб-сайте Heroku Dev Center. Я назвал свою базу данных в следующем формате. appname_environement для трех сред

Я даже добавил host: localhost для среды разработки.

Вот результат, который я получаю при запуске cat pg_hba.conf

 # 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     edited                               trust
#host    replication     edited        127.0.0.1/32            trust
#host    replication     edited       ::1/128                 trust
  

Now I would like to describe my problem. I can deploy successfully to Heroku, but when running heroku open I received the following error message.

 Application Error

An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.
  

My next step was to run the heroku logs command.

 2014-06-19T16:14:31.269890 00:00 app[web.1]: => Booting WEBrick
2014-06-19T16:14:31.269894 00:00 app[web.1]: => Rails 4.1.1 application starting in production on http://0.0.0.0:36743
2014-06-19T16:14:31.269896 00:00 app[web.1]: => Run `rails server -h` for more startup options
2014-06-19T16:14:31.269898 00:00 app[web.1]: => Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
2014-06-19T16:14:31.269899 00:00 app[web.1]: => Ctrl-C to shutdown server
2014-06-19T16:14:31.269901 00:00 app[web.1]: Exiting
2014-06-19T16:14:32.519139 00:00 heroku[web.1]: State changed from starting to crashed
2014-06-19T16:14:32.507573 00:00 heroku[web.1]: Process exited with status 1
2014-06-19T16:17:43.026380 00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=lit-anchorage-9017.herokuapp.com request_id=d2e55388-dbe6-439e-bba5-2f3f18eb3744 fwd="24.14.65.222" dyno= connect= service= status=503 bytes=
  

Из того, что я могу понять из приведенного выше вывода, он начинается с запуска сервера WEBrick в процессе разработки. Я знаю, что мой драгоценный камень ‘pg’ находится в средах разработки и тестирования, как указано в моем Gemfile. Я думаю, что это может быть проблемой. Вывод than говорит о том, что сервер завершает работу со статусом 1. Последняя строка выделена золотом, что указывает на наличие проблемы.

Читая это сообщение об ошибке, я вижу код ошибки H10 с описанием «Сбой приложения». При продвижении вперед отображается код состояния 503, что указывает на проблему с сервером.

Я попытался запустить команду rake db: rollback для сброса базы данных.

 PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (fe80::1) and accepting
TCP/IP connections on port 5432?
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-  4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:881:in `initialize'
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:881:in `new'
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:881:in `connect'
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:568:in `initialize'
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `new'
/Users/edited/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `postgresql_connection'
  

Одна вещь, которую я сразу заметил, это то, что она указала на ошибку подключения, что не удалось подключиться к серверу. Я также заметил, что он указал порт 5432, когда общий порт для localhost равен 3000. Затем в сообщении был показан след проблемы, которая, по-видимому, в основном связана с connection_adapter / postgresql_adapter .

Приведенное выше сообщение об ошибке также отображается для rake db: migrate, rails c-sandbox, команд rails c и rails s.

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

Если быть до конца честным, я чувствую, что исчерпал все свои варианты. У меня нет выбора, кроме как задать этот вопрос здесь. Любые советы приветствуются.

Ответ №1:

Надеюсь, это решит проблему, с которой вы столкнулись..

Я заметил, что вы не указали драгоценный камень postgresql для производственной среды в вашем gemfile. Вы указали его только для сред разработки и тестирования.

Добавьте следующее в свой gemfile:

 group :production do
  gem 'pg'
  gem 'rails_12factor'
end
  

Драгоценный камень ‘rails_12factor’ включает такие функции, как статическое обслуживание ресурсов и ведение журнала в Heroku, поскольку они были удалены из Rails 4.

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

Этот ресурс также может помочь, если вышеуказанное не работает. Всего наилучшего!

https://devcenter.heroku.com/articles/getting-started-with-rails4

Комментарии:

1. Большое вам спасибо, я обновил gemfile в рабочей среде, и это сработало. Эта проблема доставила мне много хлопот

2. Не беспокойтесь, рад, что я смог помочь!

Ответ №2:

одна из возможностей. Вы устали запускать «rake assets:precompile RAILS_ENV=production —trace» в среде разработки, затем git add / commit перед отправкой в Heroku? — Pierre

Комментарии:

1. Это сработало, но теперь я столкнулся с другой проблемой. Когда я запускаю heroku open, я получаю сообщение «Извините, но что-то пошло не так». Я также запустил журналы heroku и получил сообщение «Сбой компиляции Slug. не удалось скомпилировать приложение Ruby.» Теперь, когда я упомянул об этом, я тоже больше не могу подключиться к серверу. Это должно быть как-то связано с моим файлом database.yml

2. Последняя проблема — я получаю это сообщение об ошибке, когда я испортил маршруты, а также если какое-либо кодирование приводит к сбою обновления базы данных. В процессе разработки вы можете увидеть ошибку в журналах, но приложение не завершается, как Heroku. Кроме того, всякий раз, когда вы меняете какой-либо из файлов javascripts, вы должны перекомпилировать его перед отправкой в Heroku

Ответ №3:

При загрузке в heroku с использованием rails версии 4.1.1 вам необходимо настроить производственную среду, используя предоставленную вами информацию. https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-ruby

Heroku заменяет файл database.yml для версий не выше 4.1, поэтому вам нужно настроить свои производственные данные, поскольку они автоматически генерируют базу данных для вас.

Чтобы проверить сведения о вашей базе данных: https://postgres.heroku.com/databases

    production: amp;production
   adapter: postgres://qrffxpnewoxxxxxxxxxxx
   host:  ec2-xxxxxxxxxxxxxxxxxxxxxxxxx
   database: db8qxxxxxxx
   port: 5432
   username: qrffxpxxxxxk
   password: G9CdRxxxxxxxxx