{"id":1351,"date":"2026-04-01T12:46:24","date_gmt":"2026-04-01T10:46:24","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1351"},"modified":"2026-04-20T12:49:54","modified_gmt":"2026-04-20T10:49:54","slug":"konfiguracje-aplikacji","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/01\/konfiguracje-aplikacji\/","title":{"rendered":"Konfiguracje aplikacji"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">System informatyczny rzadko dzia\u0142a poprawnie wy\u0142\u0105cznie dzi\u0119ki samemu kodowi. O stabilno\u015bci decyduj\u0105 tak\u017ce adresy baz danych, porty, limity pami\u0119ci, klucze dost\u0119pu, ustawienia logowania, poziomy uprawnie\u0144 i spos\u00f3b uruchamiania procesu. B\u0142\u0105d w jednym parametrze potrafi zatrzyma\u0107 sprzeda\u017c, zablokowa\u0107 u\u017cytkownik\u00f3w albo doprowadzi\u0107 do utraty danych. W praktyce ca\u0142y ten obszar sprowadza si\u0119 do tego, czym s\u0105 <strong>konfiguracje aplikacji<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#dlaczego-konfiguracje-aplikacji-decyduja-o-stabilnosci-systemu-bardziej-niz-sam-kod-zrodlowy\">Dlaczego Konfiguracje aplikacji decyduj\u0105 o stabilno\u015bci systemu bardziej ni\u017c sam kod \u017ar\u00f3d\u0142owy<\/a><\/li><li><a href=\"#podstawowe-zrodla-konfiguracji-i-roznice-miedzy-plikami-zmiennymi-srodowiskowymi-oraz-parametrami-startowymi\">Podstawowe \u017ar\u00f3d\u0142a konfiguracji i r\u00f3\u017cnice mi\u0119dzy plikami, zmiennymi \u015brodowiskowymi oraz parametrami startowymi<\/a><ol><li><a href=\"#pliki-konfiguracyjne\">Pliki konfiguracyjne<\/a><\/li><li><a href=\"#zmienne-srodowiskowe\">Zmienne \u015brodowiskowe<\/a><\/li><li><a href=\"#parametry-uruchomieniowe\">Parametry uruchomieniowe<\/a><\/li><li><a href=\"#tabela-porownawcza\">Tabela por\u00f3wnawcza<\/a><\/li><\/ol><\/li><li><a href=\"#konfiguracje-aplikacji-w-srodowiskach-deweloperskich-testowych-i-produkcyjnych-nie-moga-byc-identyczne\">Konfiguracje aplikacji w \u015brodowiskach deweloperskich, testowych i produkcyjnych nie mog\u0105 by\u0107 identyczne<\/a><ol><li><a href=\"#srodowisko-developerskie\">\u015arodowisko developerskie<\/a><\/li><li><a href=\"#srodowisko-testowe\">\u015arodowisko testowe<\/a><\/li><li><a href=\"#srodowisko-produkcyjne\">\u015arodowisko produkcyjne<\/a><\/li><\/ol><\/li><li><a href=\"#przyklady-techniczne-w-c-c-i-python-pokazujace-odczyt-ustawien-z-zewnetrznych-zrodel\">Przyk\u0142ady techniczne w C, C++ i Python pokazuj\u0105ce odczyt ustawie\u0144 z zewn\u0119trznych \u017ar\u00f3de\u0142<\/a><\/li><li><a href=\"#walidacja-ustawien-na-starcie-procesu-i-powod-dla-ktorego-brak-kontroli-konczy-sie-awaria-po-godzinach-pracy\">Walidacja ustawie\u0144 na starcie procesu i pow\u00f3d, dla kt\u00f3rego brak kontroli ko\u0144czy si\u0119 awari\u0105 po godzinach pracy<\/a><ol><li><a href=\"#prosty-wzor-walidacyjny\">Prosty wz\u00f3r walidacyjny<\/a><\/li><\/ol><\/li><li><a href=\"#bezpieczne-konfiguracje-aplikacji-przy-wdrozeniach-wymagaja-oddzielenia-sekretow-od-zwyklych-ustawien\">Bezpieczne Konfiguracje aplikacji przy wdro\u017ceniach wymagaj\u0105 oddzielenia sekret\u00f3w od zwyk\u0142ych ustawie\u0144<\/a><ol><li><a href=\"#parametry-zwykle\">Parametry zwyk\u0142e<\/a><\/li><li><a href=\"#sekrety\">Sekrety<\/a><\/li><\/ol><\/li><li><a href=\"#najczestsze-bledy-praktyczne-ktore-powoduja-realne-straty-czasu-i-pieniedzy\">Najcz\u0119stsze b\u0142\u0119dy praktyczne, kt\u00f3re powoduj\u0105 realne straty czasu i pieni\u0119dzy<\/a><ol><li><a href=\"#wartosci-domyslne-ukrywajace-blad\">Warto\u015bci domy\u015blne ukrywaj\u0105ce b\u0142\u0105d<\/a><\/li><li><a href=\"#rozne-nazwy-tych-samych-parametrow\">R\u00f3\u017cne nazwy tych samych parametr\u00f3w<\/a><\/li><li><a href=\"#brak-dokumentacji\">Brak dokumentacji<\/a><\/li><li><a href=\"#brak-wersjonowania\">Brak wersjonowania<\/a><\/li><li><a href=\"#logowanie-sekretow\">Logowanie sekret\u00f3w<\/a><\/li><\/ol><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-plik-env-nadaje-sie-na-produkcje\">Czy plik .env nadaje si\u0119 na produkcj\u0119?<\/a><\/li><li><a href=\"#dlaczego-nie-warto-wpisywac-ustawien-bezposrednio-w-kodzie\">Dlaczego nie warto wpisywa\u0107 ustawie\u0144 bezpo\u015brednio w kodzie?<\/a><\/li><li><a href=\"#czy-wszystkie-ustawienia-powinny-byc-walidowane-przy-starcie\">Czy wszystkie ustawienia powinny by\u0107 walidowane przy starcie?<\/a><\/li><li><a href=\"#czy-mozna-trzymac-hasla-w-plikach-json-lub-yaml\">Czy mo\u017cna trzyma\u0107 has\u0142a w plikach JSON lub YAML?<\/a><\/li><li><a href=\"#ile-parametrow-powinno-byc-konfigurowalnych\">Ile parametr\u00f3w powinno by\u0107 konfigurowalnych?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dlaczego-konfiguracje-aplikacji-decyduja-o-stabilnosci-systemu-bardziej-niz-sam-kod-zrodlowy\">Dlaczego Konfiguracje aplikacji decyduj\u0105 o stabilno\u015bci systemu bardziej ni\u017c sam kod \u017ar\u00f3d\u0142owy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kod programu opisuje logik\u0119 dzia\u0142ania, ale nie powinien zawiera\u0107 wszystkich warto\u015bci potrzebnych do uruchomienia systemu. Gdyby adres serwera bazy danych, has\u0142o administratora i numer portu by\u0142y zapisane na sta\u0142e w kodzie, ka\u017cda zmiana wymaga\u0142aby rekompilacji, ponownego wdro\u017cenia i ryzyka b\u0142\u0119du.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze zaprojektowany system oddziela logik\u0119 od parametr\u00f3w uruchomieniowych. Program \u201ewie\u201d, co ma robi\u0107, ale warto\u015bci pobiera z zewn\u0119trznych \u017ar\u00f3de\u0142. Dzi\u0119ki temu ta sama wersja aplikacji mo\u017ce dzia\u0142a\u0107 lokalnie na komputerze programisty, na serwerze testowym i w \u015brodowisku produkcyjnym.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej konfigurowane elementy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>po\u0142\u0105czenie z baz\u0105 danych<\/li>\n\n\n\n<li>adresy us\u0142ug zewn\u0119trznych API<\/li>\n\n\n\n<li>port nas\u0142uchiwania serwera<\/li>\n\n\n\n<li>poziom logowania (debug, info, warning, error)<\/li>\n\n\n\n<li>limity pami\u0119ci i czasu odpowiedzi<\/li>\n\n\n\n<li>klucze API i tokeny dost\u0119pu<\/li>\n\n\n\n<li>parametry cache<\/li>\n\n\n\n<li>ustawienia kolejek i broker\u00f3w wiadomo\u015bci<\/li>\n\n\n\n<li>adresy serwer\u00f3w SMTP<\/li>\n\n\n\n<li>ustawienia backupu i retencji danych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Brak rozdzielenia tych warstw powoduje typowe problemy: przypadkowe u\u017cycie produkcyjnej bazy podczas test\u00f3w, wyciek hase\u0142 do repozytorium Git albo niekontrolowane r\u00f3\u017cnice mi\u0119dzy \u015brodowiskami.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"podstawowe-zrodla-konfiguracji-i-roznice-miedzy-plikami-zmiennymi-srodowiskowymi-oraz-parametrami-startowymi\">Podstawowe \u017ar\u00f3d\u0142a konfiguracji i r\u00f3\u017cnice mi\u0119dzy plikami, zmiennymi \u015brodowiskowymi oraz parametrami startowymi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Konfiguracja mo\u017ce by\u0107 dostarczana na kilka sposob\u00f3w. Ka\u017cdy ma inne zastosowanie i inne ryzyko.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pliki-konfiguracyjne\">Pliki konfiguracyjne<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej spotykane formaty:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code><\/li>\n\n\n\n<li><code>.ini<\/code><\/li>\n\n\n\n<li><code>.yaml<\/code><\/li>\n\n\n\n<li><code>.json<\/code><\/li>\n\n\n\n<li><code>.xml<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Plik jest prosty do odczytu i wygodny podczas lokalnej pracy. Problem pojawia si\u0119 wtedy, gdy trafia do repozytorium razem z has\u0142ami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zmienne-srodowiskowe\">Zmienne \u015brodowiskowe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">System operacyjny przekazuje procesowi warto\u015bci podczas uruchomienia. To popularne rozwi\u0105zanie w Dockerze, Kubernetesie i systemach CI\/CD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zalety:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>brak danych w kodzie<\/li>\n\n\n\n<li>\u0142atwa zmiana bez przebudowy aplikacji<\/li>\n\n\n\n<li>dobre wsparcie w chmurze<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wady:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>trudniejsze debugowanie<\/li>\n\n\n\n<li>\u0142atwo o brak jednej zmiennej<\/li>\n\n\n\n<li>s\u0142absza czytelno\u015b\u0107 przy du\u017cej liczbie parametr\u00f3w<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"parametry-uruchomieniowe\">Parametry uruchomieniowe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przekazywane bezpo\u015brednio przy starcie programu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>.\/program --port=8080 --mode=prod<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobre dla prostych narz\u0119dzi CLI, mniej wygodne dla du\u017cych system\u00f3w serwerowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-porownawcza\">Tabela por\u00f3wnawcza<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u0179r\u00f3d\u0142o<\/th><th>Zalety<\/th><th>Wady<\/th><th>Typowe u\u017cycie<\/th><\/tr><\/thead><tbody><tr><td>Plik <code>.env<\/code><\/td><td>prostota, czytelno\u015b\u0107<\/td><td>ryzyko wycieku danych<\/td><td>lokalny development<\/td><\/tr><tr><td>Zmienne \u015brodowiskowe<\/td><td>bezpiecze\u0144stwo wdro\u017ce\u0144<\/td><td>trudniejsza diagnostyka<\/td><td>produkcja, kontenery<\/td><\/tr><tr><td>Parametry CLI<\/td><td>szybka zmiana warto\u015bci<\/td><td>s\u0142aba skalowalno\u015b\u0107<\/td><td>narz\u0119dzia konsolowe<\/td><\/tr><tr><td>Centralny serwer ustawie\u0144<\/td><td>kontrola i audyt<\/td><td>wi\u0119ksza z\u0142o\u017cono\u015b\u0107<\/td><td>du\u017ce systemy<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"konfiguracje-aplikacji-w-srodowiskach-deweloperskich-testowych-i-produkcyjnych-nie-moga-byc-identyczne\">Konfiguracje aplikacji w \u015brodowiskach deweloperskich, testowych i produkcyjnych nie mog\u0105 by\u0107 identyczne<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To cz\u0119sty b\u0142\u0105d pocz\u0105tkuj\u0105cych zespo\u0142\u00f3w. Ustawienia lokalne nie powinny by\u0107 kopiowane na produkcj\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"srodowisko-developerskie\">\u015arodowisko developerskie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Priorytetem jest szybko\u015b\u0107 pracy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowe cechy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pe\u0142ne logi debug<\/li>\n\n\n\n<li>lokalna baza danych<\/li>\n\n\n\n<li>wy\u0142\u0105czone limity wydajno\u015bciowe<\/li>\n\n\n\n<li>testowe klucze API<\/li>\n\n\n\n<li>uproszczona autoryzacja<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"srodowisko-testowe\">\u015arodowisko testowe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ma mo\u017cliwie wiernie odwzorowa\u0107 produkcj\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowe cechy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>realistyczne dane testowe<\/li>\n\n\n\n<li>pe\u0142na \u015bcie\u017cka autoryzacji<\/li>\n\n\n\n<li>monitoring b\u0142\u0119d\u00f3w<\/li>\n\n\n\n<li>kontrola wersji konfiguracji<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"srodowisko-produkcyjne\">\u015arodowisko produkcyjne<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze s\u0105 bezpiecze\u0144stwo i przewidywalno\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowe cechy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>minimalny poziom dost\u0119pu<\/li>\n\n\n\n<li>pe\u0142ny backup<\/li>\n\n\n\n<li>rotacja sekret\u00f3w<\/li>\n\n\n\n<li>audyt zmian<\/li>\n\n\n\n<li>ograniczone logowanie danych wra\u017cliwych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Problem zaczyna si\u0119 wtedy, gdy programista testuje lokalnie na SQLite, a produkcja dzia\u0142a na PostgreSQL. Kod dzia\u0142a \u201eu mnie\u201d, ale nie dzia\u0142a po wdro\u017ceniu. To zwykle nie jest problem algorytmu, tylko r\u00f3\u017cnic \u015brodowiskowych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"przyklady-techniczne-w-c-c-i-python-pokazujace-odczyt-ustawien-z-zewnetrznych-zrodel\">Przyk\u0142ady techniczne w C, C++ i Python pokazuj\u0105ce odczyt ustawie\u0144 z zewn\u0119trznych \u017ar\u00f3de\u0142<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej proste przyk\u0142ady bez framework\u00f3w.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n#include &lt;stdlib.h&gt;\\n\\nint main() {\\n char *port = getenv(\\\"APP_PORT\\\");\\n\\n if (port == NULL) {\\n printf(\\\"Brak zmiennej APP_PORT\\\\n\\\");\\n return 1;\\n }\\n\\n printf(\\\"Port: %s\\\\n\\\", port);\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\n#include &lt;cstdlib&gt;\\n\\nint main() {\\n const char* host = std::getenv(\\\"DB_HOST\\\");\\n\\n if (!host) {\\n std::cout &lt;&lt; \\\"Brak DB_HOST\\\" &lt;&lt; std::endl;\\n return 1;\\n }\\n\\n std::cout &lt;&lt; \\\"Host bazy: \\\" &lt;&lt; host &lt;&lt; std::endl;\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\nimport os\\n\\nport = os.getenv(\\\"APP_PORT\\\")\\n\\nif port is None:\\n print(\\\"Brak APP_PORT\\\")\\nelse:\\n print(\\\"Port:\\\", port)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W ka\u017cdym przypadku program nie zak\u0142ada warto\u015bci na sta\u0142e. Dzi\u0119ki temu mo\u017cna uruchomi\u0107 t\u0119 sam\u0105 wersj\u0119 kodu w r\u00f3\u017cnych \u015brodowiskach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"walidacja-ustawien-na-starcie-procesu-i-powod-dla-ktorego-brak-kontroli-konczy-sie-awaria-po-godzinach-pracy\">Walidacja ustawie\u0144 na starcie procesu i pow\u00f3d, dla kt\u00f3rego brak kontroli ko\u0144czy si\u0119 awari\u0105 po godzinach pracy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo z\u0142y scenariusz wygl\u0105da tak: aplikacja startuje poprawnie, ale po dw\u00f3ch godzinach okazuje si\u0119, \u017ce brakuje dost\u0119pu do magazynu plik\u00f3w. U\u017cytkownik widzi b\u0142\u0105d dopiero podczas wysy\u0142ania dokumentu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lepsze podej\u015bcie: pe\u0142na walidacja podczas startu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nale\u017cy sprawdza\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czy wymagane zmienne istniej\u0105<\/li>\n\n\n\n<li>czy port jest liczb\u0105 z poprawnego zakresu<\/li>\n\n\n\n<li>czy adres URL ma poprawny format<\/li>\n\n\n\n<li>czy po\u0142\u0105czenie z baz\u0105 jest mo\u017cliwe<\/li>\n\n\n\n<li>czy katalog backupu istnieje<\/li>\n\n\n\n<li>czy certyfikat nie wygas\u0142<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To skraca diagnostyk\u0119 z kilku godzin do kilku sekund.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prosty-wzor-walidacyjny\">Prosty wz\u00f3r walidacyjny<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zagadnienie<\/th><th>Wz\u00f3r \/ zapis<\/th><\/tr><\/thead><tbody><tr><td>Zakres portu TCP<\/td><td><code>1 \u2264 port \u2264 65535<\/code><\/td><\/tr><tr><td>Timeout po\u0142\u0105czenia<\/td><td><code>t &gt; 0<\/code><\/td><\/tr><tr><td>Limit pami\u0119ci<\/td><td><code>RAM \u2265 wymagania procesu + zapas operacyjny<\/code><\/td><\/tr><tr><td>Liczba replik<\/td><td><code>n \u2265 2<\/code> dla podstawowej odporno\u015bci<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"bezpieczne-konfiguracje-aplikacji-przy-wdrozeniach-wymagaja-oddzielenia-sekretow-od-zwyklych-ustawien\">Bezpieczne Konfiguracje aplikacji przy wdro\u017ceniach wymagaj\u0105 oddzielenia sekret\u00f3w od zwyk\u0142ych ustawie\u0144<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nie ka\u017cda warto\u015b\u0107 ma ten sam poziom ryzyka.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adres serwera SMTP nie jest tak wra\u017cliwy jak has\u0142o do tego serwera. Klucz JWT nie powinien by\u0107 przechowywany tak samo jak numer portu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobr\u0105 praktyk\u0105 jest podzia\u0142:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"parametry-zwykle\">Parametry zwyk\u0142e<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>porty<\/li>\n\n\n\n<li>nazwy us\u0142ug<\/li>\n\n\n\n<li>limity<\/li>\n\n\n\n<li>tryb debug<\/li>\n\n\n\n<li>adresy endpoint\u00f3w<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sekrety\">Sekrety<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>has\u0142a<\/li>\n\n\n\n<li>tokeny<\/li>\n\n\n\n<li>certyfikaty<\/li>\n\n\n\n<li>klucze API<\/li>\n\n\n\n<li>dane dost\u0119powe do chmury<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Sekrety powinny trafia\u0107 do narz\u0119dzi typu Vault, Secret Manager lub bezpiecznych mechanizm\u00f3w platformy kontenerowej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najgorszy przypadek to commit z has\u0142em do repozytorium publicznego. Nawet je\u015bli zostanie usuni\u0119ty po minucie, cz\u0119sto jest ju\u017c za p\u00f3\u017ano. Historia Git oraz boty skanuj\u0105ce publiczne repozytoria dzia\u0142aj\u0105 bardzo szybko.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-bledy-praktyczne-ktore-powoduja-realne-straty-czasu-i-pieniedzy\">Najcz\u0119stsze b\u0142\u0119dy praktyczne, kt\u00f3re powoduj\u0105 realne straty czasu i pieni\u0119dzy<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wartosci-domyslne-ukrywajace-blad\">Warto\u015bci domy\u015blne ukrywaj\u0105ce b\u0142\u0105d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Program uruchamia si\u0119 bez has\u0142a, bo system ustawia pusty ci\u0105g znak\u00f3w jako warto\u015b\u0107 domy\u015bln\u0105. Efekt: awaria pojawia si\u0119 dopiero w ruchu produkcyjnym.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rozne-nazwy-tych-samych-parametrow\">R\u00f3\u017cne nazwy tych samych parametr\u00f3w<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DB_HOST<\/code>, <code>DATABASE_HOST<\/code>, <code>POSTGRES_HOST<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Po kilku miesi\u0105cach nikt nie wie, kt\u00f3ra warto\u015b\u0107 jest w\u0142a\u015bciwa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-dokumentacji\">Brak dokumentacji<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nowy administrator nie wie, kt\u00f3re ustawienia s\u0105 obowi\u0105zkowe. Wdro\u017cenie trwa trzy dni zamiast jednej godziny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-wersjonowania\">Brak wersjonowania<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zmiana parametru zosta\u0142a wykonana r\u0119cznie na serwerze i nie zosta\u0142a nigdzie zapisana. Po restarcie problem wraca.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"logowanie-sekretow\">Logowanie sekret\u00f3w<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To bardzo cz\u0119sty b\u0142\u0105d. Log systemowy nie mo\u017ce zawiera\u0107 pe\u0142nych token\u00f3w i hase\u0142.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-plik-env-nadaje-sie-na-produkcje\">Czy plik <code>.env<\/code> nadaje si\u0119 na produkcj\u0119?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, ale tylko je\u015bli jest odpowiednio chroniony i nie trafia do repozytorium. W wi\u0119kszych systemach cz\u0119\u015bciej stosuje si\u0119 mened\u017cery sekret\u00f3w oraz zmienne \u015brodowiskowe zarz\u0105dzane centralnie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-nie-warto-wpisywac-ustawien-bezposrednio-w-kodzie\">Dlaczego nie warto wpisywa\u0107 ustawie\u0144 bezpo\u015brednio w kodzie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda zmiana wymaga wtedy nowego wdro\u017cenia. Dodatkowo ro\u015bnie ryzyko wycieku danych i trudniej utrzyma\u0107 r\u00f3\u017cne \u015brodowiska.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-wszystkie-ustawienia-powinny-byc-walidowane-przy-starcie\">Czy wszystkie ustawienia powinny by\u0107 walidowane przy starcie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, szczeg\u00f3lnie te zwi\u0105zane z bezpiecze\u0144stwem, baz\u0105 danych i komunikacj\u0105 sieciow\u0105. Lepiej zatrzyma\u0107 proces od razu ni\u017c dopu\u015bci\u0107 do cichej awarii p\u00f3\u017aniej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-trzymac-hasla-w-plikach-json-lub-yaml\">Czy mo\u017cna trzyma\u0107 has\u0142a w plikach JSON lub YAML?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Technicznie mo\u017cna, ale operacyjnie to s\u0142abe rozwi\u0105zanie. Lepsze s\u0105 systemy przeznaczone do przechowywania sekret\u00f3w z kontrol\u0105 dost\u0119pu i audytem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ile-parametrow-powinno-byc-konfigurowalnych\">Ile parametr\u00f3w powinno by\u0107 konfigurowalnych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tylko tyle, ile rzeczywi\u015bcie wymaga zmiany mi\u0119dzy \u015brodowiskami lub wdro\u017ceniami. Nadmiar ustawie\u0144 utrudnia utrzymanie i zwi\u0119ksza liczb\u0119 b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze zaprojektowany system nie opiera si\u0119 na przypadkowych ustawieniach zmienianych r\u0119cznie na serwerze. Parametry musz\u0105 by\u0107 przewidywalne, kontrolowane i mo\u017cliwe do odtworzenia. To nie jest detal administracyjny, tylko element architektury wp\u0142ywaj\u0105cy bezpo\u015brednio na bezpiecze\u0144stwo, koszt utrzymania i odporno\u015b\u0107 ca\u0142ego rozwi\u0105zania.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>System informatyczny rzadko dzia\u0142a poprawnie wy\u0142\u0105cznie dzi\u0119ki samemu kodowi. O stabilno\u015bci decyduj\u0105 tak\u017ce adresy baz danych, porty, limity pami\u0119ci, klucze dost\u0119pu, ustawienia logowania, poziomy uprawnie\u0144 i spos\u00f3b uruchamiania procesu. B\u0142\u0105d w jednym parametrze potrafi zatrzyma\u0107 sprzeda\u017c, zablokowa\u0107 u\u017cytkownik\u00f3w albo doprowadzi\u0107 do utraty danych. W praktyce ca\u0142y ten obszar sprowadza si\u0119 do tego, czym s\u0105 konfiguracje aplikacji. Dlaczego Konfiguracje aplikacji decyduj\u0105 o stabilno\u015bci systemu bardziej ni\u017c sam kod \u017ar\u00f3d\u0142owy Kod programu opisuje logik\u0119 dzia\u0142ania, ale nie powinien zawiera\u0107 wszystkich warto\u015bci potrzebnych do uruchomienia systemu. Gdyby adres serwera bazy danych, has\u0142o administratora i numer portu by\u0142y zapisane na sta\u0142e w kodzie, ka\u017cda zmiana wymaga\u0142aby rekompilacji, ponownego wdro\u017cenia i ryzyka b\u0142\u0119du. Dobrze zaprojektowany system oddziela logik\u0119 od parametr\u00f3w uruchomieniowych. Program \u201ewie\u201d, co ma robi\u0107, ale warto\u015bci pobiera z zewn\u0119trznych \u017ar\u00f3de\u0142. Dzi\u0119ki temu ta sama wersja aplikacji mo\u017ce dzia\u0142a\u0107 lokalnie na komputerze programisty, na serwerze testowym i w \u015brodowisku produkcyjnym. Najcz\u0119\u015bciej konfigurowane elementy: Brak rozdzielenia tych warstw powoduje typowe problemy: przypadkowe u\u017cycie produkcyjnej bazy podczas test\u00f3w, wyciek hase\u0142 do repozytorium Git albo niekontrolowane r\u00f3\u017cnice mi\u0119dzy \u015brodowiskami. Podstawowe \u017ar\u00f3d\u0142a konfiguracji i r\u00f3\u017cnice mi\u0119dzy plikami, zmiennymi \u015brodowiskowymi oraz parametrami startowymi Konfiguracja mo\u017ce by\u0107 dostarczana na kilka sposob\u00f3w. Ka\u017cdy ma inne zastosowanie i inne ryzyko. Pliki konfiguracyjne Najcz\u0119\u015bciej spotykane formaty: Plik jest prosty do odczytu i wygodny podczas lokalnej pracy. Problem pojawia si\u0119 wtedy, gdy trafia do repozytorium razem z has\u0142ami. Zmienne \u015brodowiskowe System operacyjny przekazuje procesowi warto\u015bci podczas uruchomienia. To popularne rozwi\u0105zanie w Dockerze, Kubernetesie i systemach CI\/CD. Zalety: Wady: Parametry uruchomieniowe Przekazywane bezpo\u015brednio przy starcie programu. Przyk\u0142ad: .\/program &#8211;port=8080 &#8211;mode=prod Dobre dla prostych narz\u0119dzi CLI, mniej wygodne dla du\u017cych system\u00f3w serwerowych. Tabela por\u00f3wnawcza \u0179r\u00f3d\u0142o Zalety Wady Typowe u\u017cycie Plik .env prostota, czytelno\u015b\u0107 ryzyko wycieku danych lokalny development Zmienne \u015brodowiskowe bezpiecze\u0144stwo wdro\u017ce\u0144 trudniejsza diagnostyka produkcja, kontenery Parametry CLI szybka zmiana warto\u015bci s\u0142aba skalowalno\u015b\u0107 narz\u0119dzia konsolowe Centralny serwer ustawie\u0144 kontrola i audyt wi\u0119ksza z\u0142o\u017cono\u015b\u0107 du\u017ce systemy Konfiguracje aplikacji w \u015brodowiskach deweloperskich, testowych i produkcyjnych nie mog\u0105 by\u0107 identyczne To cz\u0119sty b\u0142\u0105d pocz\u0105tkuj\u0105cych zespo\u0142\u00f3w. Ustawienia lokalne nie powinny by\u0107 kopiowane na produkcj\u0119. \u015arodowisko developerskie Priorytetem jest szybko\u015b\u0107 pracy. Typowe cechy: \u015arodowisko testowe Ma mo\u017cliwie wiernie odwzorowa\u0107 produkcj\u0119. Typowe cechy: \u015arodowisko produkcyjne Najwa\u017cniejsze s\u0105 bezpiecze\u0144stwo i przewidywalno\u015b\u0107. Typowe cechy: Problem zaczyna si\u0119 wtedy, gdy programista testuje lokalnie na SQLite, a produkcja dzia\u0142a na PostgreSQL. Kod dzia\u0142a \u201eu mnie\u201d, ale nie dzia\u0142a po wdro\u017ceniu. To zwykle nie jest problem algorytmu, tylko r\u00f3\u017cnic \u015brodowiskowych. Przyk\u0142ady techniczne w C, C++ i Python pokazuj\u0105ce odczyt ustawie\u0144 z zewn\u0119trznych \u017ar\u00f3de\u0142 Poni\u017cej proste przyk\u0142ady bez framework\u00f3w. J\u0119zyk Kod C c\\n#include &lt;stdio.h&gt;\\n#include &lt;stdlib.h&gt;\\n\\nint main() {\\n char *port = getenv(\\&#8221;APP_PORT\\&#8221;);\\n\\n if (port == NULL) {\\n printf(\\&#8221;Brak zmiennej APP_PORT\\\\n\\&#8221;);\\n return 1;\\n }\\n\\n printf(\\&#8221;Port: %s\\\\n\\&#8221;, port);\\n return 0;\\n}\\n C++ cpp\\n#include &lt;iostream&gt;\\n#include &lt;cstdlib&gt;\\n\\nint main() {\\n const char* host = std::getenv(\\&#8221;DB_HOST\\&#8221;);\\n\\n if (!host) {\\n std::cout &lt;&lt; \\&#8221;Brak DB_HOST\\&#8221; &lt;&lt; std::endl;\\n return 1;\\n }\\n\\n std::cout &lt;&lt; \\&#8221;Host bazy: \\&#8221; &lt;&lt; host &lt;&lt; std::endl;\\n return 0;\\n}\\n Python python\\nimport os\\n\\nport = os.getenv(\\&#8221;APP_PORT\\&#8221;)\\n\\nif port is None:\\n print(\\&#8221;Brak APP_PORT\\&#8221;)\\nelse:\\n print(\\&#8221;Port:\\&#8221;, port)\\n W ka\u017cdym przypadku program nie zak\u0142ada warto\u015bci na sta\u0142e. Dzi\u0119ki temu mo\u017cna uruchomi\u0107 t\u0119 sam\u0105 wersj\u0119 kodu w r\u00f3\u017cnych \u015brodowiskach. Walidacja ustawie\u0144 na starcie procesu i pow\u00f3d, dla kt\u00f3rego brak kontroli ko\u0144czy si\u0119 awari\u0105 po godzinach pracy Bardzo z\u0142y scenariusz wygl\u0105da tak: aplikacja startuje poprawnie, ale po dw\u00f3ch godzinach okazuje si\u0119, \u017ce brakuje dost\u0119pu do magazynu plik\u00f3w. U\u017cytkownik widzi b\u0142\u0105d dopiero podczas wysy\u0142ania dokumentu. Lepsze podej\u015bcie: pe\u0142na walidacja podczas startu. Nale\u017cy sprawdza\u0107: To skraca diagnostyk\u0119 z kilku godzin do kilku sekund. Prosty wz\u00f3r walidacyjny Zagadnienie Wz\u00f3r \/ zapis Zakres portu TCP 1 \u2264 port \u2264 65535 Timeout po\u0142\u0105czenia t &gt; 0 Limit pami\u0119ci RAM \u2265 wymagania procesu + zapas operacyjny Liczba replik n \u2265 2 dla podstawowej odporno\u015bci Bezpieczne Konfiguracje aplikacji przy wdro\u017ceniach wymagaj\u0105 oddzielenia sekret\u00f3w od zwyk\u0142ych ustawie\u0144 Nie ka\u017cda warto\u015b\u0107 ma ten sam poziom ryzyka. Adres serwera SMTP nie jest tak wra\u017cliwy jak has\u0142o do tego serwera. Klucz JWT nie powinien by\u0107 przechowywany tak samo jak numer portu. Dobr\u0105 praktyk\u0105 jest podzia\u0142: Parametry zwyk\u0142e Sekrety Sekrety powinny trafia\u0107 do narz\u0119dzi typu Vault, Secret Manager lub bezpiecznych mechanizm\u00f3w platformy kontenerowej. Najgorszy przypadek to commit z has\u0142em do repozytorium publicznego. Nawet je\u015bli zostanie usuni\u0119ty po minucie, cz\u0119sto jest ju\u017c za p\u00f3\u017ano. Historia Git oraz boty skanuj\u0105ce publiczne repozytoria dzia\u0142aj\u0105 bardzo szybko. Najcz\u0119stsze b\u0142\u0119dy praktyczne, kt\u00f3re powoduj\u0105 realne straty czasu i pieni\u0119dzy Warto\u015bci domy\u015blne ukrywaj\u0105ce b\u0142\u0105d Program uruchamia si\u0119 bez has\u0142a, bo system ustawia pusty ci\u0105g znak\u00f3w jako warto\u015b\u0107 domy\u015bln\u0105. Efekt: awaria pojawia si\u0119 dopiero w ruchu produkcyjnym. R\u00f3\u017cne nazwy tych samych parametr\u00f3w DB_HOST, DATABASE_HOST, POSTGRES_HOST Po kilku miesi\u0105cach nikt nie wie, kt\u00f3ra warto\u015b\u0107 jest w\u0142a\u015bciwa. Brak dokumentacji Nowy administrator nie wie, kt\u00f3re ustawienia s\u0105 obowi\u0105zkowe. Wdro\u017cenie trwa trzy dni zamiast jednej godziny. Brak wersjonowania Zmiana parametru zosta\u0142a wykonana r\u0119cznie na serwerze i nie zosta\u0142a nigdzie zapisana. Po restarcie problem wraca. Logowanie sekret\u00f3w To bardzo cz\u0119sty b\u0142\u0105d. Log systemowy nie mo\u017ce zawiera\u0107 pe\u0142nych token\u00f3w i hase\u0142. FAQ Czy plik .env nadaje si\u0119 na produkcj\u0119? Tak, ale tylko je\u015bli jest odpowiednio chroniony i nie trafia do repozytorium. W wi\u0119kszych systemach cz\u0119\u015bciej stosuje si\u0119 mened\u017cery sekret\u00f3w oraz zmienne \u015brodowiskowe zarz\u0105dzane centralnie. Dlaczego nie warto wpisywa\u0107 ustawie\u0144 bezpo\u015brednio w kodzie? Ka\u017cda zmiana wymaga wtedy nowego wdro\u017cenia. Dodatkowo ro\u015bnie ryzyko wycieku danych i trudniej utrzyma\u0107 r\u00f3\u017cne \u015brodowiska. Czy wszystkie ustawienia powinny by\u0107 walidowane przy starcie? Tak, szczeg\u00f3lnie te zwi\u0105zane z bezpiecze\u0144stwem, baz\u0105 danych i komunikacj\u0105 sieciow\u0105. Lepiej zatrzyma\u0107 proces od razu ni\u017c dopu\u015bci\u0107 do cichej awarii p\u00f3\u017aniej. Czy mo\u017cna trzyma\u0107 has\u0142a w plikach JSON lub YAML? Technicznie mo\u017cna, ale operacyjnie to s\u0142abe rozwi\u0105zanie. Lepsze s\u0105 systemy przeznaczone do przechowywania sekret\u00f3w z kontrol\u0105 dost\u0119pu i audytem. Ile parametr\u00f3w powinno by\u0107 konfigurowalnych? Tylko tyle, ile rzeczywi\u015bcie wymaga zmiany mi\u0119dzy \u015brodowiskami lub wdro\u017ceniami. Nadmiar ustawie\u0144 utrudnia utrzymanie i zwi\u0119ksza liczb\u0119 b\u0142\u0119d\u00f3w. Dobrze zaprojektowany system nie opiera si\u0119 na przypadkowych ustawieniach zmienianych r\u0119cznie na serwerze. Parametry musz\u0105 by\u0107 przewidywalne, kontrolowane i mo\u017cliwe do odtworzenia. To nie jest detal administracyjny, tylko element architektury wp\u0142ywaj\u0105cy bezpo\u015brednio na bezpiecze\u0144stwo, koszt utrzymania i odporno\u015b\u0107 ca\u0142ego rozwi\u0105zania. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1352,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,1],"tags":[],"class_list":["post-1351","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie","category-poradnik"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1351"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1351\/revisions"}],"predecessor-version":[{"id":1353,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1351\/revisions\/1353"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1352"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}