Nigdy nie zakoduj na stałe poufnych informacji (danych logowania do konta, haseł itp . ) . Zamiast tego utwórz plik do przechowywania tych informacji jako zmienne środowiskowe (pary klucz / wartość) i wyklucz ten plik z systemu zarządzania kodem źródłowym. Na przykład, jeśli chodzi o Git (system zarządzania kodem źródłowym), wyklucz ten plik, dodając go do. gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
Oprócz tego dodaj następujące wiersze /config/environment.rb
między require
wierszem a Application.initialize
wierszem:
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
Otóż to!
Jak mówi powyższy komentarz, robiąc to, wcześniej załadujesz swoje zmienne środowiskowe environments/*.rb
, co oznacza, że będziesz mógł odwoływać się do swoich zmiennych w tych plikach (np environments/production.rb
.). Jest to duża zaleta w stosunku do umieszczania pliku zmiennych środowiskowych w środku /config/initializers/
.
Wewnątrz app_environment_variables.rb
nie ma potrzeby rozróżniania środowisk, jeśli chodzi o rozwój lub produkcję, ponieważ nigdy nie zapiszesz tego pliku do systemu zarządzania kodem źródłowym, dlatego jest on domyślnie przeznaczony dla kontekstu programowania . Ale jeśli chcesz ustawić coś specjalnego dla środowiska testowego (lub na okazje, kiedy testujesz lokalnie testujesz tryb produkcyjny ), po prostu dodaj blok warunkowy poniżej wszystkich innych zmiennych:
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
Po każdej aktualizacji app_environment_variables.rb
uruchom ponownie serwer aplikacji. Zakładając, że korzystasz z Apache / Passenger lub rails server
:
-bash> touch tmp/restart.txt
W swoim kodzie odwołaj się do zmiennych środowiskowych w następujący sposób:
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Zauważ, że wewnątrz app_environment_variables.rb
musisz określić wartości logiczne i liczby jako łańcuchy (np. ENV['SEND_MAIL'] = 'false'
Nie tylko false
, iENV['TIMEOUT'] = '30'
nie tylko 30
), w przeciwnym razie otrzymasz odpowiednio błędy can't convert false into String
i can't convert Fixnum into String
.
Przechowywanie i udostępnianie poufnych informacji
Ostatnim węzłem do zawiązania jest: jak udostępnić te poufne informacje swoim klientom i / lub partnerom? W celu zapewnienia ciągłości biznesowej (tj. Gdy zostaniesz trafiony spadającą gwiazdą, w jaki sposób Twoi klienci i / lub partnerzy wznowią pełne działanie witryny?) Twoi klienci i / lub partnerzy muszą znać wszystkie poświadczenia wymagane przez Twoją aplikację . Wysyłanie e-maili / Skypowanie się z takimi rzeczami jest niebezpieczne i prowadzi do nieładu. Przechowywanie go w udostępnionych Dokumentach Google nie jest złe (jeśli wszyscy używają https), ale aplikacja przeznaczona do przechowywania i udostępniania drobiazgów, takich jak hasła, byłaby idealna.
Jak ustawić zmienne środowiskowe w Heroku
Jeśli masz jedno środowisko na Heroku:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Jeśli masz wiele środowisk w 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
Foreman i .env
Wielu programistów używa Foreman (instalowanego z Heroku Toolbelt ) do uruchamiania swoich aplikacji lokalnie (w przeciwieństwie do Apache / Passenger lub rails server
). Foreman i Heroku używają Procfile
do zadeklarowania, jakie polecenia są uruchamiane przez twoją aplikację , więc przejście z lokalnego dewelopera do Heroku jest płynne w tym względzie. Używam Foreman i Heroku w każdym projekcie Rails, więc ta wygoda jest świetna. Ale o to chodzi ... Foreman ładuje zmienne środowiskowe przechowywane /.env
przez dotenv, ale niestety dotenv zasadniczo analizuje plik tylko pod kątem key=value
par; te pary nie stają się zmiennymi od razu tam i wtedy, więc nie możesz odwoływać się do już ustawionych zmiennych (aby utrzymać rzeczy SUCHE), ani nie możesz tam zrobić "Ruby" (jak wspomniano powyżej z warunkami), które możesz zrobić w/config/app_environment_variables.rb
. Na przykład, jeśli chodzi o utrzymywanie rzeczy SUCHA, czasami robię takie rzeczy:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
Dlatego używam Foremana do uruchamiania moich aplikacji lokalnie, ale nie używam jego .env
pliku do ładowania zmiennych środowiskowych; raczej używam Foremana w połączeniu z /config/app_environment_variables.rb
podejściem opisanym powyżej.
export admin_password="secret"
, nieexport admin_password = "secret"
.