15

Więc staram się dostać mój szyn wdrożyć aplikację w trybie produkcyjnym, ale pojawia się błąd: brak secret_token i secret_key_base dla środowiska „produkcji”, ustawić te wartości w config/secrets.ymlProdukcja szyn - Jak ustawić tajne klucze?

mój plik secrets.yml jest zgodnie z oczekiwaniami :

development: 
    secret_key_base: xxxxxxx 

test: 
    secret_key_base: xxxxxxx 

production: 
    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 

Ale nawet po Google i badaniach, nie mam pojęcia, co zrobić z tajną kluczową bazą produkcyjną. Większość informacji tam zawartych zakłada, że ​​mam pewną wiedzę w tle, ale rzeczywistość jest taka, że ​​jestem noobem.

Czy ktoś może mi wytłumaczyć, jak ustawić mój tajny klucz i uruchomić go w trybie produkcyjnym?

+0

Możliwy duplikat [Jak rozwiązać błąd „Missing \' tajnym \ _key \ _base \ 'dla" środowiska produkcyjnego "na Heroku (Rails 4.1)] (http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for- production-environment-on-h) – mbaitoff

Odpowiedz

11

Błędy, które otrzymujesz, wskazują, że zmienna środowiskowa dla secret_key_base nie jest poprawnie ustawiona na serwerze.

Można używać różnych skryptów, takich jak capistrano, które automatyzują proces ustawiania tych elementów przed uruchomieniem aplikacji.

chodzi o szybkie ustalenie spróbuj tego:

export SECRET_KEY_BASE=YOUR SECRET BASE 

zweryfikować zmienne środowiskowe i sprawdzić, czy zostały one ustawione.

Command:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

Jeśli pojawiają się wtedy wartości te są ustawione na serwerze produkcyjnym.

Najlepszą praktyką jest użycie ENV.fetch(SECRET_KEY), ponieważ spowoduje to zgłoszenie wyjątku, zanim aplikacja spróbuje rozpocząć.

+0

Jaki powinien być mój tajny token? Użyłem $ rake secret i dał mi klucz, ale co z bazą? – nvrpicurnose

+3

'rake secret' tworzy bezpieczny ciąg kluczy do użycia jako' TOKEN' i 'BASE'. Szyny po prostu potrzebują ich do poprawnego działania i wykonują pewne zabezpieczenia za kulisami. – JensDebergh

+0

Najnowsze Railsy nie potrzebują już 'secret_token'; wymagany jest tylko 'secret_key_base'. –

4

Jak widać, istnieje ustalona wartość dla środowisk development i test, ale ta dla production pochodzi ze zmiennej. Po pierwsze, dlaczego tak? Jest to funkcja bezpieczeństwa. W ten sposób, jeśli sprawdzisz ten plik w kontroli wersji, takiej jak git lub svn, wartości development i test zostaną udostępnione, co jest w porządku, ale numer production (taki, który byłby używany na prawdziwej stronie), nie jest więc nikt nie może spojrzeć na źródło, aby uzyskać ten sekret.

jako zmiennej stosowanego ENV["SECRET_KEY_BASE"], to jest zmienna z szyn prowadzi się w środowisku (nie mylić z szynami „otoczenia”, na przykład development, test i production). Te zmienne środowiskowe pochodzą z powłoki. Jak wspomniano w poście JensD „s, można ustawić zmienną środowiskową tymczasowo z:

export SECRET_TOKEN=YOUR SECRET TOKEN 
export SECRET_KEY_TOKEN=YOUR SECRET BASE 

Aby wygenerować nowy tajny token, użyj komendy rake secret w wierszu poleceń.

To jednak jest tymczasowe, a nie dobre, ostateczne rozwiązanie. Aby uzyskać ostateczne rozwiązanie, sprawdź numer this article, który ma szybki koniec pod koniec implementacji dotenv, aby załadować sekrety konfiguracji. Pamiętaj, że jeśli używasz kontroli wersji, upewnij się, że nie jest zaznaczony Twój plik .env!

Ustawienie dotenv up wymaga trochę pracy, ale bardzo polecam go, próbując ręcznie skonfigurować te zmienne środowiskowe.

+1

