Я подключаюсь к удаленной базе данных через SSH-туннель внутри элемента Activerecord :: Base под названием Item.Ruby on Rails - подключиться к базе приложений после запроса SSH Tunnel
у меня есть:
require 'net/ssh/gateway'
require 'active_record'
require 'mysql2'
class Item < ActiveRecord::Base
self.table_name = "[table_name]"
@gateway = Net::SSH::Gateway.new(host, username)
@port = @gateway.open('127.0.0.1', 3306, 3309)
ActiveRecord::Base.establish_connection(
adapter: 'mysql2',
host: '127.0.0.1',
username: username,
password: password,
database: remote_db_name,
port: @port
)
Затем в контроллере можно успешно назвать, например Item.all
и извлечь все элементы из этой удаленной таблицы. Проблема заключается в том, что тогда я иду к другой точке зрения на приложение (я использую разработать для пользователей), и я получаю эту ошибку:
Mysql2::Error: Table '[remote_database_name].users' doesn't exist: SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1
Как подключить обратно в локальную базу данных? Я пробовал использовать @gateway.shutdown!
и @gateway.close(@port)
с методами от контроллера, но он не работает.
Это сработало отлично! Но теперь я развернул приложение Rails в Amazon EC2, и когда я пытаюсь подключиться, я получаю «Net :: SSH :: AuthenticationFailed», что странно, потому что я могу подключиться через SSH, используя консоль экземпляра EC2. – user3403959
Я предполагаю, что ваш сервер запускается другим системным пользователем, поэтому он имеет другой ключ ssh. Вы можете проверить это, выполнив 'ps u | grep your_server_name'. Например, если вы используете 'puma' в своем проекте:' ps u | grep puma'. Первый столбец вывода будет содержать имя пользователя. Сравните его с вашим именем пользователя. Кроме того, я думаю, вам лучше создать еще один вопрос с этой проблемой, чтобы эксперты-амазонки смогли вам помочь –