Перейти к содержимому

Где хранить env файл

  • автор:

Node.js включает встроенную поддержку файлов .env¶

С недавним выпуском версии 20.6.0 в Node.js появилась встроенная поддержка файлов .env . Теперь вы можете загружать переменные окружения из .env -файла в process.env в своем Node.js-приложении, полностью избавившись от зависимостей.

Загрузка файла .env теперь осуществляется просто:

node --env-file .env 

Что такое .env ?¶

Файлы .env используются для настройки переменных окружения, которые будут присутствовать в работающем приложении. Идея заимствована из методологии Twelve-Factor App, которая гласит, что все, что может меняться между деплоями (например, dev, staging, production), должно храниться в окружении.

Конфигурация не должна быть частью кода приложения и не должна регистрироваться в системе контроля версий. Такие вещи, как учетные данные API или другие секреты, должны храниться отдельно и загружаться в то окружение, в котором они необходимы. Файл .env позволяет управлять конфигурацией приложений, для которых нецелесообразно задавать переменные в окружении, например, на машине разработки или в CI.

Существуют библиотеки на многих языках, поддерживающие использование .env -файла для загрузки переменных в окружение, они обычно называются «dotenv», и Node.js dotenv ничем не отличается от них. Но теперь и сам Node.js поддерживает такое поведение.

Как использовать .env в Node.js?¶

Файл .env выглядит следующим образом:

1 2 3
PASSWORD=supersecret API_KEY=84de8263ccad4d3dabba0754e3c68b7a # .env files can have comments too 

По традиции вы сохраняете этот файл под именем .env в корне проекта, хотя можете назвать его как угодно.

Затем вы можете установить переменные в этом файле в качестве переменных окружения, запустив Node.js с флагом —env-file , указывающим на ваш файл .env . После загрузки переменные будут доступны как свойства process.env .

1 2 3 4 5 6 7 8 9
$ node --env-file .env Welcome to Node.js v20.6.0. Type ".help" for more information. > console.log(process.env.PASSWORD) supersecret undefined > console.log(process.env.API_KEY) 84de8263ccad4d3dabba0754e3c68b7a undefined 

Поддерживаемые возможности¶

На данный момент поддержка достаточно базовая по сравнению с dotenv. Например:

  • В настоящее время нельзя использовать многострочные значения
  • Нельзя использовать расширение переменных
  • Вы можете указать только один файл за раз. Node.js будет использовать только последний переданный флаг, поэтому в следующем примере будут использованы только переменные из .env.development :

node --env-file .env --env-file .env.development 

Работа еще продолжается, и некоторые из этих функций могут быть добавлены. За ходом обсуждения можно следить на GitHub.

Некорректные возможности¶

Начиная с версии 20.6.0, в документации сказано: «Если одна и та же переменная определена в окружении и в файле, то приоритет имеет значение из окружения». Именно так по умолчанию работают все пакеты dotenv. Однако в настоящее время в реализации Node.js это не так, и переменные в файле .env будут переопределять переменные окружения. У меня есть открытый запрос на исправление этого.

Преимущества реализации Node.js¶

Несмотря на то, что в данной реализации отсутствуют некоторые возможности, она имеет ряд преимуществ по сравнению с использованием сторонних пакетов. Node.js загружает и анализирует файл .env при запуске, поэтому в него можно включить переменные окружения, которые конфигурируют сам Node.js, например NODE_OPTIONS .

Таким образом, можно иметь файл .env , который выглядит следующим образом:

NODE_OPTIONS="--no-warnings --inspect=127.0.0.1:9229" 

Тогда при запуске node —env-file=.env процесс будет запускаться без выдачи предупреждений и активизирует инспектора на IP-адресе 127.0.0.1:9229 .

Замечание: нельзя помещать NODE_OPTIONS=»—env-file .env» в файл .env . Это запрещено во избежание бесконечных циклов.

Node.js продолжает совершенствоваться¶

Попробуйте использовать Node.js версии 20.6.0! В 20-й версии появились новые возможности, такие как стабильная программа запуска тестов, имитация таймеров, поддержка файлов .env , а также множество других обновлений, исправлений и улучшений. Версия 20 станет активной LTS-версией Node.js в октябре, поэтому сейчас самое время протестировать эти новые возможности и начать рассматривать возможность обновления своих приложений, чтобы воспользоваться ими.

