Capistrano - 部署 Rails 应用到暂存

Capistrano - deployment Rails app to Staging

我在生产环境中有一个 Rails 应用程序,我想在推出生产环境之前使用 Capistrano 将我的应用程序部署到暂存区,以便我的团队在不同的主机上制作应用程序的副本这应该充当暂存。我有 2 个独立的 Capistrano 环境设置,一个用于生产,另一个用于暂存。它们实际上只是服务器的IP地址不同,其余的都是相同的标准设置。

我还添加了 config/evironments/staging.rb 文件,它与 config.environments/production.rb 非常相似,唯一的区别是

config.action_controller.asset_host

因为在登台时我需要从登台主机加载资产。

config/environments/production.rb

config.action_controller.asset_host = "my_production_host"

config/environments/staging.rb

config.action_controller.asset_host = "my_staging_host"

但在我执行 bundle exec cap staging deploy 并检查浏览器控制台后,我可以看到一个错误 404 Failed to load resource 并且由于某种原因它指向生产主机资产。 404 Failed to load resource

<link rel="stylesheet" media="all" href="https://my_prduction_host/assets/application-7d22d41de3a16146e566368364a8b2c769a9ebd68d1333e71d624250fa2fd187.css" />

所以它似乎没有读我的 config/environments/staging.rb

config/deploy/staging.rb

server "1.2.3.4", user: "my_user", roles: %w{app db web}, port: 50022

set :stage, :staging
set :rails_env, :staging

Capistrano 日志显示 current release: current (production)

config/environments/staging.rb 已添加到存储库中,为什么它不读取我的暂存配置?我错过了什么?知道为什么 运行 应用处于生产模式吗?

更新

Capistrano 没有设置 RAILS_ENV,您可能需要在应用程序服务器级别配置它,例如:

 root /home/www/public/app-name/current/public;
 passenger_ruby /home/app-name/.rbenv/shims/ruby;
 passenger_app_env staging;
 passenger_enabled on;

(这里是Passenger+nginx的配置,其他app也会有类似的设置)

这里 passenger_app_env 告诉 Passenger 在使用暂存环境时加载应用程序。

您应该在暂存服务器上添加 RAILS_ENV 环境变量。有关详细信息,请参阅此处:https://askubuntu.com/a/58828/369247

To set variable only for current shell: VARNAME="my value" To set it for current shell and all processes started from current shell: export VARNAME="my value" # shorter, less portable version To set it permanently for all future bash sessions add such line to your .bashrc file in your $HOME directory.

我想通了。我必须将 rails_env staging; 添加到 /etc/nginx/sites-available/my_site 并重新启动 Nginx。