#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