使用新的env变量刷新.bashrc

jam*_*ree 1 ruby-on-rails nginx environment-variables

我有一个运行我们的rails应用程序的生产服务器,我们在那里有ENV变量,格式正确.他们出现rails c但我们有一个问题,让他们在应用程序的实例中被识别.

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

仍然没有被认出..但在铁路c中,我们缺少什么?

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

  1. 在轨道中表现得很好c
  2. 当我在shell中回显它们时显示正常
  3. 不要出现在申请表中

    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"
    
    Run Code Online (Sandbox Code Playgroud)

编辑:

在应用程序我请求G_DOMAING_EMAIL简单的HTML(这与dotenv开发工作,一旦推送到生产服务器使用ubuntu服务器不起作用):

      ENV TEST<BR>
      G_DOMAIN: <%= ENV['G_DOMAIN'] %><br>
      G_EMAIL:<%= ENV['G_EMAIL'] %>
Run Code Online (Sandbox Code Playgroud)

但是,可以使用以下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']
Run Code Online (Sandbox Code Playgroud)

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

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

man*_*roe 5

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

通过这篇文章和一些更多的谷歌搜索,我已经明白,restartPuma 的命令(通过gem capistrano-puma)可能看不到新的环境变量,因为进程在重新启动时自行分叉而不是自杀并再次启动(这是一个在部署期间保持服务器响应的一部分).

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

  1. 将此代码插入Rails应用程序的config/application.rb文件中:
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
Run Code Online (Sandbox Code Playgroud)
  1. 将此代码添加到Capistrano部署脚本(config/deploy.rb)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 利润!使用代码1,您的Rails应用程序会将您在服务器的Capistrano目录./shared/config/local_env.yml文件中定义的任何键加载到ENV哈希中,这将在其他配置文件之前secrets.yml或之前database.yml加载.代码2确保./shared/config/服务器上的文件在每次部署时都current/config/符号链接到(1预期代码所在的位置).

示例local_env.yml:

SECRET_API_KEY_DONT_TELL: 12345abc6789
OTHER_SECRET_SHH: hello
Run Code Online (Sandbox Code Playgroud)

示例secrets.yml:

production:
  secret_api_key: <%= ENV["SECRET_API_KEY_DONT_TELL"] %>
  other_secret: <%= ENV["OTHER_SECRET_SHH"] %>
Run Code Online (Sandbox Code Playgroud)

通过不使用环境变量,这将保证找到您的环境变量.似乎是一种解决方法,但基本上我们只是将ENV对象用作方便的全局变量.

(capistrano语法可能有点老了,但是这里的Rails 5中有什么用呢...但是我确实需要从链接的帖子中更新一些东西才能让它适合我并且我刚开始使用它capistrano.编辑欢迎)