【问题标题】:Vagrant, VirtualBox, Capistrano, db:migrate - could not connect to serverVagrant、VirtualBox、Capistrano、db:migrate - 无法连接到服务器
【发布时间】:2012-09-05 15:42:14
【问题描述】:

我刚刚完成了“部署 Rails”一书的工作,但我卡在 capaistrano 调用 db:migrate 的地方。

我已经设置了两个虚拟机 - 应用程序和数据库 - 它们每个都可以完美地分开工作。 虚拟机应用程序托管在 nginx/unicorn 和虚拟机数据库托管 PostgreSQL。 我可以“vagrant ssh”进入虚拟机,一切看起来都不错。

这是我定义了两个虚拟机的 Vagrant 文件(我使用的是 Vagrant 版本 1.0.3):

Vagrant::Config.run do |config|

  config.vm.define :app do |app_config|
    app_config.vm.customize ["modifyvm", :id, "--name", "app", "--memory", "512"]
    app_config.vm.box = "lucid64_rb193_pp2719"
    app_config.vm.host_name = "app"
    app_config.vm.forward_port 22, 2200, :auto => true
    app_config.vm.forward_port 80, 8080
    app_config.vm.network :hostonly, "33.33.13.37"
    app_config.vm.share_folder "puppet", "/etc/puppet", "../log4job_ops"
  end

  config.vm.define :db do |db_config|
    db_config.vm.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
        db_config.vm.box = "lucid64_rb193_pp2719"
        db_config.vm.host_name = "db"
        db_config.vm.forward_port 22, 2201, :auto => true
        db_config.vm.forward_port 5432, 5432
        db_config.vm.network :hostonly, "33.33.13.38"
        db_config.vm.share_folder "puppet", "/etc/puppet", "../log4job_ops"
  end
end

如您所见,发送到端口 8080 的数据被转发到应用程序 VM 的端口 80,效果非常好。

当 PostgreSQL 监听端口 5432 时,我设置了 4532(Host)->4532(VM) 的端口转发。

但是,当运行“cap deploy:cold”或“cap deploy:migrate”时,它会收到以下错误消息(cap deploy:migrate):

  * executing `deploy:migrate'
  * executing "ls -x /var/log4job/releases"
    servers: ["localhost"]
    [localhost] executing command
    command finished in 37ms
  * executing "cd /var/log4job/releases/20120905140228 && bundle exec rake RAILS_ENV=production  db:migrate"
    servers: ["localhost"]
    [localhost] executing command
*** [err :: localhost] rake aborted!
*** [err :: localhost] could not connect to server: Connection refused
*** [err :: localhost] Is the server running on host "localhost" and accepting
*** [err :: localhost] TCP/IP connections on port 5432?
*** [err :: localhost] could not connect to server: Connection refused
*** [err :: localhost] Is the server running on host "localhost" and accepting
*** [err :: localhost] TCP/IP connections on port 5432?
*** [err :: localhost] 
*** [err :: localhost] Tasks: TOP => db:migrate => environment
*** [err :: localhost] (See full trace by running task with --trace)
    command finished in 4128ms
failed: "sh -c 'cd /var/log4job/releases/20120905140228 && bundle exec rake RAILS_ENV=production  db:migrate'" on localhost

问题:

  1. 我做错了什么?

  2. “rake db:migrate”命令是否在 VM“app”上运行。 我假设,由于项目源代码部署到 /var/log4job/releases/20120905140228

  3. 如果我在上面 nr 2 的假设是正确的,难怪它不起作用。 PostgreSQL 在虚拟机“db”上运行。但是你到底是如何设置这种类型的服务的呢? 我在database.yml中配置的数据库连接是否错误。

这是database.yml的生产部分:

production:
  adapter: postgresql
  template: template0
  username: log4jobuid
  password: log4jobpwd
  database: wl_prod
  host: localhost
  encoding: unicode
  port: 5432

舒尔。它说它应该听“localhost”;-) 但是我如何配置它,以连接到另一个 VM(“db”VM)?

欢迎任何提示! 谢谢!

【问题讨论】:

    标签: ruby-on-rails capistrano vagrant dbmigrate


    【解决方案1】:

    好的,我明白了!

    找到答案的最佳方法是写下问题;-)

    我犯的错误都在database.yml中

    应该是这样的:

    production:
      adapter: postgresql
      template: template0
      username: log4jobuid
      password: log4jobpwd
      database: wl_prod
      host: 33.33.13.38
      encoding: unicode
      port: 5432
    

    “主机:”的 IP 地址应该是 DB VM 的 Vagrant 文件中规定的 IP 地址:

    db_config.vm.network :hostonly, "33.33.13.38"
    

    现在我们知道,您可以从例如使用虚拟机的 IP 地址将一个虚拟机“应用程序”转换为另一个虚拟机“数据库”。

    您还应该确保,您说明数据库的正确数据库名称、用户和密码。就我而言,我让 puppet 创建数据库,所以我在两边都使用相同的设置(现在 ;-)

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2017-06-12
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多