#node.js #ubuntu #amazon-ec2 #environment-variables
#node.js #ubuntu #amazon-ec2 #переменные среды
Вопрос:
Я создаю API nodejs и настроил dotenv
пакет как зависимость от разработчика для загрузки переменных в process.env
на локальных компьютерах разработчика.
Обратите внимание, что при входе в систему я использую sudo -i
для работы как root
.
Мое намерение состоит в том, чтобы во время развертывания переменные среды были установлены на моем хосте Ubuntu под /etc/environment
, загружены непосредственно в процесс, а затем приложение просто запустилось бы для этой конфигурации.
Для этого у меня есть строка в начале server.js
:
if(process.env.NODE_ENV === 'development') {
logger.info("Loading dotenv for development environment")
require('dotenv').config();
}
И разработчикам будет предложено добавить переменную среды в свою систему для NODE_ENV
.
Теперь, в моем экземпляре Ubuntu EC2, я настроил /etc/environment
так, чтобы у меня были переменные среды, которые я хочу (обратите внимание, что NODE_ENV здесь является ‘dev’, просто чтобы избежать запуска dotenv):
PORT=MYPORT
NODE_ENV=dev
APP_SECRET_KEY='MYSECRET'
APP_DATABASE_LOGIN=MYLOGIN
APP_DATABASE_PASSWORD='MYPASS'
APP_DATABASE_HOST=MYHOST
APP_DATABASE_NAME=MYDB
APP_DATABASE_PORT=MYDBPORT
И когда я перезагружаюсь и запускаю printenv
, все они заполняются для каждого файла.
У меня есть настройка pm2
для запуска моего приложения напрямую из server.js
без какой-либо дополнительной настройки, потому что, насколько я понимаю, process.env
оно заполняется автоматически из переменных среды.
Однако, когда я регистрирую значения из process.env, я просто получаю null для всего:
logger.info({
connectionConfig: {
host: process.env.APP_DATABASE_HOST
, login: process.env.APP_DATABASE_LOGIN
, port: process.env.APP_DATABASE_PORT
, databaseName: process.env.APP_DATABASE_NAME
}
});
Что-то не так с конфигурацией как есть здесь?
Примечание: Согласно приведенному ниже ответу, я ошибочно настроил свои переменные среды ПОСЛЕ запуска pm2, и поэтому в кешировании pm2 они отсутствовали
Комментарии:
1. что произойдет, если вы запустите его без
pm2
?2. @MarcosCasagrande Когда я запускаю
npm start
напрямую, переменные среды загружаются корректно, но поскольку PM2 уже запущен и использует порт, происходит сбой
Ответ №1:
Проблема в том, что pm2
переменные среды кэшируются.
Вы должны сделать:
# all apps
pm2 restart all --update-env
# specific app
pm2 restart {pid} --update-env
Если по какой-то причине это не сработает, документированный способ:
pm2 reload ecosystem.json --update-env
Вы можете прочитать больше здесь:
Комментарии:
1. Привет, Маркос — спасибо за это. Ваш первоначальный вопрос заставил меня разобраться, и я пришел к тому же выводу. Тем не менее, исправление для меня заключалось в выполнении
pm2 restart --update-env all
. Можете ли вы поместить это в качестве первой строки вашего ответа, чтобы я мог принять?2. Добавлена и эта строка.
3. Я ошибочно настроил свои переменные среды ПОСЛЕ запуска pm2 ранее в процессе и не знал о кэшировании — еще раз спасибо!
Ответ №2:
Я столкнулся с той же проблемой, это из-за встроенного терминала в Visual Studio и кода visual studio, кажется, что у них нет доступа ни к одной из этих переменных, если вы не запустите редактор в Admin mode.so чтобы решить эту проблему, вам просто нужно запустить ваш редактор в режиме Amin
Ответ №3:
Убедитесь, что у вас есть этот код в app.js файл
> const path = require('path'); require('dotenv').config({ path:
> path.join(__dirname, '.env') });