Невозможно подключиться к удаленной базе данных, используя ssh туннель и activerecord - PullRequest
3 голосов
/ 10 декабря 2010

У меня возникли проблемы со следующим сценарием:

require 'rubygems'
require 'active_record'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
puts "true" if gateway.active?
p = gateway.open('127.0.0.1', 3306, 3307)

class MyClass < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql",
    :host     => "127.0.0.1",
    :username => "db_user",
    :password => "db_pass",
    :database => "mydb_production",
    :port     => 3307
  )
end

puts MyClass.all.size

gateway.shutdown!

Когда я запускаю сценарий, он просто зависает, если я не удаляю запрос activerecord.Я знаю, что могу подключиться, используя туннелирование, потому что я могу создать туннель из команды, например, так:

ssh -f myuser@myserver.com -L 3307/127.0.0.1/3306 -N

Тогда, если я запусту:

require 'rubygems'
require 'active_record'

class MyClass < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql",
    :host     => "127.0.0.1",
    :username => "db_user",
    :password => "db_pass",
    :database => "mydb_production",
    :port     => 3307
  )
end

puts MyClass.all.size

Это работает нормально.Что я делаю не так?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 28 марта 2012

Я смог заставить это работать без форка, используя gem mysql2

require 'rubygems'
require 'active_record'
require 'mysql2'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(
  'remotehost.com',
  'username'
)
port = gateway.open('127.0.0.1', 3306, 3307)

class Company < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql2",
    :host     => "127.0.0.1",
    :username => "dbuser",
    :password => "dbpass",
    :database => "dbname",
    :port     => 3307
  )
end
puts Company.all.size
2 голосов
/ 12 марта 2011

Я думаю, что комментарий правильный - БД конфликтует с циклом событий в коде ssh.

Попробуйте это:

  require 'rubygems'
  require 'active_record'
  require 'net/ssh/gateway'

  gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
  puts "true" if gateway.active?
  port = gateway.open('127.0.0.1', 3306, 3307)
  fork.do
    class MyClass < ActiveRecord::Base
      establish_connection(
        :adapter  => "mysql",
        :host     => "127.0.0.1",
        :username => "db_user",
        :password => "db_pass",
        :database => "mydb_production",
        :port     => 3307
      )
    end

    puts MyClass.all.size
  end  

  Process.wait

  gateway.shutdown!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...