我有一个运行我们的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
可供所有用户使用,所以这是我的。仍然有同样的问题:
不要出现在应用程序中
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"
编辑:
在应用程序中,我在普通html中请求G_DOMAIN
和G_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
答案 0 :(得分:5)
我也有这样的问题。对我来说,这只有在我添加一个新的环境变量时才会发生。
通过this post,经过一些谷歌搜索后,我逐渐明白Puma的restart
命令(通过gem capistrano-puma
)可能看不到新的环境变量,因为这个过程重新启动时自行分叉,而不是自杀并重新启动(这是在部署期间保持服务器响应的一部分)。
链接帖子建议使用仅存储在生产服务器上的YAML文件(读取:不在源代码管理中),而不是依赖于部署用户的环境变量。这就是你如何实现它:
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
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
1
中的代码,您的Rails应用程序会将您在服务器的Capistrano目录的./shared/config/local_env.yml
文件中定义的任何键加载到ENV
哈希中,这将在其他配置文件之前发生,例如{已加载{1}}或secrets.yml
。 database.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。编辑欢迎)