Источник¶

Хранить python dict в .env файле

Мне надо хранить dict (словарь с ключами и значениями) в переменные окружения Linux через файл .env, проект на python 3.6 все работает через docker docker-compose, все скрытые переменные проекта высвечиваются нормально, кроме словаря которого я прописал в .env файл LINES=<'key': value1, 'key2': value2>, вместо этого я вижу LINES=38. Вопрос почему вместо значения ключа, стоит число 39?

Отслеживать

задан 13 авг 2019 в 5:46

575 4 4 серебряных знака 9 9 бронзовых знаков

Добавьте подробностей, пожалуйста.

13 авг 2019 в 5:48

Возможно, что-то перезаписывает ваше значение? Попробуйте создать тем же способом переменную, например, LINES_2 с тем же значением, и посмотрите, что в итоге окажется в ней.

13 авг 2019 в 7:21

В каком файле хранить переменные окружения?

Подскажите его надо хранить в корне проекта или в виртуальном окружении?

werevolff

s1zen, что вы имеете ввиду под «хранить»? Файл .env используется только потому, что его по-дефолту читает Docker. И читать его он предпочитает из корня проекта. Но этот файл нельзя хранить в репозитории. Храните его на зашифрованной флешке, например. Но при запуске проекта локально он должен быть в корне проекта.

Что касается продакшена, то суть не в .env файле, а в переменных окружения, которые хранятся в os.environ и получаются методом os.getenv(). То есть, переменные хранятся, по сути, либо на диске, либо в ОЗУ. Файл .env лишь избавляет вас от необходимости вручную прописывать эти переменные при запуске инстанса. И на проде он не нужен. Точнее, ему там лучше не храниться. Лучше, если переменные существуют только в ОЗУ. Но, если вы не планируете использовать Docker, то храните на production сервере в папке с ограниченным доступом, а при деплое копируйте в корень проекта. При старте сервера используйте какой-нибудь python-dotenv, как вам предлагали, чтобы прочитать файл из корня и добавить переменные в os.environ.

Конфигурирование

Все конфигурационные файлы фреймворка Laravel хранятся в каталоге config . Каждый параметр задокументирован, поэтому не стесняйтесь просматривать эти файлы и знакомиться с доступными вам вариантами.

Конфигурационные файлы позволяют настраивать такие вещи, как информация о подключении к базе данных, информация о почтовом сервере, а также другие основные параметры, например, часовой пояс приложения и ключ шифрования.

Конфигурация окружения

Часто бывает полезно иметь различные конфигурации в зависимости от окружения, в котором выполняется приложение. Например, по желанию можно использовать разные драйверы кеша в локальном и эксплуатационном окружении.

Чтобы упростить это, Laravel использует библиотеку DotEnv PHP. В корневом каталоге вашего нового приложения будет содержаться файл .env.example , определяющий множество основных переменных окружения. Этот файл будет автоматически скопирован в .env в процессе установки Laravel.

Файл .env Laravel по умолчанию содержит некоторые основные значения конфигурации, которые могут зависеть от того, работает ли ваше приложение локально или на конечном веб-сервере. Эти значения могут быть получены из различных конфигурационных файлов каталога config Laravel с помощью глобальной функции env() Laravel.

Если вы работаете в команде, то вы можете не исключать файл .env.example из своего приложения. Размещая значения-заполнители в этот файл, другие разработчики в вашей команде могут четко видеть, какие переменные окружения необходимы для запуска вашего приложения.

Любая переменная в вашем файле .env может быть переопределена внешними переменными окружения, такими как переменные окружения уровня сервера или системы.

Безопасность файлов окружения

Ваш файл .env не должен быть привязан к системе контроля версий вашего приложения, поскольку каждому разработчику / серверу, использующему ваше приложение, может потребоваться другая конфигурация окружения. Кроме того, это будет угрозой безопасности в случае, если злоумышленник получит доступ к вашему репозиторию системы управления версиями, поскольку любые конфиденциальные учетные данные будут раскрыты.

Дополнительные файлы окружения

Перед загрузкой переменных окружения вашего приложения Laravel определяет, была ли переменная среды APP_ENV предоставлена извне или указан аргумент CLI —env . Если это так, Laravel попытается загрузить файл .env.[APP_ENV] . Если он не существует, будет загружен .env файл по умолчанию.

Типы переменных окружения

Все переменные в файлах .env обычно анализируются как строки, поэтому были созданы некоторые зарезервированные значения, позволяющие вам возвращать более широкий диапазон типов из функции env() :

Значение .env Значение env()
true (bool) true
(true) (bool) true
false (bool) false
(false) (bool) false
empty (string) »
(empty) (string) »
null (null) null
(null) (null) null

Если вам нужно определить переменную окружения со значением, содержащим пробелы, то вы можете сделать это, заключив значение в двойные кавычки:

APP_NAME="My Application" 

Получение конфигурации окружения

Все переменные, перечисленные в этом файле, будут загружены в суперглобальную переменную $_ENV PHP, когда ваше приложение получит запрос. Однако вы можете использовать помощник env() для получения значений из переменных ваших конфигурационных файлов. Фактически, если вы просмотрите файлы конфигурации Laravel, вы заметите, что многие параметры уже используют этот помощник:

'debug' => env('APP_DEBUG', false), 

Второе значение, переданное в функцию env , является «значением по умолчанию». Это значение будет возвращено, если для данного ключа не существует переменной окружения.

Определение текущего окружения

Текущее окружение приложения определяется с помощью переменной APP_ENV из вашего файла .env . Вы можете получить доступ к этому значению через метод environment фасада App :

use Illuminate\Support\Facades\App; $environment = App::environment(); 

Вы также можете передать аргументы методу environment , чтобы определить, соответствует ли окружение переданному значению. Метод вернет true , если окружение соответствует любому из указанных значений:

if (App::environment('local')) < // Локальное окружение . > if (App::environment(['local', 'staging'])) < // Окружение либо локальное, либо промежуточное . > 

Определение текущего окружения приложения может быть отменено путем определения переменной окружения APP_ENV на уровне сервера.

Доступ к значениям конфигурации

Вы можете легко получить доступ к своим значениям конфигурации, используя глобальный помощник config из любого места вашего приложения. Доступ к значениям конфигурации можно получить с помощью «точечной нотации», включающую имя файла и параметр, к которому вы хотите получить доступ. Также может быть указано значение по умолчанию, которое будет возвращено, если параметр конфигурации отсутствует:

$value = config('app.timezone'); // Получить значение по умолчанию, если значение конфигурации не существует . $value = config('app.timezone', 'Asia/Seoul'); 

Чтобы установить значения конфигурации во время выполнения скрипта, передайте массив помощнику config :

config(['app.timezone' => 'America/Chicago']); 

Кеширование конфигурации

Чтобы ускорить работу вашего приложения, вы должны кешировать все конфигурационные файлы в один файл с помощью команды config:cache Artisan. Это объединит все конфигурационные параметры вашего приложения в один файл, который может быть быстро загружен фреймворком.

Обычно вы должны запускать команду php artisan config:cache как часть процесса развертывания эксплуатационного режима. Команду не следует запускать во время локальной разработки, поскольку конфигурационные параметры часто нужно будет изменять в ходе разработки вашего приложения.

Если вы выполняете команду config:cache в процессе развертывания, то вы должны быть уверены, что вызываете функцию env() только из ваших файлов конфигурации. После кэширования конфигурации файл .env не будет подгружаться; следовательно, функция env() будет возвращать только внешние переменные окружения системного уровня.

Режим отладки

Параметр debug в конфигурационном файле config/app.php определяет, сколько информации об ошибках фактически отображается конечному пользователю. По умолчанию этот параметр установлен с учетом значения переменной APP_DEBUG окружения, расположенной в вашем файле .env .

Для локальной разработки вы должны установить для переменной APP_DEBUG окружения значение true . В эксплуатационном режиме это значение всегда должно быть false . Если для этой переменной будет установлено значение true , то вы рискуете раскрыть конфиденциальные значения конфигурации конечным пользователям вашего приложения.

