Я просто хотел сначала сказать, что я чувствую твою боль. Недавно я был новичком в Rails 3 + Heroku + Amazon RDS. Но сегодня вечером я преодолел проблему и сразу же попал в Stack Overflow, чтобы дать знать другим, у кого были проблемы, как. Я напишу об этом позже.
Некоторое из этого, вы можете пропустить, но я постараюсь быть исчерпывающим в своем ответе здесь, включая шаги, которые вам нужно предпринять, а также ошибки и проблемы, с которыми я столкнулся.
Принято # 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
Принято # 2: Мое приложение задохнулось даже после установки гема 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's 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
Решение: Я удалил гем mysql2 с помощью gem uninstall mysql2
, а затем изменил строку в моем гемфайле так:
gem 'mysql2', '< 0.3'
При этом была установлена версия mysql2 версии 0.2.7, которая также успешно установлена на Heroku.
Принято № 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:password@dbInstanceName.hostname.us-east-1.amazonaws.com/databaseName
(вы можете найти часть "dbInstanceName.hostname.us-east-1.amazonaws.com" этого URL в вашей панели конфигурации AWS, нажав на базу данных, которую вы используете)
Это должно быть сделано с помощью инструмента командной строки, и его нельзя добавить с помощью графического интерфейса надстроек RDS на веб-панели управления, поскольку Heroku не примет его в качестве действительного URL-адреса БД.
Принято № 4: Неправильные настройки безопасности не возвращают информативные или полезные ошибки.
Решение: Убедитесь, что вы добавили группу безопасности в свою конфигурацию RDS, чтобы позволить Heroku получить доступ к вашему экземпляру RDS, и добавили эту группу безопасности к вашему экземпляру. Для помощи CLI в этом вы можете просмотреть документы RDS на Heroku или войти в консоль AWS и сделать это:
- Нажмите на вкладку RDS вверху.
- Нажмите на Группы безопасности БД в левом столбце
- Нажмите «Создать группу безопасности БД»
- Введите имя и описание (например: Имя: Heroku, Описание: Разрешить доступ Heroku! ")
- На нижней панели с выбранной новой группой создайте новую авторизацию, выбрав в раскрывающемся списке «Группа безопасности EC2».
- Для группы безопасности введите: «по умолчанию» и идентификатор учетной записи AWS, введите: «098166147350» (Это важно; этот номер учетной записи принадлежит Heroku, и для его работы он должен быть добавлен в группу безопасности по умолчанию. )
- Нажмите «Добавить»
- Внимание! Измените существующую базу данных и добавьте в нее новую группу безопасности.
Итак, подведем итоги, если вы:
- Установлена правильная версия gem mysql2 (<0.3) </li>
- Настройте свою конфигурацию heroku для использования адаптера mysql2, правильно установив DATABASE_URL.
- и обеспечил Heroku доступ к вашей RDS, создав соответствующую группу безопасности в AWS RDS и добавив эту группу безопасности в вашу базу данных,
Теперь вы сможете использовать RDS с вашим приложением Rails 3 на heroku. :)