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

#node.js #next.js #pm2 #production

Вопрос:

Мое приложение NextJS работает на Ubuntu20.4 с PM2 и Nginx. Я пытаюсь перезагрузить файл .env, когда он изменяется.

Я уже изменил файл .env с помощью fs и перестроил приложение с помощью дочернего процесса, это работает нормально. Но после многих попыток перезапуска процесса ничего не работает.

Мой маршрут API (работает):

 const patchEnvironment = async (req, res) =gt; {  try {  const result = await auth(req, res);  if (!result.root)  return res.status(400).json({ err: "Sie sind nicht Root!" });   const {  env_variable  } = req.body;   if (  !env_variable  )  return res.status(400).json({ err: "Bitte füllen Sie alle Felder aus." });   const readEnvVars = () =gt;  fs.readFileSync(envFilePath, "utf-8").split(os.EOL);   const setEnvValue = (key, value) =gt; {  const envVars = readEnvVars();  const targetLine = envVars.find((line) =gt; line.split("=")[0] === key);  if (targetLine !== undefined) {  const targetLineIndex = envVars.indexOf(targetLine);  envVars.splice(targetLineIndex, 1, `${key}=${value}`);  } else {  envVars.push(`${key}=${value}`);  }  fs.writeFileSync(envFilePath, envVars.join(os.EOL));  };   const variables = {  env_variable: setEnvValue("ENV_VARIABLE", env_variable),  };   const cmd =  process.env.NODE_ENV === "production"  ? "npm"  : process.env.NODE_ENV === "development" amp;amp; "npm.cmd";   const run = spawn(cmd, ["run", "build"], { cwd: projectPath });   run.stdout.on("data", (data) =gt; {  console.log(`stdout: ${data}`);  });   run.stderr.on("data", (data) =gt; {  console.log(`stderr: ${data}`);  });   run.on("error", (error) =gt; {  console.log(`error: ${error.message}`);  });   run.on("close", (code) =gt; {  console.log(`child process exited with code ${code}`);  });   res.json({  msg: "ok",  });  } catch (err) {  return res.status(500).json({ err: err.message });  } };  

Я уже пытался перезапустить процесс с помощью:

 exec("pm2 restart ecosystem.config.js", function (code, output) {  console.log("Exit code:", code);  console.log("Program output:", output);  });  or  exec("pm2 restart lt;process_namegt;", function (code, output) {  console.log("Exit code:", code);  console.log("Program output:", output);  });  

Я также попытался выполнить сценарий на сервере, который удаляет процесс pm2 и запускает его снова или запускает запуск npm и отменяет его перед повторным запуском процесса pm2. Часы pm2 тоже не работают.

 module.exports = {  apps: [{  name: "test",  cwd: "/path",  script: "npm",  args: "start",  watch: [".env"],  watch_delay: 1000,  }] }  

Или перезагрузите весь сервер.

Я ищу решение, которое я могу использовать в производстве.

Комментарии:

1. Вероятно, есть способ сделать это, но файлы .env не должны меняться.

2. Да, я знаю это, но я не хочу сохранять данные в базе данных. Я не могу придумать никакого другого решения. Мне просто нужно хорошее решение для изменения ключей API.

3. Что, если бы у вас были две разные переменные среды и вы просто переключались между ними в своем приложении? Таким образом, вам не придется беспокоиться о перезапуске.

4. Пользователь-администратор должен иметь возможность изменять ключи api с интерфейса администратора после запуска сервера, чтобы разработчику не приходилось делать это каждый раз. нет смысла иметь несколько файлов .env, потому что эти переменные заранее не ясны.