使用新的env变量刷新.bashrc

时间:2015-06-12 15:17:47

标签: ruby-on-rails nginx environment-variables

我有一个运行我们的rails app的生产服务器,我们在那里有ENV变量,格式正确。它们出现在rails c中,但我们遇到了一个问题,即在应用实例中识别它们。

在ubuntu盒子上运行puma,nginx。 每次我们更改.bashrc时需要重新启动什么?这就是我们的工作: 1.编辑.bashrc 2. . .bashrc 3.重启美洲狮 4.重新启动nginx

仍未被识别..但在rails c中,我们缺少什么?

编辑: 根据来自其他帖子的建议添加了/etc/environment的env变量,其中.bashrc仅针对特定的shell会话,这可能会产生影响。据说/etc/environment可供所有用户使用,所以这是我的。仍然有同样的问题:

  1. 在rails c
  2. 中显示正常
  3. 当我在shell中回显它们时显示正常
  4. 不要出现在应用程序中

    export G_DOMAIN=sandboxbaa3b9cca599ff0.mailgun.org
    export G_EMAIL=mailgun@sandboxbaa3ba3806d5b499ff0.mailgun.org
    export GEL=support@xxxxxx.com
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    
  5. 编辑:

    在应用程序中,我在普通html中请求G_DOMAING_EMAIL(这适用于使用dotenv进行开发,使用ubuntu服务器推送到生产服务器后无效):

          ENV TEST<BR>
          G_DOMAIN: <%= ENV['G_DOMAIN'] %><br>
          G_EMAIL:<%= ENV['G_EMAIL'] %>
    

    但是,可以使用以下env变量(在.bashrc和/ etc / environment中,与我们上面显示的所有变量相同)因为我们的图像工作正常并且在生产时上传到s3没有问题。

    production.rb

      # Configuration for Amazon S3
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['AWS_ACCESS_KEY_ID'],
      :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    

    edit2:这可能与这个美洲狮问题有关吗?

    https://github.com/puma/puma/commit/a0ba9f1c8342c9a66c36f39e99aeaabf830b741c

1 个答案:

答案 0 :(得分:5)

我也有这样的问题。对我来说,这只有在我添加一个新的环境变量时才会发生。

通过this post,经过一些谷歌搜索后,我逐渐明白Puma的restart命令(通过gem capistrano-puma)可能看不到新的环境变量,因为这个过程重新启动时自行分叉,而不是自杀并重新启动(这是在部署期间保持服务器响应的一部分)。

链接帖子建议使用仅存储在生产服务器上的YAML文件(读取:不在源代码管理中),而不是依赖于部署用户的环境变量。这就是你如何实现它:

  1. 在Rails应用的config/application.rb文件中插入此代码:
  2. config.before_configuration do
      env_file = File.join(Rails.root, 'config', 'local_env.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value
      end if File.exists?(env_file)
    end
    
    1. 将此代码添加到您的Capistrano部署脚本(config/deploy.rb
    2.   desc "Link shared files"
        task :symlink_config_files do
          on roles(:app) do
            symlinks = {
              "#{shared_path}/config/local_env.yml" => "#{release_path}/config/local_env.yml"
            }
            execute symlinks.map{|from, to| "ln -nfs #{from} #{to}"}.join(" && ")
          end
        end
      
        before 'deploy:assets:precompile', :symlink_config_files
      
      1. 的利润!使用1中的代码,您的Rails应用程序会将您在服务器的Capistrano目录的./shared/config/local_env.yml文件中定义的任何键加载到ENV哈希中,这将在其他配置文件之前发生,例如{已加载{1}}或secrets.ymldatabase.yml中的代码可确保服务器上2中的文件在每次部署时都符号链接到./shared/config/current/config/中的代码所需的代码)。< / LI>

        示例local_env.yml:

        1

        示例SECRET_API_KEY_DONT_TELL: 12345abc6789 OTHER_SECRET_SHH: hello

        secrets.yml

        通过不使用环境变量,这将保证找到您的环境变量。似乎是一种解决方法,但基本上我们只是将production: secret_api_key: <%= ENV["SECRET_API_KEY_DONT_TELL"] %> other_secret: <%= ENV["OTHER_SECRET_SHH"] %> 对象用作方便的全局变量。

        (capistrano的语法可能有点老了,但是这里的Rails 5对我有用......但我确实需要从链接的帖子中更新一些东西才能让它为我和我工作我很高兴使用capistrano。编辑欢迎)