Trzymanie konfiguracji np.smtp w osobnym pliku

Przeważnie trzymam swoje projekty na githubie ze względu na wygodę. W Django jak miałem coś w konfigu co było niejawne, to po prostu trzymałem to w osobnym pliku + .gitignore i ładowałem dane z pliku na początku przetwarzania ustawień przez django.

W RoR ogólnie prawie wszystko jest implicit a nie explicit i dobrze jest się trzymać dosyć sztywno narzuconych konwencji jeżeli chce się myśleć o dzieleniu/publikacji kodu… stąd pytanie: jak wczytywać niejawne ustawienia, takie jak np. hasło do serwera smtp czy np. klucz do jakiegoś API? :wink:

secrets.yml, ENV[]

Niejawny config wczytuj z ENV czyli np. w .bashrc eksportujesz jakąś zmienną i potem z ENV ją zczytujesz. W tym momencie jest to obojętne czy użyjesz secrets.yml (osobiście nie przepadam za tym plikiem, bo to rozwiązanie jest niedopracowane). czy skorzystasz z zewnętrzego gema do configu, czy napiszesz własny moduł/klasę wykorzystującą ActiveSupport::Configurable

https://github.com/laserlemon/figaro, https://github.com/markbates/configatron

2 Likes

Dodatkowo w nowych railsach jest funkcjonalnosć do tego typu rzeczy przystępnie opisano to tutaj: http://www.justinweiss.com/blog/2014/08/25/the-lesser-known-features-in-rails-4-dot-2/

Figaro wydaje się być rewelacyjnym rozwiązaniem dla mnie, już po krótkim przejrzeniu readme wydaje się to być strzałem w dziesiątkę :slight_smile:

W domu przetestuję. Dziękuję.

1 Like

z ostatniego Ruby Weekly…
Configuring Rails Environments

Wszystkim miłośnikom ENV delikatnie przypominam, że to zwykła globalna zmienna. A globalne zmienne to pożoga, powódź i zaraza.

Poza tym, używanie ENV ma też swoje bardziej trywialne problemy, np. monit ignoruje ich istnienie.

To jak to robić? Dla moich potrzeb Figaro sprawdza się doskonale, chociażby dlatego, że nie mam pojęcia jak w prosty sposób ustawić ENV pod windowsem :wink:

PS. Windows jest i zostanie moim systemem developerskim i nie mam ochoty spowiadać się dlaczego, a poważnych argumentów przeciwko nie ma :wink:

nie chce robić offtopa ale jak nie ma argumentów przeciw, to jakie są argumenty za ? W linuxie nie będziesz mógł używać wielu gemów, które korzystają z funkcji linuksowych, a które często wykorzystywane są w różnych aplikacjach.

Bo projekty na studia w C++/C# piszę w Visual Studio. Windowsa znam na wylot i skoro nie spotkałem żadnego większego problemu z developerką w Rubym pod Windowsem. Do tego jedyny sposób, żeby virtualna maszyna działała mi na obu monitorach to jest tryb full screen. W takim trybie nie przełączę się alt+tab do innego windowsowego programu, chociażby żeby przeskoczyć kawałek którego nie lubię na płycie. Można by długi wymieniać… ale prawda jest taka że to jest kwestia przyzwyczajenia. Pod Windowsem nie muszę się zastanawiać jak coś zrobić :wink: Ja widzę same plusy.

Gemy… napisz mi proszę które, tera nie kpię, tylko naprawdę się nie spotkałem z takimi gemami. Może link do jakiegoś projektu na githubie? Naprawdę chętnie to sprawdzę to w domu.

PS. Ja ogólnie póki co jestem hobbystą, przede wszystkim Pythonistą. Z Pythonem różni ludzie mi kiedyś wmawiali, że coś tam nie będzie działać pod windowsem, ale zawsze się okazywało że problem polega jedynie na tym, że trzeba “ręcznie” skompilować binarne rozszerzenia z których dana biblioteka korzystała. Np. Matplotlib czy PyQT, ale i tak w 95% przypadków są dostępne binarne instalki. A z PyQT to dopiero jest jazda, stara wersja z pakietów pod Linuxem działa bezbłędnie, ale spróbuj to ściągnąć, skompilować ze źródeł, poprawnie zainstalować i gdzieś użyć… :wink:

Ale wracając do tematu.
@sharnik: jeśli nie ENV to co?

spoko, przejdzie Ci :wink:

Zbyt literalnie do tego podchodzisz. Chodzi o to by nie przechowywać globalnego stanu, który w jednym miejscu jest modyfikowany, a w innym odczytywany. Natomiast każda aplikacja taki globalny stan posiada i są niby choćby klasy i moduły. Konfiguracja jest stanem, którego normalna aplikacja nie zmienia w trakcie działania więc nie ma tak na prawdę różnicy czy jest to wyciągane przez AppConfig.foo czy też ENV[‘foo’].

Zgodzę się całkowicie z tym co piszesz, jeśli dodamy Twoje ciche założenie o jednej aplikacji na jednym serwerze.

Jeśli masz więcej aplikacji, to masz globalny stan, które jedne aplikacje modyfikują (zapisując swoje zmienne przy deploy’u), a inne odczytują. Jeśli masz jakis konflikt nazw między dwoma projektami (albo konfiguracjami staging/preview) na tym samym serwerze, to życzę miłego debugowania.

U mnie używamy pilków konfiguracyjnych, dla dev/staging/preview trzymanych razem z aplikacją w repo, a dla produkcji generowanych przy deploy’u. Głównie dlatego, że ENV u nas po prostu nie ma prawa działać, bo używamy monit do wskrzeszania padniętych procesów, a on czyści wszystkie zmienne środowiskowe.

Nie mów, że trzymasz wszystkie aplikacje na jednym koncie użytkownika. Jak na serwerze ma się kilka aplikacji to prawidłowych podejściem jest jedno konto użytkownika na jedną aplikację.

Jakoś sobie nie wyobrażam, żeby haseł dla produkcji trzymać w repo.

my używamy Goda, a on radzi sobie dobrze ze zmiennymi środowiskowymi

[quote=“wafcio, post:17, topic:8572”]
Jakoś sobie nie wyobrażam, żeby haseł dla produkcji trzymać w repo.
[/quote]A gdzie je trzymasz w takim razie, żeby automatycznie dostawić nowy serwer?

A ja generalnie kolejny raz polecę pliki .yml :wink:

Na razie nie miałem okazji automatycznego dostawiania nowego serwera. Trzeba było od tego zacząć, teraz to nabiera sensu. Nie każdy projekt wymaga automatycznego dostawiania nowego serwera.