Ответ 2
Я просто хотел сначала сказать, что чувствую твою боль. Недавно я был новичком Rails 3 + Heroku + Amazon RDS. Но сегодня я победил эту проблему и сразу попал в Stack Overflow, чтобы другие, у кого были проблемы, знали, как это сделать. Я расскажу об этом позже.
Некоторые из этого, вы можете пропустить, но я постараюсь быть исчерпывающим в моем ответе здесь, включая шаги, которые вам нужно предпринять, а также проблемы и проблемы, с которыми я столкнулся.
Gotcha # 1: Heroku не может установить gem mysql2 со следующей ошибкой:
You have added to the Gemfile:
* mysql2
FAILED: http://devcenter.heroku.com/articles/bundler
! Heroku push rejected, failed to install gems via Bundler
Решение: Я почти всегда использую PostgreSQL для чего-то требующего, над которым я работаю, для песочниц и экспериментов, я просто использую SQLite3 для быстрого и быстрого ввода. Реальная проблема заключалась в том, что я не запускал MySQL на своей локальной машине. Когда я вернулся и попытался запустить bundle install
локально, естественно, установка gem завершилась неудачно, потому что не удалось найти библиотеки mysql. Я уверен, что есть способ обойти это, но я просто ударил пулю и установил mysql локально. Впоследствии я смог запустить bundle install
без проблем. Кроме того, git push heroku master
нажал приложение на Heroku без сбоев:
Installing activerecord (3.0.6)
Installing activeresource (3.0.6)
>>>>Installing mysql2 (0.3.2) with native extensions<<<<
Using bundler (1.0.7)
Installing thor (0.14.6)
Installing railties (3.0.6)
Installing rails (3.0.6)
Installing sqlite3 (1.3.3) with native extensions
Your bundle is complete! It was installed into ./.bundle/gems/
Compiled slug size is 3.9MB
-----> Launching... done
http://myapp.heroku.com deployed to Heroku
Gotcha # 2: Мое приложение забилось, даже после установки gem mysql2. heroku logs
показал:
RuntimeError (!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'):
Что? Я просто добавил это в свой gemfile, совершил его и успешно продвинул! Я действительно думал, что кто-то играет против меня шуткой. Небольшое исследование и вождение показали, что возвращается heroku rake db:migrate
:
WARNING: This version of mysql2 (0.3.2) doesn't ship with the ActiveRecord adapter bundled anymore as it now part of Rails 3.1
WARNING: Please use the 0.2.x releases if you plan on using it in Rails <= 3.0.x
Решение: Я удалил gem mysql2 с помощью gem uninstall mysql2
, а затем изменил строку в моем gemfile, чтобы прочитать:
gem 'mysql2', '< 0.3'
Это установило версию мозаики mysql2 версии 0.2.7, которая также успешно установлена на Heroku.
Gotcha # 3: После установки правильной версии драгоценного камня mysql2, heroku rake db:migrate
все равно вернул ту же ошибку:
rake aborted!
!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'
Хорошо, поэтому я сделал еще несколько исследований и нашел этот поток, который в основном сказал мне, что адаптер пытался использовать "mysql" вместо адаптера "mysql2".
Решение:. Чтобы обойти это, вручную установите DATABASE_URL
в heroku config
для использования mysql2://
, выполнив следующее:
heroku config:add DATABASE_URL=mysql2://user:[email protected]/databaseName
(вы можете найти часть этого URL-адреса "dbInstanceName.hostname.us-east-1.amazonaws.com" на вашей панели настроек AWS, нажав на используемую вами базу данных)
Это нужно сделать с помощью средства командной строки и не может быть добавлено с помощью графического интерфейса RDS Add-on на веб-панели управления, потому что Heroku не будет принимать его как действительный URL-адрес db.
Gotcha # 4: Неправильные конфигурации безопасности не возвращают информационных или полезных ошибок.
Решение.. Убедитесь, что вы добавили группу безопасности в свою конфигурацию RDS, чтобы позволить Heroku получить доступ к вашему экземпляру RDS и добавить эту группу безопасности в ваш экземпляр. Для справки CLI вы можете просмотреть RDS-документы на Heroku или войти в свою консоль AWS и сделать это:
- Нажмите вкладку RDS вверху.
- Нажмите на группы безопасности БД в левом столбце
- Нажмите "Создать группу безопасности БД"
- Введите имя и описание (например: Имя: Heroku, Описание: Разрешить доступ к Heroku!)
- На нижней панели с выбранной новой группой создайте новую авторизацию, выбрав "Группа безопасности EC2" в раскрывающемся списке.
- Для группы безопасности введите: "default" и идентификатор учетной записи AWS, введите: "098166147350" (это важно, этот номер учетной записи принадлежит Heroku, и он должен быть добавлен в группу безопасности по умолчанию для работы. )
- Нажмите "Добавить"
- ВАЖНО! Измените существующую базу данных и добавьте к ней новую группу безопасности.
Итак, чтобы повторить, если у вас есть:
- Установлена правильная версия gem mysql2 (< 0,3)
- Установите конфигурацию heroku для использования адаптера mysql2, правильно установив DATABASE_URL.
- и гарантировал, что Heroku имеет доступ к вашему RDS, создав соответствующую группу безопасности в AWS RDS и добавив эту группу безопасности в вашу базу данных,
Теперь вы можете использовать RDS с вашим приложением Rails 3 на heroku.:)