Stworzyłem od podstaw aplikację Rails, używając Rails 4.1 i mam do czynienia z dziwnym problemem, którego nie jestem w stanie rozwiązać.
Za każdym razem, gdy próbuję wdrożyć moją aplikację w Heroku, pojawia się błąd 500:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
secret.yml
Plik zawiera następującą konfigurację:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Na Heroku skonfigurowałem SECRET_KEY_BASE
zmienną środowiskową " " z wynikiem rake secret
polecenia. Jeśli uruchamiam heroku config
, widzę zmienną z poprawną nazwą i wartością.
Dlaczego nadal otrzymuję ten błąd?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
źródło
źródło
secret.yml
lubsecrets.yml
?Odpowiedzi:
Miałem ten sam problem i rozwiązałem go, tworząc zmienną środowiskową, która była ładowana za każdym razem, gdy logowałem się do serwera produkcyjnego, i zrobiłem mini przewodnik po krokach, aby ją skonfigurować:
Używałem Rails 4.1 z Unicorn v4.8.2 i kiedy próbowałem wdrożyć moją aplikację, nie uruchomiła się ona poprawnie, aw
unicorn.log
pliku znalazłem ten komunikat o błędzie:Po kilku poszukiwaniach dowiedziałem się, że Rails 4.1 zmienił sposób zarządzania
secret_key
, więc jeśli przeczytaszsecrets.yml
plik znajdującyexampleRailsProject/config/secrets.yml
się tam, znajdziesz coś takiego:Oznacza to, że Railsy zalecają użycie zmiennej środowiskowej dla
secret_key_base
serwera produkcyjnego. Aby rozwiązać ten błąd, wykonaj następujące kroki, aby utworzyć zmienną środowiskową dla systemu Linux (w moim przypadku Ubuntu) na serwerze produkcyjnym:W terminalu twojego serwera produkcyjnego wykonaj:
Zwraca duży ciąg z literami i cyframi. Skopiuj to, do którego będziemy odnosić się do tego kodu jako
GENERATED_CODE
.Zaloguj się do swojego serwera
Jeśli logujesz się jako użytkownik root, znajdź ten plik i edytuj go:
Przejdź na dół pliku, używając Shift+ G(duże „G”) w vi.
Napisz swoją zmienną środowiskową za pomocą
GENERATED_CODE
, naciskając, iaby wstawić do vi. Upewnij się, że na końcu pliku znajduje się nowy wiersz:Zapisz zmiany i zamknij plik za pomocą, Esca następnie "
:x
" i Enterdo zapisania i wyjścia w vi.Ale jeśli logujesz się jako zwykły użytkownik, nazwijmy to „
example_user
” w tym celu, będziesz musiał znaleźć jeden z tych innych plików:Te pliki są uporządkowane według ważności, co oznacza, że jeśli masz pierwszy plik, nie musisz edytować pozostałych. Jeśli znalazłeś te dwa pliki w swoim katalogu
~/.bash_profile
i~/.profile
będziesz musiał pisać tylko w pierwszym~/.bash_profile
, ponieważ Linux odczyta tylko ten jeden, a drugi zostanie zignorowany.Następnie ponownie przechodzimy do końca pliku za pomocą Shift+ Gi ponownie zapisujemy zmienną środowiskową za
GENERATED_CODE
pomocą naszego użycia i, i pamiętaj, aby dodać nową linię na końcu pliku:Po napisaniu kodu zapisz zmiany i zamknij plik używając Escponownie i "
:x
" oraz Enteraby zapisać i wyjść.Możesz sprawdzić, czy nasza zmienna środowiskowa jest poprawnie ustawiona w systemie Linux za pomocą tego polecenia:
lub z:
Kiedy wykonasz to polecenie, jeśli wszystko poszło dobrze, pokaże ci to
GENERATED_CODE
z poprzedniego. Wreszcie, po wykonaniu całej konfiguracji, powinieneś być w stanie bez problemów wdrożyć aplikację Rails z Unicornem lub innym narzędziem.Kiedy zamkniesz swoją powłokę i zalogujesz się ponownie do serwera produkcyjnego, będziesz mieć ustawioną zmienną środowiskową i gotową do użycia.
I to wszystko! Mam nadzieję, że ten mini poradnik pomoże ci rozwiązać ten błąd.
Uwaga: nie jestem guru Linuksa ani Railsów, więc jeśli znajdziesz coś nie tak lub jakikolwiek błąd, z przyjemnością to naprawię.
źródło
Zakładam, że nie masz
secrets.yml
wpisanego do kontroli źródła (tj. Jest w.gitignore
pliku). Nawet jeśli to nie jest twoja sytuacja, zrobiło to wiele innych osób przeglądających to pytanie, ponieważ mają ujawniony kod na Github i nie chcą, aby ich tajny klucz unosił się w pobliżu.Jeśli nie podlega kontroli źródła, Heroku o tym nie wie. Tak więc Railsy poszukują
Rails.application.secrets.secret_key_base
i nie zostało to ustawione, ponieważ Railsy ustawiają to sprawdzającsecrets.yml
plik, który nie istnieje. Prostym obejściem jest przejście doconfig/environments/production.rb
pliku i dodanie następującego wiersza:Mówi to aplikacji, aby ustawiła tajny klucz przy użyciu zmiennej środowiskowej, zamiast szukać go w
secrets.yml
. Pozwoliłoby mi zaoszczędzić dużo czasu, gdybym wiedział o tym z góry.źródło
Figaro
iheroku_secrets
nie rób nic, chyba że Railsy wiedzą, że toSECRET_KEY_BASE
żyjeENV
. Zmagałem się z myślą, że gdyby zmienna konfiguracyjna istniała na Heroku, Railsy by ją odebrały tylko dlatego, że istnieje, ale teraz wydaje się oślepiająco oczywiste, że Railsy musiałyby wiedzieć, gdzie szukać. Zastanawiałem się, jak mogę mieć kod na Githubie bez martwienia się o tajną bazę klucza; teraz wiem.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Syml z . Czy nie oznacza to również, że rzeczywisty tajny klucz nie zostanie ujawniony. Czy istnieje ryzyko ujawnienia kluczy deweloperskich i testowych w zatwierdzonych sekretach .yml, jeśli są to tylko dane seed i testowe?Dodaj
config/secrets.yml
do kontroli wersji i wdróż ponownie. Może być konieczne usunięcie linii z.gitignore
, aby móc zatwierdzić plik.Miałem dokładnie ten sam problem i okazało się, że
.gitignore
zawierał standardowy szablon Github stworzony dla mojej aplikacji Railsowejconfig/secrets.yml
.źródło
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
mogłoby zadziałać i usunąć błąd bez dodawaniasecrets.yml
do źródła.rails new
(w tym przypadku tworząc Gemfile, któregorails
gem ma wersję4.2.4
), plikconfig/secrets.yml
jest generowany. Obejmuje ona pregenerated tajnych kluczy dla środowisk programistycznych i testowych, a czyta tajny klucz do środowiska produkcyjnego od zmiennej środowiskowej:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Wydaje mi się, że utrzymywanie tegosecrets.yml
pliku w kontroli wersji jest całkowicie bezpieczne, a nawet przydatne , pod warunkiem, że nigdy nie zdefiniowano tam tajnego klucza.To zadziałało dla mnie.
SSH na swój serwer produkcyjny i
cd
do bieżącego katalogu, uruchombundle exec rake secret
lubrake secret
, jeśli otrzymasz długi ciąg jako wynik, skopiuj ten ciąg.A teraz biegnij
sudo nano /etc/environment
.Wklej na dole pliku
Gdzie
rake secret
jest właśnie skopiowany ciąg, wklej ten skopiowany ciąg zamiastrake secret
.Uruchom ponownie serwer i przetestuj, uruchamiając
echo $SECRET_KEY_BASE
.źródło
Chociaż możesz używać inicjatorów, tak jak inne odpowiedzi, konwencjonalnym sposobem Rails 4.1+ jest użycie
config/secrets.yml
. Powód, dla którego zespół Railsów to wprowadził, wykracza poza zakres tej odpowiedzi, ale TL; DR jest to, żesecret_token.rb
łączy konfigurację i kod, a także stanowi zagrożenie bezpieczeństwa, ponieważ token jest sprawdzany w historii kontroli źródła i jest jedynym systemem, który musi wiedzieć, że tajny token produkcji to infrastruktura produkcyjna.Powinieneś dodać ten plik
.gitignore
tak, jak nie byłbyś dodawanyconfig/database.yml
do kontroli źródła.Odwołując się do własnego kodu Heroku do konfiguracji
config/database.yml
zDATABASE_URL
ich Buildpack for Ruby , skończyłem rozwidlając ich repozytorium i zmodyfikowałem je, aby utworzyćconfig/secrets.yml
zeSECRETS_KEY_BASE
zmiennej środowiskowej.Odkąd ta funkcja została wprowadzona w Railsach 4.1, uznałem, że należy ją edytować
./lib/language_pack/rails41.rb
i dodawać.Poniżej znajduje się fragment zmodyfikowanego pakietu kompilacji, który utworzyłem w mojej firmie:
Możesz oczywiście rozszerzyć ten kod, aby dodać inne wpisy tajne (np. Klucze API stron trzecich itp.), Które będą odczytywane ze zmiennej środowiskowej:
W ten sposób możesz uzyskać dostęp do tego sekretu w bardzo standardowy sposób:
Przed ponownym wdrożeniem aplikacji pamiętaj, aby najpierw ustawić zmienną środowiskową:
Następnie dodaj swój zmodyfikowany buildpack (lub możesz dodać link do mojego) do swojej aplikacji Heroku (zobacz dokumentację Heroku ) i ponownie wdróż aplikację.
Buildpack automatycznie utworzy twoją
config/secrets.yml
zmienną środowiskową jako część procesu budowania hamowni za każdym razem, gdy będzieszgit push
w Heroku.EDYCJA: Własna dokumentacja Heroku sugeruje tworzenie
config/secrets.yml
do odczytu ze zmiennej środowiskowej, ale oznacza to, że powinieneś sprawdzić ten plik w kontroli źródła. W moim przypadku nie działa to dobrze, ponieważ mam zakodowane na stałe sekrety środowisk programistycznych i testowych, których wolałbym nie sprawdzać.źródło
Możesz wyeksportować tajne klucze jako zmienne środowiskowe na
~/.bashrc
lub~/.bash_profile
na serwerze:Następnie możesz pozyskać swoje
.bashrc
lub.bash_profile
:Nigdy nie ujawniaj swoich tajemnic. Syml
źródło
W moim przypadku problem polegał na tym, że
config/master.key
nie było kontroli wersji, a projekt utworzyłem na innym komputerze.Domyślny .gitignore, który tworzy Rails, wyklucza ten plik. Ponieważ nie można wdrożyć bez tego pliku, musi on podlegać kontroli wersji, aby można było wdrożyć z dowolnego komputera członka zespołu.
Rozwiązanie: usuń
config/master.key
linię z.gitignore
, zatwierdź plik z komputera, na którym projekt został utworzony, a teraz możeszgit pull
na innym komputerze i wdrożyć z niego.Ludzie mówią, że nie wolno przekazywać niektórych z tych plików do kontroli wersji, nie oferując alternatywnego rozwiązania. Dopóki nie pracujesz nad projektem open source, nie widzę powodu, aby nie zatwierdzać wszystkiego, co jest wymagane do uruchomienia projektu, w tym poświadczeń.
źródło
secrets.yml
pliku, który był przestarzały w kilku poprzednich wersjach Railsów. Samo pytanie o przepełnienie stosu ma mnóstwo odpowiedzi i prawie wszyscy używają tego starożytnego interfejsu API.W przypadku rails6 miałem ten sam problem, ponieważ brakowało mi następujących plików, po ich dodaniu problem ustąpił:
Upewnij się, że masz te pliki. !!!
źródło
Co zrobiłem: na serwerze produkcyjnym tworzę plik konfiguracyjny (confthin.yml) dla Thin (używam go) i dodaję następujące informacje:
Następnie uruchamiam aplikację za pomocą
Działa jak urok i nie ma potrzeby posiadania tajnego klucza do kontroli wersji
Mam nadzieję, że to pomoże, ale jestem pewien, że to samo można zrobić z Jednorożcem i innymi.
źródło
Mam łatkę, której użyłem w aplikacji Rails 4.1, która pozwala mi dalej używać starszego generatora kluczy (a tym samym wstecznej kompatybilności sesji z Railsami 3), pozwalając na pozostawienie pustego pola secret_key_base.
Od tego czasu ponownie sformatowałem łatkę i wysłałem ją do Railsów jako żądanie ściągnięcia
źródło
Utworzyłem
config/initializers/secret_key.rb
plik i napisałem tylko następującą linię kodu:Ale wydaje mi się, że rozwiązanie opublikowane przez @Erik Trautman jest bardziej eleganckie;)
Edycja: Aha, iw końcu znalazłem tę radę na Heroku: https://devcenter.heroku.com/changelog-items/426 :)
Cieszyć się!
źródło
to działa dobrze https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 dla użytkownika root powinien edytować
ale jeśli nie jesteś rootem, powinieneś umieścić kod generujący w następującym
źródło
Na Nginx / Passenger / Ruby (2.4) / Rails (5.1.1) nic innego nie działało z wyjątkiem:
passenger_env_var
w/etc/nginx/sites-available/default
bloku serwera.Źródło: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
źródło
Odpowiedź Demi Magus działała dla mnie do Rails 5.
Na Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6) musiałem umieścić
z odpowiedzi Demi Magus w / etc / apache2 / envvars, ponieważ / etc / profile wydaje się być ignorowane.
Źródło: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
źródło
Miałem ten sam problem po użyciu pliku .gitignore z https://github.com/github/gitignore/blob/master/Rails.gitignore
Wszystko poszło dobrze po tym, jak skomentowałem następujące wiersze w pliku .gitignore.
źródło