Generator .env.example
Szablon zmiennych środowiskowych dla Laravela, Node.js i Pythona oraz zamiana gotowego .env w plik bez sekretów.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Gotowe zestawy
Do 60 znaków. Nazwa ze spacją lub polskimi znakami trafi do pliku w cudzysłowie.
Zmiennych
Puste wartości
Do uzupełnienia w .env
Sekcji
Linii
Rozmiar
- Utwórz lokalny plik .env z szablonu
cp .env.example .env - Wygeneruj APP_KEY (wpisze się do .env)
php artisan key:generate - Upewnij się, że .env jest ignorowany przez Git
echo ".env" >> .gitignore
Co oznacza każda zmienna (26)
| Zmienna | Wartość w szablonie | Do czego służy |
|---|---|---|
| APP_NAME | MyApp | Nazwa aplikacji, używana m.in. w tytułach i stopkach e-maili. |
| APP_ENV | local | Środowisko uruchomienia: local, staging albo production. |
| APP_KEY | pusta, uzupełnij w .env | Klucz szyfrowania Laravela (sesje, ciasteczka). Wygeneruj: php artisan key:generate. |
| APP_DEBUG | true | Szczegółowe błędy na stronie. Na produkcji zawsze false. |
| APP_URL | http://localhost | Bazowy adres aplikacji, używany w linkach generowanych poza żądaniem HTTP. |
| LOG_CHANNEL | stack | Kanał logów; stack zapisuje do kilku kanałów jednocześnie. |
| LOG_LEVEL | debug | Najniższy zapisywany poziom logów (debug, info, warning, error…). |
| DB_CONNECTION | mysql | Sterownik bazy danych: mysql, pgsql albo sqlite. |
| DB_HOST | 127.0.0.1 | Adres serwera bazy danych. |
| DB_PORT | 3306 | Port bazy: 3306 dla MySQL/MariaDB, 5432 dla PostgreSQL. |
| DB_DATABASE | laravel | Nazwa bazy danych (dla SQLite: ścieżka do pliku). |
| DB_USERNAME | pusta, uzupełnij w .env | Użytkownik bazy danych. |
| DB_PASSWORD | pusta, uzupełnij w .env | Hasło do bazy danych. Tylko w .env, nigdy w repozytorium. |
| CACHE_STORE | redis | Magazyn cache (Laravel 11+; w starszych wersjach CACHE_DRIVER). |
| SESSION_DRIVER | redis | Gdzie przechowywane są sesje użytkowników. |
| QUEUE_CONNECTION | redis | Połączenie kolejki zadań (sync wykonuje zadania od razu). |
| REDIS_HOST | 127.0.0.1 | Adres serwera Redis. |
| REDIS_PORT | 6379 | Port Redis, domyślnie 6379. |
| REDIS_PASSWORD | null | Hasło Redis; null oznacza brak hasła. |
| MAIL_MAILER | smtp | Sposób wysyłki poczty (smtp, log, ses…). |
| MAIL_HOST | 127.0.0.1 | Serwer SMTP. |
| MAIL_PORT | 2525 | Port SMTP (np. 587 dla STARTTLS, 465 dla SSL). |
| MAIL_USERNAME | pusta, uzupełnij w .env | Login do serwera SMTP. |
| MAIL_PASSWORD | pusta, uzupełnij w .env | Hasło do serwera SMTP. |
| MAIL_FROM_ADDRESS | "[email protected]" | Adres nadawcy wysyłanych wiadomości. |
| MAIL_FROM_NAME | "${APP_NAME}" | Nazwa nadawcy; ${APP_NAME} wstawia wartość APP_NAME. |
Plik .env.example commitujesz do repozytorium, a prawdziwy .env zostaje lokalnie i jest wpisany do .gitignore.
Przetwarzanie odbywa się w Twojej przeglądarce. Zawartość pliku nie jest wysyłana na serwer.
Komentarze zostają bez zmian, a wykrywanie wrażliwych wartości opiera się na nazwach kluczy i wyglądzie wartości. Przejrzyj wynik przed commitem.
Ściąga: składnia pliku .env
| Zapis | Znaczenie |
|---|---|
| KLUCZ=wartość | Podstawowy zapis. Najbezpieczniej bez spacji wokół znaku „=”. |
| # komentarz | Linia pomijana przez parser. |
| KLUCZ="dwa słowa" | Wartość ze spacjami albo znakiem # ujmij w cudzysłów. |
| KLUCZ= | Pusta wartość: miejsce do uzupełnienia w lokalnym .env. |
| MAIL_FROM_NAME="${APP_NAME}" | Wstawia wartość innej zmiennej. Laravel: bez cudzysłowów albo w podwójnych; Node.js: wymaga pakietu dotenv-expand. |
| REDIS_PASSWORD=null | W Laravelu env() zamienia null, true i false na wartości PHP, a nie na tekst. |
| export KLUCZ=wartość | Zapis zgodny z powłoką (source .env); akceptują go phpdotenv i python-dotenv. |
.env a .env.example
Plik .env zawiera prawdziwe hasła i klucze, dlatego jest w .gitignore i zostaje na komputerze lub serwerze. Plik .env.example ma te same klucze z pustymi albo przykładowymi wartościami i trafia do repozytorium, więc każda osoba w zespole widzi, co musi ustawić.
Co zostawić puste
Hasła, klucze API, tokeny, APP_KEY, SECRET_KEY, JWT_SECRET i adresy połączeń z loginem w środku (DATABASE_URL). Przykładowe wartości zostaw tylko tam, gdzie nic nie zdradzają: porty, lokalne hosty (127.0.0.1, localhost), tryby i sterowniki.
Sekret trafił do repozytorium
Usunięcie pliku w kolejnym commicie nie wystarczy: wartość zostaje w historii Gita i w każdej kopii repozytorium. Najpierw unieważnij klucz lub zmień hasło, dopiero potem porządkuj historię (np. narzędziem git filter-repo).
Pułapka: cache konfiguracji Laravela
Po php artisan config:cache Laravel nie czyta już pliku .env, a wywołania env() poza katalogiem config/ zwracają null. Zmienne odczytuj przez config(), a po każdej zmianie .env na produkcji zbuduj cache ponownie.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator .env.example – szablon konfiguracji, który bezpiecznie trafia do repozytorium
Generator .env.example składa szablon zmiennych środowiskowych dla Laravela, Node.js i Pythona. Wybierz framework (albo jeden z czterech gotowych zestawów), wpisz nazwę aplikacji, wskaż bazę danych i zdecyduj, czy projekt używa Redisa, poczty i plików w S3. Wynik to plik z pełną listą kluczy pogrupowanych komentarzami sekcji, w którym każdy sekret ma pustą wartość, czyli dokładnie taki, jaki powinien trafić do Gita obok kodu. Masz już działający .env? Wklej go w dolnej części narzędzia, a dostaniesz .env.example z wyczyszczonymi hasłami i kluczami.
Po co .env.example, jeśli .env jest ignorowany
Plik .env z prawdziwym hasłem do bazy i kluczem aplikacji nie ma czego szukać w repozytorium, dlatego trafia do .gitignore. Razem z nim znika jednak jedyna lista mówiąca, jakich zmiennych aplikacja potrzebuje: nowa osoba klonuje projekt i dostaje wyjątek o kluczu, którego nazwy nie ma nigdzie w kodzie. .env.example zamyka tę lukę i jest wersjonowany, więc nowa integracja jest w diffie widoczna jako nowy klucz. Zakładając repozytorium, wygeneruj najpierw listę ignorowanych ścieżek w generatorze .gitignore i sprawdź, czy .env jest na niej, a .env.example nie.
Co generuje generator .env.example
Trzy szablony odpowiadają trzem konwencjom nazewniczym: Laravel trzyma parametry bazy w osobnych zmiennych, Node.js i Python w jednym adresie połączenia DATABASE_URL. Przełączniki Redisa, poczty i S3 dokładają własne bloki, a wynik przechodzi przez deduplikację kluczy. Domyślny zestaw Laravel + MySQL + Redis + poczta daje 26 zmiennych w 5 sekcjach, z czego 5 ma puste wartości do uzupełnienia.
| Sekcja | Laravel / PHP | Node.js | Python |
|---|---|---|---|
| Aplikacja | APP_NAME, APP_ENV, APP_KEY (pusty), APP_DEBUG, APP_URL | NODE_ENV, APP_NAME, PORT, APP_URL | APP_ENV, APP_NAME, DEBUG |
| Logowanie | LOG_CHANNEL, LOG_LEVEL | – | – |
| Uwierzytelnianie | – | JWT_SECRET (pusty) | SECRET_KEY (pusty) |
| Baza danych | DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD | DATABASE_URL, format w komentarzu | DATABASE_URL, format w komentarzu |
| Cache, sesje i kolejki | CACHE_STORE, SESSION_DRIVER, QUEUE_CONNECTION, REDIS_HOST, REDIS_PORT, REDIS_PASSWORD | REDIS_URL | REDIS_URL |
| Poczta | MAIL_MAILER, MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD, MAIL_FROM_ADDRESS, MAIL_FROM_NAME | SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS | EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD |
| Pliki (S3) | FILESYSTEM_DISK, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION, AWS_BUCKET, AWS_USE_PATH_STYLE_ENDPOINT | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION, AWS_STORAGE_BUCKET_NAME |
Przy opcji „Brak / SQLite” Laravel dostaje DB_CONNECTION=sqlite i zakomentowaną ścieżkę do pliku bazy, a w Node.js i Pythonie DATABASE_URL zostaje zakomentowany. Pod wynikiem narzędzie pokazuje rozwijaną tabelę z opisem każdej zmiennej oraz kroki „Co dalej” z poleceniami dla wybranego frameworka.
Zmienna środowiskowa a plik .env
Zmienna środowiskowa jest własnością procesu: ustawia ją system, kontener albo panel hostingu i istnieje niezależnie od plików w katalogu. .env to tylko wygodny sposób załadowania zestawu takich zmiennych na maszynie deweloperskiej – czyta go biblioteka, nie system. Zmienna już obecna w środowisku najczęściej nie zostanie nadpisana wpisem z pliku, dlatego na produkcji .env zwykle nie jest potrzebny: konfigurację wstrzykuje menedżer sekretów albo dyrektywa serwera, na przykład SetEnv z generatora pliku .htaccess. .env.example zostaje kontraktem: mówi, co dostarczyć, nie skąd.
Wartości: puste sekrety, atrapy, cudzysłowy i spacje
Zasada jest jedna: żadna wartość w .env.example nie może być prawdziwa. Klucze podpisu, loginy i hasła zostają puste, żeby aplikacja zgłosiła błąd przy pierwszym uruchomieniu, zamiast po cichu wystartować na wartości z przykładu. Nieszkodliwe ustawienia, takie jak APP_ENV=local, PORT=3000 czy 127.0.0.1, warto wpisać, bo skracają start projektu do jednego cp .env.example .env. Adres bazy generator pokazuje w komentarzu (np. postgres://USER:PASSWORD@localhost:5432/DATABASE), a wartość DATABASE_URL zostawia pustą: w repozytorium nie leży wtedy ciąg wyglądający jak działający login z hasłem. Lokalny REDIS_URL bez hasła jest wpisany od razu.
Osobna pułapka to cytowanie. Wartość bez cudzysłowów kończy się na pierwszej spacji albo na znaku #, więc nazwa z dwóch słów wymaga cudzysłowów. W cudzysłowach podwójnych część bibliotek rozwija ${INNA_ZMIENNA} i sekwencje ucieczki, w apostrofach nie. Generator cytuje nazwę aplikacji tylko wtedy, gdy musi (spacja, polskie znaki), a znaki $, ` i \ z niej usuwa, żeby nie uruchomiły interpolacji:
APP_NAME=MyApp
APP_NAME="Acme Shop"
MAIL_FROM_NAME="${APP_NAME}"
DB_PASSWORD=
Prawdziwe sekrety tworzysz później i lokalnie. Kroki pod wynikiem podają gotowe polecenia: php artisan key:generate dla Laravela, openssl rand -hex 32 dla JWT_SECRET i python -c "import secrets; print(secrets.token_urlsafe(50))" dla SECRET_KEY.
Jak zamienić gotowy .env na .env.example
Wklej zawartość pliku w polu „Masz już plik .env?” i wybierz tryb. „Tylko wrażliwe wartości” czyści hasła, tokeny, klucze, loginy, adresy hostów i URL-e z danymi logowania, a zostawia porty, tryby, sterowniki, null/true/false, odwołania ${ZMIENNA} oraz lokalne hosty (localhost, 127.0.0.1). „Wszystkie wartości” zostawia same klucze i komentarze. Przykład w pierwszym trybie:
DB_HOST=127.0.0.1 zostaje bez zmian
DB_PORT=3306 zostaje bez zmian
DB_PASSWORD=tajne-haslo → DB_PASSWORD=
STRIPE_SECRET=sk_live_... → STRIPE_SECRET=
Konwersja działa w przeglądarce, treść pliku nie jest wysyłana na serwer. Limit to 200 000 znaków. Powtórzone klucze i linie niepasujące do formatu KLUCZ=wartość są pomijane (podsumowanie podaje ich liczbę), prefiks export zostaje. Wrażliwe wartości są rozpoznawane po nazwie klucza i wyglądzie wartości, więc przed commitem przejrzyj wynik: klucz o nietypowej nazwie i krótkiej wartości może przejść niezauważony.
Komentarze, kolejność kluczy i walidacja przy starcie
Wszystko od znaku # do końca linii jest komentarzem i to jedyne miejsce, w którym można wyjaśnić, skąd wziąć wartość i czy jest wymagana. Generator używa komentarzy jako nagłówków sekcji oraz jako zakomentowanych przykładów tam, gdzie wartość musi zostać pusta. Gdy oba pliki wymieniają klucze w tej samej kolejności, diff pokazuje braki w sekundę, dlatego nowe klucze dopisuj w tym samym miejscu w obu plikach.
Sam szablon nie zmusi nikogo do wypełnienia pól, dlatego obecność wymaganych zmiennych warto sprawdzać na starcie procesu, a nie w chwili, gdy jakaś funkcja pierwszy raz sięgnie po klucz API. Brak konfiguracji ma zatrzymać wdrożenie od razu, z komunikatem wskazującym nazwę zmiennej. W Laravelu naturalnym miejscem są pliki z katalogu config czytające zmienne przez env() (po php artisan config:cache wywołania env() poza tym katalogiem zwracają null), a w Django moduł ustawień z konfiguratora settings.py.
Jak korzystać z generatora
- Wybierz framework albo kliknij gotowy zestaw, np. „Laravel + PostgreSQL + S3” lub „Node.js API + PostgreSQL”. Od frameworka zależą nazwy zmiennych i sposób opisu bazy.
- Wpisz nazwę aplikacji (do 60 znaków); nazwa z kilku słów dostanie cudzysłowy automatycznie, a puste pole da
MyApp. - Wskaż bazę: MySQL / MariaDB, PostgreSQL albo brak zewnętrznej bazy przy SQLite.
- Zaznacz Redisa, pocztę i S3, jeśli projekt ich używa.
- Kliknij „Generuj .env.example”, skopiuj albo pobierz wynik i zapisz go w katalogu głównym repozytorium, a potem wykonaj
cp .env.example .envi uzupełnij puste wartości.
Najczęściej zadawane pytania
Czy .env.example może zawierać wartości domyślne?
Tak, o ile są nieszkodliwe. APP_ENV=local, DB_HOST=127.0.0.1 czy PORT=3000 skracają uruchomienie projektu i nic nie ujawniają. Wszystko, co uwierzytelnia lub podpisuje, zostaje puste, bo wartość wpisana „na chwilę” ma zwyczaj dożywać do produkcji.
Dlaczego APP_KEY jest pusty, a nie wygenerowany?
Bo klucz w repozytorium przestaje być sekretem. APP_KEY szyfruje ciasteczka i dane sesji, więc jego ujawnienie pozwala podrobić sesję zalogowanego użytkownika. Każde środowisko potrzebuje własnego klucza, tworzonego lokalnie komendą php artisan key:generate.
Kiedy wartość wymaga cudzysłowów?
Gdy zawiera spację, znak # albo cokolwiek, co parser mógłby uznać za koniec wartości: APP_NAME="Acme Shop". W cudzysłowach podwójnych część bibliotek rozwija ${ZMIENNA}, więc dla hasła ze znakiem dolara bezpieczniejsze są apostrofy.
Czy wklejony plik .env trafia na serwer?
Nie. Konwersja .env do .env.example odbywa się w przeglądarce, a do historii narzędzia zapisywany jest tylko wybrany tryb i liczba zmiennych, bez kluczy i wartości.
Co zrobić, gdy .env już trafił do repozytorium?
Najpierw unieważnij i wymień wszystkie poświadczenia z tego pliku, bo tylko to naprawdę usuwa skutki. Potem zajmij się historią: git rm --cached .env wyjmuje plik z indeksu, ale zostaje on we wcześniejszych commitach, a ich przepisanie (np. git filter-repo) wymaga zgody zespołu.