SystemdDoctor
служба не работает node окружение

Node-служба не видит переменные окружения

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

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Файл настроек ищется относительно рабочего каталога

    Библиотеки читают файл относительно текущего каталога. У службы он другой, и файл не находится.

  2. Переменные заданы в профиле оболочки

    Служба не читает профиль. Переменные, работающие в терминале, для неё не существуют.

  3. Секреты в переменных видны в выводе состояния

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

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Всё, что определяет настройки службы.

systemctl show myapp.service -p Environment -p EnvironmentFile -p WorkingDirectory

Сообщение приложения о недостающей настройке.

journalctl -u myapp.service -n 20 --no-pager | tail -10

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Файл настроек ищется относительно рабочего каталога
Почему происходит
Библиотеки читают файл относительно текущего каталога. У службы он другой, и файл не находится.
Как проверить
Посмотрите рабочий каталог службы.
systemctl show myapp.service -p WorkingDirectory
ls -l /opt/myapp/.env 2>/dev/null
Как исправить
Задайте WorkingDirectory= каталогом проекта либо передавайте переменные через EnvironmentFile=: второе надёжнее и не зависит от библиотек.
2. Переменные заданы в профиле оболочки
Почему происходит
Служба не читает профиль. Переменные, работающие в терминале, для неё не существуют.
Как проверить
Посмотрите окружение службы.
systemctl show myapp.service -p Environment -p EnvironmentFile
Как исправить
Перенесите переменные в файл окружения и подключите его в unit-файле.
3. Секреты в переменных видны в выводе состояния
Почему происходит
Даже работающая схема с переменными имеет недостаток: значения видны любому, кто может выполнить команду просмотра свойств.
Как проверить
Посмотрите, что попадает в вывод.
systemctl show myapp.service -p Environment
Как исправить
Для секретов используйте механизм учётных данных: они не попадают ни в окружение, ни в вывод состояния.

Пример вывода

Файл настроек не найден из-за другого рабочего каталога. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

myapp[4200]: Error: DATABASE_URL is not defined
myapp[4200]:     at loadConfig (/opt/myapp/src/config.js:12:11)

$ systemctl show myapp.service -p WorkingDirectory
WorkingDirectory=

Связанные ошибки

Источники

  • systemd.exec(5)
    Environment= и EnvironmentFile=.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено приложением, читающим файл настроек относительно текущего каталога.
    собственная проверка, systemd 255
    сверено 15 сентября 2026