Node.js LinuxWindowsNode.js

Node.js: Не читается переменная окружения при запуске Node.js через systemd

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Переменная окружения доступна при ручном запуске Node.js, но отсутствует при запуске службы через systemd. Системные службы не обязаны наследовать переменные из интерактивной оболочки, а файл .env сам по себе systemd не читает.

В этой статье
  1. Как проявляется неисправность
  2. Причины и отличительные признаки
  3. Пошаговая диагностика и исправление
  4. Проверка результата

#Как проявляется неисправность

Переменная окружения доступна при ручном запуске Node.js, но отсутствует при запуске службы через systemd. Системные службы не обязаны наследовать переменные из интерактивной оболочки, а файл .env сам по себе systemd не читает.

#Причины и отличительные признаки

Возможная причинаКак узнатьЧто делать
Переменная задана только в терминалеsystemd запускает программу с другим окружением.echo $APP_MODE показывает значение, служба — undefinedЗадать несекретное значение через Environment или EnvironmentFile.
Путь к файлу относительныйРабочий каталог службы отличается от каталога интерактивного запуска.Файл .env существует, но приложение не видит егоПроверить WorkingDirectory и способ чтения конфигурации.
Имя или порядок объявления неверныйЕсть опечатка в названии или переопределение в нескольких директивах.В systemctl show ожидаемой переменной нетПроверить точное имя и активную конфигурацию.

#Пошаговая диагностика и исправление

  1. Зафиксируйте название переменной, но не секретВ журнале приложения ищите сообщение о конкретной отсутствующей переменной, например APP_MODE; не выводите токены, ключи и пароли. Проверьте, как приложение читает настройку: process.env.APP_MODE, сторонний пакет конфигурации либо файл .env.
  1. Проверьте состояние службы и файл её определенияЧерез SSH на Linux с правом читать службу выполните systemctl status и systemctl cat, заменив имя на настоящее имя единицы. В выводе определите ExecStart, User, WorkingDirectory, Environment и EnvironmentFile; не публикуйте значения секретов из файла.
    Linux · Терминал (Bash)Команда
    Linux с systemd; чтение обычно доступно пользователю. myapp.service — пример, замените именем своего сервиса.
    systemctl status myapp.service --no-pager
    systemctl cat myapp.service
  1. Уточните рабочий каталог и праваВ секции [Service] проверьте WorkingDirectory=/srv/myapp (пример). Убедитесь, что пользователь из User= имеет право читать конфигурацию. Если WorkingDirectory не задан, система может начинать процесс из /, а относительные пути больше не совпадут.
  1. Добавьте несекретную переменную в конфигурациюДля постоянного значения лучше создать согласованный файл настройки службы через systemctl edit myapp.service — это изменение требует административных прав, поэтому попросите администратора. В секцию [Service] добавьте Environment="APP_MODE=production" лишь если значение не секретное. Директива systemd не выполняет подстановку переменных оболочки.
  1. Для файла настроек используйте штатный синтаксисПри наличии отдельного файла с несекретными параметрами укажите EnvironmentFile=/etc/myapp/app.env, убедившись, что он существует и содержит строки вида APP_MODE=production. Эта возможность systemd не равна автоматическому чтению .env библиотекой Node. Для секретов используйте механизм credentials systemd или секреты вашей платформы.
  1. Проверьте конфигурацию и перезапускПосле правки попросите администратора выполнить systemctl daemon-reload, затем systemctl restart myapp.service. Перезапуск может временно остановить сервис. Проверьте systemctl status и журнал, чтобы убедиться в штатном запуске и наличии только признака настройки, без вывода самого секрета.
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    Linux systemd; первые две команды требуют полномочий администратора и перезапускают службу; выполнять только в согласованное окно.
    sudo systemctl daemon-reload
    sudo systemctl restart myapp.service
    systemctl status myapp.service --no-pager

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Проверяйте то же действие, что раньше не работалоСделайте тестовый запрос к приложению. Если значение всё ещё не читается, проверьте конфигурацию сервиса, имя переменной, UnsetEnvironment, собственную логику чтения .env и рабочий каталог. Изменения параметров следует откатить из резервной копии, если служба перестала запускаться.

#Проверка результата

При запуске через systemd приложение получает нужную настройку и выполняет исходный сценарий; секреты не выводятся ни в status, ни в журнал.

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

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.