【问题标题】:Capistrano - deployment Rails app to StagingCapistrano - 将 Rails 应用程序部署到 Staging
【发布时间】:2019-04-27 12:02:44
【问题描述】:

我有一个用于生产的 Rails 应用程序,我想在推出生产环境之前使用 Capistrano 将我的应用程序部署到 Staging,因此我的团队在不同的主机上制作了该应用程序的副本,该应用程序应该充当 Staging。我有 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 部署日志吗?
  • 我正在使用Passenger + Nginx。我宁愿不粘贴部署日志,因为它包含敏感信息,例如 IP 地址等,但他们清楚地说应用程序出于某种原因在生产模式下运行。
  • 检查passenger_app_env 值。更多信息在这里:phusionpassenger.com/library/config/nginx/reference/…Passenger sets the default value to production.
  • 我在任何 nginx 配置文件中都没有看到 passenger_app_env var
  • 将它设置为在你的 nginx 配置文件中暂存。

标签: ruby-on-rails capistrano


【解决方案1】:

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的配置,其他应用也会有类似的设置)

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

【讨论】:

  • 这不起作用。实际上,它完全破坏了应用程序。部署后访问页面后出现502错误代码。
  • 很抱歉听到它破坏了应用程序。不确定您做错了什么,也许您复制了路径而没有更改它们以匹配您的情况,但是重要的行 passenger_app_env staging; 等同于 rails_env staging;,请参阅:phusionpassenger.com/library/config/nginx/reference/…
  • 是的,它没有用。起作用的是 rails_env staging;这不是我第一次在乘客网站上看到错误的文档。他们关于如何使用乘客安装 nginx 的整个教程是完全错误的,根本不起作用。
【解决方案2】:

您应该在暂存服务器上添加 RAILS_ENV 环境变量。更多信息请看这里:https://askubuntu.com/a/58828/369247

仅为当前 shell 设置变量: VARNAME="我的价值" 要将其设置为当前 shell 和从当前 shell 启动的所有进程: export VARNAME="my value" # 更短、更不便携的版本 要为所有未来的 bash 会话永久设置它,请将此行添加到 $HOME 目录中的 .bashrc 文件中。

【讨论】:

  • 那行不通。此外,Capistrano 没有提到应该手动设置 RAILS_ENV。他们实际上说要在 deploy/#{environment}.rb 文件中设置它。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多