#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, потому что эти переменные заранее не ясны.