Czy jest jakiś krok po kroku samouczek na temat przeniesienia aplikacji szyny do produkcji? Nie mogę złożyć wszystkich tych fragmentów, ponieważ brakuje mi niezbędnej wiedzy. – nvrpicurnose

+1

@ nvrpicurnose lol sposób na naukę to robić to znowu i znowu, aż zacznie się łatwiej. Kręciłem się i rozdzierałem serwery przez długi czas, aż w końcu to dostaję. Zajmuje wiele godzin i wiele samouczków, aby naprawdę je zdobyć. Przynajmniej tak to było w moim przypadku, bez kogoś, kto naprawdę trzyma mnie za rękę i pokazuje mi. Trzymaj się tego i staje się łatwiejsze. Zapoznaj się z czytaniem mnie w tej aplikacji demonstracyjnej, którą próbowałem wdrożyć. Może pomóc https://github.com/adiakritos/sw-checkin –

21

Można wygenerować klucz za pomocą następujących poleceń

$ irb 
>> require 'securerandom' 
=> true 
>> SecureRandom.hex(64) 
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf" 
>> exit 
6

Ta odpowiedź bardzo mi pomogło. Wskazuje on, jak config plik secrets.yml w produkcji i jak czytać ją od środowiska:

oryginalny link: https://stackoverflow.com/a/26172408/4962760

I had the same problem and I solved it by creating an environment variable to be loaded every time that I logged in to the production server and made a mini guide of the steps to configure it:

https://gist.github.com/pablosalgadom/4d75f30517edc6230a67

I was using Rails 4.1 with Unicorn v4.8.2, when I tried to deploy my app it didn't start properly and in the unicorn.log file I found this error message:

"app error: Missing secret_key_base for 'production' environment, set this value in config/secrets.yml (RuntimeError)"

After some research I found out that Rails 4.1 changed the way to manage the secret_key, so if you read the secrets.yml file located at [exampleRailsProject]/config/secrets.yml you'll find something like this:

Do not keep production secrets in the repository,

instead read values from the environment. production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> This means that rails

recommends you to use an environment variable for the secret_key_base in your production server, in order to solve this error you should follow this steps to create an environment variable for Linux (in my case Ubuntu) in your production server:

1.- In the terminal of your production server execute the next command:

$ RAILS_ENV=production rake secret This returns a large string with letters and numbers, copy that (we will refer to that code as GENERATED_CODE).

2.1- Login as root user to your server, find this file and edit it: $ vi /etc/profile

Go to the bottom of the file ("SHIFT + G" for capital G in VI)

Write your environment variable with the GENERATED_CODE (Press "i" key to write in VI), be sure to be in a new line at the end of the file:

export SECRET_KEY_BASE=GENERATED_CODE Save the changes and close the file (we push "ESC" key and then write ":x" and "ENTER" key for save and exit in VI)

2.2 But if you login as normal user, lets call it example_user for this gist, you will need to find one of this other files:

$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile These files are in order of importance, that means that if you have the first file, then you wouldn't need to write in the others. So if you found this 2 files in your directory "~/.bash_profile" and "~/.profile" you only will have to write in the first one "~/.bash_profile", because Linux will read only this one and the other will be ignored.

Then we go to the bottom of the file ("SHIFT + G" for capital G in VI)

And we will write our environment variable with our GENERATED_CODE (Press "i" key to write in VI), be sure to be in a new line at the end of the file:

export SECRET_KEY_BASE=GENERATED_CODE Having written the code, save the changes and close the file (we push "ESC" key and then write ":x" and "ENTER" key for save and exit in VI)

3.- You can verify that our environment variable is properly set in Linux with this command:

$ printenv | grep SECRET_KEY_BASE or with:

$ echo $SECRET_KEY_BASE When you execute this command, if everything went ok, it will show you the GENERATED_CODE from before. Finally with all the configuration done you should be able to deploy without problems your Rails app with Unicorn or other.

When you close your shell terminal and login again to the production server you will have this environment variable set and ready to use it.

And thats it!! I hope this mini guide help you to solve this error.

Disclaimer: I'm not a Linux or Rails guru, so if you find something wrong or any error I will be glad to fix it!