【问题标题】:Capistrano Rails deployment with Nginx and Passenger: database credentials being ignoredCapistrano Rails 部署与 Nginx 和Passenger:数据库凭据被忽略
【发布时间】:2015-05-04 22:23:48
【问题描述】:

我正在尝试使用 Capistrano 3 在 EC2 实例上部署我的第一个 Rails 4 应用程序。我已经学习了几个关于如何在 Ubuntu 上使用 Nginx 和Passenger 设置 Web 服务器的教程。我还有一个用于 MySQL 数据库的 RDS 实例。但是当我尝试运行cap deploy 时,它在assets:precompile 阶段给我一个错误:

INFO [d5d05621] Running ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile as deploy@[EC2 PUBLIC IP]
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@[EC2 PUBLIC IP]: rake exit status: 1
rake stdout: Nothing written
rake stderr: rake aborted!
Mysql2::Error: Access denied for user 'root'@'[EC2 PRIVATE IP]' (using password: NO)

据我了解,它正在尝试使用来自开发环境的凭据连接到本地主机上的数据库。

这是我的database.yml 文件的样子:

development:
    adapter: mysql2
    encoding: utf8
    pool: 5
    socket: /tmp/mysql.sock
    username: root
    password:
    database: Store_development

production:
    adapter: mysql2
    encoding: utf8
    database: Store_production
    username: <%= ENV['STORE_DATABASE_USERNAME'] %>
    password: <%= ENV['STORE_DATABASE_PASSWORD'] %>
    host: [RDS INSTANCE ENDPOINT]
    port: 3306
    pool: 5
    timeout: 5000

我到处寻找可以指定环境的所有地方,最后我得到了这样的东西。在我的deploy/production.rb 我有:

set :stage, :production
set :rails_env, :production

我的服务器上/etc/nginx/nginx.confhttp 部分也有这个:

passenger_app_env production;

这在/etc/nginx/sites-available的虚拟主机配置中

passenger_enabled on;
rails_env production;

最后我在部署用户的.bashrc 中有这个:

export RAILS_ENV=production

我是否缺少使部署适用于生产环境并使用 database.yml 文件中的凭据连接到 RDS 实例的东西?还是别的什么?

【问题讨论】:

    标签: ruby-on-rails nginx capistrano passenger capistrano3


    【解决方案1】:

    确保 STORE_DATABASE_USERNAME 和 STORE_DATABASE_PASSWORD 环境变量已在服务器上设置并且对您的 Rails 应用程序可见。当您通过 SSH 连接到 EC2 实例并运行以下命令时,您是否获得了预期值?

    echo $STORE_DATABASE_USERNAME
    echo $STORE_DATABASE_PASSWORD
    

    如果没有,请将这些的导出添加到部署用户的.bashrc

    export STORE_DATABASE_USERNAME=< your username >
    export STORE_DATABASE_PASSWORD=< your password >
    

    【讨论】:

    • 是的,echo $STORE_DATABASE_USERNAME 会打印预期值,密码也是如此。我在.bashrc 中添加了导出,并在虚拟主机配置中使用passenger_env_var STORE_DATABASE_USERNAME [password]; 设置了它们,但仍然出现错误。
    • 您的 database.yml 是否已签入存储库,或者您在部署期间是否在服务器上有一个共享副本,该副本被符号链接到当前目录?听起来文件没有符号链接或共享副本设置不正确。
    • 一开始我使用符号链接选项,我在shared/config 目录中手动创建了database.yml 文件。但是在我也尝试不使用符号链接选项之后,它是一样的。 database.yml 已签入我的 git 存储库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多