【问题标题】:Setting up secret_key_base on deploy with Capistrano 3使用 Capistrano 3 在部署时设置 secret_key_base
【发布时间】:2015-02-13 08:54:08
【问题描述】:

因此,我正在将一个运行在 Apache 和 Phusion Passenger 上的 Rails 4 应用程序部署到 DigitalOcean 上托管的 Ubuntu droplet。部署后,由于 Rails 生产没有找到用于生产的 secret_key_base 令牌,我得到了 500 个。但是,如果我运行echo $SECRET_KEY_BASE,它会返回由我的 deploy.rb 生成的 rake secret。

设置它的 deploy.rb 任务是:

namespace :deploy do
  task :start do ; end
  task :stop do ; end

  desc "Setup ENV variables"
  task :env_vars do
    on "root@xxx.xxx.xxx.xx" do
      execute "export SECRET_KEY_BASE=#{`bundle exec rake secret`}"
    end
  end
end

before "deploy", "deploy:env_vars"

但是,Rails 仍然没有接受它。我什至通过 ssh 连接到我的服务器并在 rails console 中进行了检查,ENV["SECRET_KEY_BASE"] 返回了正确的秘密令牌。

我认为使用 Capistrano 的 :default_env 会起作用,但这似乎只是为部署任务设置环境变量,而不是实际上在服务器上。有没有简单的方法来解决这个问题?我的后备方案是将秘密放在 secrets.yml 中,因为 repo 是私有的,但我宁愿不这样做。

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    这个任务有一个宝石: https://github.com/capistrano-plugins/capistrano-secrets-yml

    安装

    将此添加到 Gemfile:

    group :development do
      gem 'capistrano', '~> 3.2.1'
      gem 'capistrano-secrets-yml', '~> 1.0.0'
    end
    

    然后:

    $ 捆绑安装

    设置和使用

    make sure your local config/secrets.yml is not git tracked. It should be on the disk, but gitignored.
    

    在本地 config/secrets.yml 中填充生产机密:

    production:
      secret_key_base: d6ced...
    

    添加到 Capfile:

    require 'capistrano/secrets_yml'
    

    通过执行此任务在远程服务器上创建 secrets.yml 文件:

    $ bundle exec cap production setup
    

    您现在可以继续执行其他部署任务。

    【讨论】:

    • 您好,我很困惑,在按照指南gorails.com/deploy/ubuntu/18.04 进行了几次“上限生产部署”之后,我有三个文件夹(共享的版本库)和几个以日期时间为名称的版本。我尝试按照您的指南进行操作,但它仍然显示“‘生产’环境缺少 secret_key_base,请将此字符串设置为 rails credentials:edit
    【解决方案2】:

    您可以在shared/config 中的服务器中创建一个名为application.yml 的文件。

    从下面选择任何一种解决方案

    deploy.rb 中的以下代码将自动符号链接您的application.yml

    set :linked_files, %w{config/application.yml}
    

    或者

    然后通过简单的 capistrano 任务将此 application.yml 与您的 current/config/application.yml 符号链接。

    【讨论】:

      【解决方案3】:

      不是在 deploy.rb 中导出环境变量,而是在 rails 启动时使用dotenv 将环境变量从.env[.<staging>] 加载到 ENV 中。

      按照以下步骤操作:

      将此行添加到 Gemfile 的顶部:

      gem 'dotenv-rails'
      

      .env.production文件放入linked_filedeploy/production.rb:

      set :linked_files, fetch(:linked_files, []).push('.env.production')
      

      在远程主机上,将.env.production 文件添加到包含此行的shared 文件夹中:

      SECRET_KEY_BASE=<Your secret>
      

      【讨论】:

        【解决方案4】:

        放弃环境变量,只需读取文件即可。在 secrets.yml 中执行此操作。

        production:
          secret_key_base: <%= File.read('/home/me/SECRET_KEY_BASE').strip %>
        

        然后制作秘密文件。

        $ rake secret > ~/SECRET_KEY_BASE
        

        在确定此解决方案之前,我尝试从我的 .bash_profile、.profile 和 .bashrc(顶部和底部)导出密钥。我还尝试了 PermitUserEnvironment 和 .ssh/environment。我不知道环境变量如何从“环境”进入 capistrano 部署。我运行了 ssh example.com printenv 并看到了我的变量。我登录并看到了我的变量。但是 puma 是从 capistrano 开始的……它总是有自己的环境。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 2014-10-21
          • 2011-06-08
          • 1970-01-01
          • 2022-12-16
          • 2015-07-22
          • 2015-03-07
          相关资源
          最近更新 更多