Ніколи не встановлюйте конфіденційну інформацію (облікові дані, паролі тощо) . Натомість створіть файл для зберігання цієї інформації як змінних середовища (пари ключ / значення) та виключіть цей файл із системи управління вихідним кодом. Наприклад, з точки зору Git (система управління вихідним кодом), виключіть цей файл, додавши його до. gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
Крім того, додайте наступні рядки до /config/environment.rb
між require
рядком та Application.initialize
рядком:
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
Це воно!
Як зазначається у коментарі вище, роблячи це, ви завантажуватимете свої змінні середовища раніше environments/*.rb
, а це означає, що ви зможете посилатися на свої змінні всередині цих файлів (наприклад environments/production.rb
). Це велика перевага перед тим, як розмістити файл змінних середовища всередині /config/initializers/
.
Всередині app_environment_variables.rb
немає необхідності розрізняти середовища, що стосуються розробки або виробництва, оскільки ви ніколи не вкладете цей файл у свою систему управління вихідним кодом, отже, це за замовчуванням для контексту розробки . Але якщо вам потрібно встановити щось спеціальне для тестового середовища (або для випадків, коли ви тестуєте режим виробництва локально ), просто додайте умовний блок під усі інші змінні:
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
Щоразу, коли ви оновлюєтесь app_environment_variables.rb
, перезапустіть сервер додатків. Припускаючи, що ви використовуєте подібні Apache / Passenger або rails server
:
-bash> touch tmp/restart.txt
У своєму коді зверніться до змінних середовища наступним чином:
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Зверніть увагу, що всередині app_environment_variables.rb
ви повинні вказати логічні значення та числа як рядки (наприклад, ENV['SEND_MAIL'] = 'false'
не просто false
, і ENV['TIMEOUT'] = '30'
не просто 30
), інакше ви отримаєте помилки can't convert false into String
і can't convert Fixnum into String
, відповідно.
Зберігання та обмін конфіденційною інформацією
Останній вузол: як поділитися цією конфіденційною інформацією зі своїми клієнтами та / або партнерами? З метою безперервності бізнесу (тобто, коли вас вразить падаюча зірка, як ваші клієнти та / або партнери відновлять повноцінну роботу сайту?), Ваші клієнти та / або партнери повинні знати всі дані, необхідні вашому додатку . Надсилання електронної пошти / скайпінг цих речей небезпечно і веде до безладу. Зберігати його у спільних документах Google непогано (якщо всі користуються https), але додаток, призначений для зберігання та обміну невеликими синичками, наприклад паролями, буде ідеальним.
Як встановити змінні середовища на Heroku
Якщо у вас є єдине середовище на Heroku:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Якщо у вас є кілька середовищ на Heroku:
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
Форман та .env
Багато розробників використовують Foreman (встановлений за допомогою Heroku Toolbelt ) для локального запуску своїх програм (на відміну від використання подібних Apache / Passenger або rails server
). Форман та Heroku використовують Procfile
для декларування того, які команди запускає ваш додаток , тому перехід від локального розробника до Heroku є плавним у цьому відношенні. Я використовую Foreman та Heroku у кожному проекті Rails, тому ця зручність чудова. Але ось у чому річ .. Форман завантажує змінні середовища, що зберігаються в /.env
через dotenv, але, на жаль, dotenv по суті аналізує файл лише для key=value
пар; ці пари не стають змінними тут же і тоді, тому ви не можете посилатися на вже встановлені змінні (щоб зберегти сухі речі), а також не можете робити там "Рубін" (як зазначено вище з умовними умовами), який ви можете робити в /config/app_environment_variables.rb
. Наприклад, з точки зору збереження сухих речей, я іноді роблю такі речі:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
Отже, я використовую Foreman для запуску своїх програм локально, але я не використовую його .env
файл для завантаження змінних середовища; я скоріше використовую Foreman разом із /config/app_environment_variables.rb
підходом, описаним вище.
export admin_password="secret"
, а неexport admin_password = "secret"
.