如何生成使用 NESTJS 完成的 API 的生产版本

How to generate a production build of an API done with NESTJS

我正在生成我使用 NESTJS 框架制作的 API 的生产版本,我想知道应该将哪些文件上传到服务器。当我 运行 "npm run start: prod" 编译时,它会生成 "dist" 文件夹,但我尝试仅使用它来 运行 但它不足以 运行 我的应用程序。我需要将所有文件上传到服务器吗?我做了几次测试,删除了我在开发过程中使用的文件夹,但在生产模式下只设法 运行 当我在开发模式下完全相同时。

我在文档中查找了相关内容,但一无所获。有人可以帮我吗?

谢谢

大多数情况下,您只需要 node_modules 中的依赖项。你应该在你的服务器上构建这些库,而不是从你的开发机器上复制它们。像 bcrypt 这样的库有机器特定的代码,可能不会 运行 在不同的机器上。 (30% of the npm libraries 有原生绑定。)

因此,对于您的部署,我建议您检查服务器上的 git 存储库,然后直接 运行 npm run start:prod(每次都会构建项目)。

老实说,您应该只真正需要 dist 文件夹,因为那是 JS 'complied' 文件。对于 运行 您的应用程序,通常您会使用此命令 node dist/main.js。至于你上传什么文件,这取决于你。就我个人而言,我使用了很多持续集成,所以我会克隆到我的 container/server 并使用 yarn start:prod。每次部署时,我都会在生产环境中生成 运行 所需的文件。

就像@Kim Kern 提到的,一些节点模块是使用 node-gyro 本机构建的;因此,最好在部署时在 server/container 上构建 node_modules。您的部署脚本应如下所示

git clone git@github.com:myuser/myrepo.git /var/www/
cd /var/www/
node -v && \
yarn && \
yarn build && \
yarn start:prod

上面的脚本应该

1) 将所需的 repo 拉入 'hosted' 目录
2) 检查节点版本
3) 安装 node_modules 并构建原生脚本等
4) 构建生产分布
5) 运行 生产 JS 脚本

如果您查看 package.json 文件,您会注意到在使用 yarn startyarn start:devyarn start:prod 时 运行 的不同脚本.在开发中你会注意到 ts-node 的使用,这是一个打字稿节点 运行ner 类型的东西(不记得正确的短语)。 start:dev 脚本也使用 nodemode 重新启动 ts-node 脚本。您还会看到 start:prod 脚本使用 node dist/main.js 并且 prestart:prod 脚本 运行s rm -rf dist && tsc 删除了 dist 文件夹和 'compiles' javascript 需要生产环境。

但是,如果没有持续集成,服务器上的 typescript 应用程序的缺点是可能会出现 typescript 编译错误,这些错误在 运行 生产脚本之前是看不到或不知道的。我建议在进行部署之前放置一个程序从打字稿编译 javascipt,因为您不想在知道下一个版本将构建和 运行 之前删除当前的 dist 构建!

我们不在生产环境中构建应用程序,而是在创建 docker 容器时构建应用程序。

我们大致的步骤是:

  1. 运行 npm install 以及构建应用程序所需的任何工具。
  2. 创建 docker 容器并复制 dist/node_modulespackage.json
  3. 在 docker 容器内 运行 npm rebuild bcrypt --update-binary

对我来说,这种方法很有效,你只需要 dist 文件夹即可:

  • 使用 npm run start:prod 创建您的应用程序的产品版本,这将在您的应用程序源代码中创建一个 dist 文件夹
  • dist 文件夹复制到您的服务器。
  • 要获取服务器上的所有 node_modules 依赖项,只需将 package.json 文件复制到 dist 文件夹(您已复制到服务器上),然后 运行 npm install从那里开始。
  • 如果您使用 pm2 到 运行 您的节点应用程序只需 运行 pm2 start main.js 来自 dist 文件夹

只需使用 Nest-CLI 并使用

构建
nest build

之后你会得到一个包含编译代码的 dist 文件夹。 然后,您可以将它放在服务器上 运行 例如使用 PM2 流程管理器:

production=true pm2 start dist/main.js

在之前的命令中,环境变量 production 设置为 true。那可以例如运行通过 HTTPS 连接 Nest.js 服务器时很有用。

如果您想 运行 HTTPS 安全服务器,您还必须在服务器的启动过程中包含证书。当环境变量 production 设置为真时,证书将包含在 main.ts 中 Nest.js 应用程序的启动过程中,如下所示:

async function bootstrap() {
let appConfig = {}
if (process.env.production) {
    console.log('process env production: ', process.env.production)
    const httpsOptions = {
        key: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/privkey.pem'),
        cert: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/fullchain.pem'),
    }
    
    // prod config
    appConfig = {
        httpsOptions,
    }
}

const app = await NestFactory.create<NestExpressApplication>(
    AppModule,
    appConfig,
)

app.enableCors()
app.setGlobalPrefix('v1')

await app.listen(3300)
}
bootstrap()

我们将 NX 用于我们持有 API 的 monorepo。我们对图像和容器使用 docker。当我们必须创建 docker 图像时,只有 运行: npx nx build <project> 并且此生成基于 dist/apps/<project>。此文件夹转到 docker 图像,package.json 就是这样。您不需要添加 node_modules,因为它们在 package.json 上。请务必在您的 Dockerfile 中包含 npm install