在生产中使用 Dokku 部署 NextJS

Deploy NextJS with Dokku in Production

我已经设置了 Dokku 并想将我的基本 NextJs 部署到它。一切正常,除了应用程序 运行 处于开发模式。

当我在我的 JSX 中输出 NODE_ENV 变量时,它首先是 production 但变为 development.

const Index = () => (
  <div>
    <Link href="/about">
      <a>About Page</a>
    </Link>
    {process.env.NODE_ENV}
  </div>

这就是我所看到的。 NODE_ENV 变量在页面加载期间发生变化。

package.json:

"scripts": {
  "start": "next src",
  "build": "next build src"
},

App.json:

{
  "scripts": {
    "dokku": {
      "predeploy": "npm run build"
    }
  }
}

Procfile:

web: npm start -- --port $PORT

此外,我为我的 dokku 应用程序设置了两个配置:

dokku config:set my-app NPM_CONFIG_PRODUCTION=false
dokku config:set my-app HOST=0.0.0.0 NODE_ENV=production

我缺少什么才能使其进入生产模式?

通过设置 own express server 解决了它。

package.json

"scripts": {
  "dev": "node server.js",
  "build": "next build",
  "start": "NODE_ENV=production node server.js"
},

app.json

{
  "scripts": {
    "dokku": {
      "predeploy": "npm run build"
    }
  }
}

Procfile

web: npm start -- --port $PORT

根据this github issue comment,您需要让应用程序监听 PORT 环境变量。

虽然我无法让它工作。有一些示例可以说明如何获得 npm-script 来使用环境变量,但我现在不想走那条路。 (有关详细信息,请参阅 this question。)

但是,我确实注意到 Next.js 默认监听端口 3000,而 dokku 在内部使用端口 5000,所以我只需将默认的 npm start 脚本更改为 next -p 5000,也就是说,我将 Next.js 应用程序硬编码为使用端口 5000。

这目前有效,但我只用一个干净、最小的项目对其进行了测试,所以不确定是否还有其他障碍。

此外,Next.js 似乎确实从 .env 文件中获取了 env 变量,但出于某种原因,这并未反映在应用程序所服务的端口中: