Ruby: 处理机密信息(环境变量)

本文档属于高级用法指南的一部分。您可以在此处查看完整指南:深入了解 Ruby 部署

👋 欢迎来到 Stackhero 文档!

Stackhero 提供了一种即用型 Ruby 云 解决方案,具有众多优势,包括:

  • 通过简单的 git push 在几秒钟内 部署您的应用程序。
  • 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
  • 享受自动备份一键更新以及简单、透明和可预测的定价带来的安心。
  • 通过私有和专用的 VM获得最佳的性能和强大的安全性

节省时间简化您的生活:尝试 Stackhero 的 Ruby 云托管 解决方案只需 5 分钟

在某些时候,您需要管理数据库和第三方服务的令牌或密码等机密信息。安全存储这些机密信息至关重要。避免将机密信息直接嵌入到您的存储库或代码中,因为这会带来严重的安全风险。

环境变量提供了两个显著的好处:

  1. 您的机密信息不会存储在 Git 存储库中,从而降低了如果有人访问您的源代码的风险。
  2. 您可以为不同的环境使用不同的凭据。例如,在生产中连接到您的生产数据库,而在开发中使用开发数据库。

对于开发,在项目的根目录下创建一个 .env 文件。此文件将被 Git 排除,因此永远不会被提交。使用 dotenv gem 自动加载 .env 文件。

首先,将 dotenv-rails gem 添加到您的 Gemfile 中:

# Gemfile
gem 'dotenv-rails', groups: [:development, :test]

然后安装 gem:

bundle install

接下来,在项目的根目录下创建一个 .env 文件并添加您的变量:

RAILS_ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...

最后,确保 .env 文件被 Git 忽略:

echo '.env*' >> .gitignore

对于 staging 和生产,.env 文件既不安全也不实用,因为它不能存储在 Git 存储库中。相反,Stackhero 提供了一种安全的解决方案,可以直接在您的 Ruby 服务配置中管理环境变量。

您可以通过选择您的 Ruby 服务并点击 "Configure" 按钮,在 Stackhero 仪表板中设置这些变量。

在 Ruby 中,您可以使用 ENV 轻松访问环境变量。例如,要检索 DATABASE_PASSWORD,请使用:

ENV['DATABASE_PASSWORD'] # => 'secretPassword'

以下是使用环境变量连接到 RabbitMQ 服务器的示例:

require 'bunny'

class RabbitMQClient
  def initialize
    @connection = Bunny.new(hostname: ENV['RABBITMQ_HOST'],
                            username: ENV['RABBITMQ_USERNAME'],
                            password: ENV['RABBITMQ_PASSWORD'])
    @connection.start
  end

  def publish(queue_name, message)
    channel = @connection.create_channel
    queue = channel.queue(queue_name)
    channel.default_exchange.publish(message, routing_key: queue.name)
  end

  def close
    @connection.close
  end
end

在开发平台上,您的 .env 文件可能包括:

RABBITMQ_HOST='127.0.0.1'
RABBITMQ_USERNAME='developmentUser'
RABBITMQ_PASSWORD='developmentPassword'

对于生产和 staging,请在 Stackhero 仪表板的 Ruby 服务配置下定义您的环境变量,如下所示:

RABBITMQ_HOST='<XXXXXX>.stackhero-network.com'
RABBITMQ_USERNAME='production'
RABBITMQ_PASSWORD='secretProductionPassword'