php artisan env:encrypt шифрує файл оточення, щоб його можна було безпечно зберігати в репозиторії - разом з кодом, з історією змін і рев'ю, але без відкритих секретів.
php artisan env:encrypt --env=production
# створює .env.production.encrypted, виводить ключ (показується один раз)
- шифр за замовчуванням - AES-256-CBC (можна змінити через
--cipher); - ключ генерується автоматично або передається через
--key; --prune- видалити вихідний відкритий файл після шифрування;--readable- шифрувати кожне значення окремо, залишаючи назви змінних відкритими: у diff видно, яка змінна змінилася, без розкриття значення.
Розшифрування на сервері під час деплою:
php artisan env:decrypt --env=production --key="$LARAVEL_ENV_ENCRYPTION_KEY"
Ключ береться з опції --key або змінної оточення LARAVEL_ENV_ENCRYPTION_KEY. Тобто на сервер (чи в CI) потрапляє один секрет замість десятків.
Що це дає:
- секрети версіонуються разом з кодом - відомо, хто й коли змінив конфігурацію;
- новий член команди отримує доступ до конфігурації оточення через один ключ;
- немає «живих»
.env, що пересилаються в месенджерах.
Обмеження й ризики:
- увесь захист - в одному ключі. Його витік відкриває всі секрети з усієї історії репозиторію. Ключ зберігають у менеджері секретів CI чи хостингу, а не поруч з кодом;
- ротація секретів все одно потрібна - шифрування файлу не скасовує заміну скомпрометованих значень;
- історія: зашифровані версії лишаються в Git назавжди. Якщо ключ колись витік, старі версії з тоді чинними секретами теж розкриті;
- доступ «все або нічого»: будь-хто з ключем бачить усі секрети оточення. Для розмежування доступу краще повноцінний менеджер секретів (Vault, AWS Secrets Manager, Doppler) чи SOPS з ключами для різних людей.
Добрий компроміс для невеликих команд: зашифрований .env.production у репозиторії, ключ - у змінних CI/хостингу, розшифрування на етапі деплою.
Докладніше в документації: Laravel: шифрування файлів оточення