You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PM2无法启动Keystone:读取.env文件COOKIE_SECRET失败求助

解决PM2启动Keystone时无法读取COOKIE_SECRET的问题

我来帮你排查这个头疼的环境变量问题——这种情况我在部署Keystone项目时遇到过好几次,大概率是PM2的配置加载逻辑或者Keystone读取.env的方式出了小问题,咱们一步步来解决:

  • 先确认PM2配置文件的环境变量设置
    如果你用的是ecosystem.config.js,要注意两种设置环境变量的方式:

    1. 直接在env字段里硬编码(适合快速测试):
      module.exports = {
        apps: [{
          name: 'keystone-app',
          script: 'keystone.js',
          env: {
            COOKIE_SECRET: 'your-actual-secret-here',
            NODE_ENV: 'production'
          }
        }]
      }
      
    2. 通过env_file指定.env路径(推荐生产环境使用):
      module.exports = {
        apps: [{
          name: 'keystone-app',
          script: 'keystone.js',
          env_file: './.env' // 注意路径要对应PM2启动时的工作目录
        }]
      }
      
      这里最容易踩坑的是相对路径错误——如果PM2不是从项目根目录启动的,.env的路径就会失效。可以改成绝对路径(比如/home/your-user/projects/keystone/.env),或者在配置里明确指定工作目录:
      cwd: '/home/your-user/projects/keystone', // 项目根目录路径
      
  • 验证PM2是否真的加载了环境变量
    启动项目后,执行pm2 show keystone-app(替换成你的应用名称),在输出里找到env vars部分,看看COOKIE_SECRET是否存在。如果没有,说明PM2根本没读到你的配置,要检查配置文件路径是否正确(启动时要指定配置文件:pm2 start ecosystem.config.js)。

  • 检查Keystone读取.env的代码逻辑
    Keystone默认会用dotenv加载.env文件,但如果入口文件的加载顺序不对,或者PM2已经注入了环境变量,可能会出现冲突:

    1. 如果PM2已经通过env或env_file注入了变量,Keystone应该能直接读取,不需要再在代码里手动加载dotenv(除非你的Keystone版本有特殊要求)。
    2. 如果一定要用dotenv,确保在入口文件最开头加载:
      require('dotenv').config(); // 必须在require('keystone')之前执行
      const keystone = require('keystone');
      
  • 临时测试:直接在启动命令里传递变量
    试试跳过配置文件,用命令行直接传递变量验证:

    pm2 start keystone.js --env COOKIE_SECRET=your-test-secret
    

    如果这样能成功启动,说明问题出在你的PM2配置文件上,回去检查配置的语法或路径。

  • 最后检查拼写和格式细节
    别忽略最简单的错误:.env文件里的COOKIE_SECRET有没有拼写错误?比如大小写(环境变量通常是大写)、有没有多余的空格或者引号?正确的格式应该是:

    COOKIE_SECRET=your-long-random-secret-here
    

按照这些步骤排查,基本能解决90%的类似问题。

内容的提问来源于stack exchange,提问作者Navid Shad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:39:40