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