Режим обслуживания

Когда ваше приложение находится в режиме обслуживания, то для всех запросов к приложению будет отображаться специальная страница. Это позволяет легко «отключить» ваше приложение во время его обновления или технического обслуживания. Проверка режима обслуживания включена в стек посредников по умолчанию для вашего приложения. Если приложение находится в режиме обслуживания, то будет выброшено исключение Symfony\Component\HttpKernel\Exception\HttpException с 503 кодом состояния.

Чтобы включить режим обслуживания, выполните команду down Artisan:

php artisan down 

Если вы хотите, чтобы HTTP-заголовок Refresh отправлялся со всеми ответами в режиме обслуживания, вы можете указать параметр refresh при вызове команды down . Заголовок Refresh будет указывать браузеру автоматически обновлять страницу через указанное количество секунд:

php artisan down --refresh=15 

Вы также можете передать команде down параметр retry , значение которого будет установлено в заголовке Retry-After HTTP`, хотя браузеры обычно игнорируют этот заголовок:

php artisan down --retry=60 
Обход режима обслуживания

Находясь в режиме обслуживания, вы можете использовать параметр secret , чтобы указать токен для обхода режима обслуживания:

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515" 

После перевода приложения в режим обслуживания, вы можете перейти по URL-адресу приложения, с учетом этого токена, и Laravel выдаст вашему браузеру файл куки для обхода режима обслуживания:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515 

При доступе к этому скрытому маршруту вы будете перенаправлены на маршрут / приложения. Как только куки будет отправлен вашему браузеру, вы сможете просматривать приложение в обычном режиме, как если бы оно не находилось в режиме обслуживания.

Параметр secret режима обслуживания должен состоять из буквенно-цифровых символов и, при необходимости, тире. Вам следует избегать использования в URL-адресах символов, имеющих особое значение, таких как ? .

Предварительный рендеринг шаблона режима обслуживания

Если вы используете команду php artisan down во время развертывания, то ваши пользователи могут иногда сталкиваться с ошибками, если они обращаются к приложению во время обновления ваших зависимостей Composer или других компонентов фреймворка. Это происходит потому, для определения режима обслуживания и отображения шаблона режима обслуживания с помощью движка шаблонов должна быть загружена значительная часть фреймворка Laravel.

По этой причине Laravel позволяет в самом начале цикла запроса отобразить шаблон режима обслуживания. Этот шаблон отображается перед загрузкой любых зависимостей вашего приложения. Вы можете выполнить предварительный рендеринг шаблона по вашему выбору, используя параметр render команды down :

php artisan down --render="errors::503" 
Перенаправление запросов режима обслуживания

В режиме обслуживания Laravel будет отображать шаблон режима обслуживания для всех URL-адресов приложения, к которым пользователь попытается получить доступ. Если хотите, то вы можете указать Laravel перенаправлять все запросы на определенный URL. Это может быть выполнено с помощью параметра redirect . Например, вы можете перенаправить все запросы на URI / :

php artisan down --redirect=/ 
Отключение режима обслуживания

Чтобы отключить режим обслуживания, используйте команду up :

php artisan up 

Вы можете определить свой шаблон режима обслуживания в resources/views/errors/503.blade.php .

Режим обслуживания и очереди

Пока ваше приложение находится в режиме обслуживания, поставленные в очередь задания обрабатываться не будут. Задания продолжат обрабатываться в обычном режиме после выхода приложения из режима обслуживания.

Альтернативы режиму обслуживания

Поскольку режим обслуживания требует, чтобы ваше приложение простаивало несколько секунд, то рассмотрите альтернативы, например, Laravel Vapor и Envoyer для выполнения развертывания с нулевым временем простоя.

Русскоязычное комьюнити
  • Группа в VK
  • Телеграм LaravelRUS
  • Телеграм Laravel для новичков
  • Телеграм LaravelPro
Обучающие ресурсы
  • Laracasts
  • Codecourse
  • Курс Дмитрия Елисеева
  • Adam Wathan
Блоги разработчиков
  • Laravel News
  • Freek Van der Herten
  • Brent Roose
  • Marcel Pociot

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *