Wpis z mikrobloga

#java #spring #programowanie #git

Jak radzicie sobie z konfiguracją w Spring Boot?

Mam aplikację i w nim application.properties, przykładowo 23 parametry:
- 20 parametrów, to konfiguracja domyślna (zawsze taka sama, czy to developersko czy produkcyjnie, ale jest w pliku, żeby w razie czego dało się to szybko zmienić), ma to być zapisane w repozytorum,
- 3 parametry, które nie mogą być domyślne (np. klucz API, ścieżka do folderu do zapisu plików itd), wartości nie mogą być zapisane w repozytorium (ze względów bezpieczeństwa jak np. API key lub nie są znane jak np. ścieżka), czyli ich wartości w repozytorm są puste, ale przed uruchomieniem aplikacji należy je uzupełnić.

I teraz zwykła praca z takim projektem wygląda tak:
- ściągasz projekt,
- ręcznie uzupełniasz 3 parametry,
- robisz zmiany w kodzie (i często w konfiguracji domyślniej, w którymś z tych 20 parametrów),
- chcesz zrobić commita ze zmianami,
- ale musisz pamiętać, żeby przed zrobieniem commita usunąć wartości tych 3 parametrów, które nie są domyślne,
- potem znowu musisz uzupełnić te 3 parametry, żeby móc kontynuować pracę.

Jest to bardzo podatne na błędy (raz zapomnisz i na repozytorium leci tajny klucz).
Jest to bardzo uciążliwe, bo co chwila trzeba uzupełniać i usuwać.

Nie możesz dodać pliku application.properties do .gitignore, bo pozostałe zmiany w tym pliku chcesz zacommitować.

Jak sobie z tym radzicie?


  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mk321:
- hasła i klucze API można zaszyfrować Jasyptem i trzymać w repo.
- parametry można przekazywać w zmiennych środowiskowych i system properties podczas uruchamiania. To możesz dopisać do parametrów bootRuna czy innego czegoś, czym lokalnie odpalasz projekt (dockera, docker-compose'a czy innego dziada)
  • Odpowiedz
@mk321: klucze które są wrażliwe, możesz mieć, ale jako zmienne środowiskowe. Zamiast wpisywać wartość hasła dla admina, możesz użyć zmiennej środowiskowej ${ADMIN_PASSWORD}. Taki klucz możesz spokojnie zacommitować, a na środowisku lokalnym dodać sobie do IDE takie zmienne lub w zmiennych systemowych.
  • Odpowiedz
@mk321: powtórzę za @globalbus, moim zdaniem szyfrowanie wszelakich kluczy, haseł w propertiesach springowych, to po prostu dobra praktyka. Nawet jak stworzysz osobny plik pod specjalny profil, to będziesz musiał pamiętać, aby go przypadkiem nie dodać do commit'a lub trzymać go gdzieś z boku, co jest słabe. A jak nie Ty, to ktoś inny to w końcu wrzuci do repo (jeśli pracujesz w zespole). Nie znam architektury Twojej aplikacji,
  • Odpowiedz
@mk321: jakoś nie łapię problemu. W pracy środowisk mam nastukane wiele, a że robię w integracji systemów, to endpointów i haseł w każdym jest pełna kombinacja (tego są setki kluczy w yamlach i propertiesach). Jakoś plik/zestaw plików per środowisko to nie jest coś, czego nie można ogarnąć. Wrzuca się to do gita i tam wersjonuje. Narzędzia CI sobie to wdrażają wedle potrzeby. Dla developerów jest oddzielny zestaw konfiguracyjny, który kopiuje
  • Odpowiedz
@globalbus: wrzucasz zaszyfrowane hasła na publiczne repozytoria? Daj link do GitHuba :D

W zamkniętych repozytoriach (nie koniecznie firmowych, bo może być firmowe, ale dostęp mogą mieć niepowołane osoby) może to się sprawdza. Wiem, że admini mają np. repozytoria z samymi hasłami. Ale nie jest to trzymane razem kodem, żeby każdy praktykant mógł to sobie oglądać.
  • Odpowiedz
@mk321: robisz sobie drugi plik a propertiesami no. appliaction-private.yml, dodajesz go do ignora. W głównym application.properties te klucze zostawiasz puste i dodajesz koniecznie nowy profil o nazwie private. Konfigurujesz sobie w application-private.yml co trzeba(klucze, loggery itd) i już :) Nigdy klucze nie polecą do repo a przy okazji będziesz miał fajny pliczek żeby lokalne ustawienia mieć tylko dla siebie
  • Odpowiedz