欢迎回到本系列,我们一直在使用 Qwik 构建应用程序合并了来自 OpenAI 的 AI 工具。到目前为止,我们已经创建了一个非常酷的应用程序,它使用人工智能生成文本和图像。

  1. 简介和设置
  2. 您的第一个 AI 提示
  3. 流式响应
  4. 人工智能如何工作
  5. 提示工程
  6. 人工智能生成的图像
  7. 安全性和可靠性
  8. 正在部署

现在,只剩下一件事要做了。启动时间到了!

我将部署到 Akamai 的云计算服务(以前称为 Linode),但这些步骤应该适用于任何 VPS 提供商。

让我们开始吧!

设置运行时适配器

我们首先需要解决一些问题:决定我们将在哪里运行我们的应用程序、它将在哪个运行时中运行以及部署管道的外观。

正如我之前提到的,我将部署到 Akamai 连接云中的 VPS,但任何其他 VPS 都应该可以工作。对于运行时,我将使用 Node.js,并使用 Git 来保持部署简单。

Qwik 很酷,因为它设计为在多个 JavaScript 运行时中运行。这很方便,但这也意味着我们的代码还没有准备好在生产中运行。 Qwik 需要了解其运行时环境,我们可以使用适配器来做到这一点。

我们可以使用命令npm run qwik add来访问查看并安装可用的适配器。这将提示我们一些适配器、集成和插件的选项。

<图>
`npm run qwik add` 命令生成的屏幕,显示集成列表。Fastify 适配器。它在运行 Node.js 的 VPS 上运行良好。如果您愿意,可以选择不同的目标。

选择集成后,终端将向您显示即将进行的更改并提示您确认。您会看到它想要修改一些文件、创建一些新文件、安装依赖项并添加一些新的 npm 脚本。在确认之前,请确保您对这些更改感到满意。

<图>
显示所有建议更改并请求批准的 Qwik CLI 屏幕NVM,这让我们可以轻松管理Node版本。我们可以使用以下命令安装它:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

安装 NVM 后,您可以使用以下命令安装最新版本的 Node:

nvm安装节点

请注意,终端可能会显示 NVM 未安装。如果您退出服务器并重新登录,它应该可以工作。

上传、构建和运行应用

我们的服务器设置完毕,是时候安装我们的代码了。使用 Git,这相对容易。我们可以使用clone命令将代码复制到我们的服务器中。您需要使用自己的存储库,但它应该如下所示:

git 克隆 https://github.com/AustinGil/versus.git

我们的源代码现在位于服务器上,但还没有完全准备好运行。我们仍然需要安装 NPM 依赖项、构建生产资产并提供任何环境变量。

我们开始吧!

首先,导航到您刚刚克隆项目的文件夹。我用过:

cd 与

安装非常简单:

npm install

构建命令是:

npm run build

但是,如果您有任何类型检查或 linting 错误,它就会挂在那里。您可以修复错误(您可能应该这样做)或绕过它们并使用以下命令进行构建:

npm run build.client & npm run build.server

项目的最新版本源代码有工作类型,如果你想要的话检查一下。

最后一步有点棘手。正如我们在上面看到的,运行生产应用程序时,不会从 .env 文件注入环境变量。相反,我们可以在运行时在 serve 命令之前提供它们,如下所示:

OPENAI_API_KEY=your_api_key npm runserve

您需要在那里提供自己的 API 密钥,以便 OpenAI 请求正常工作。

此外,对于 Node.js 部署,还有一个额外的必要步骤。您还必须设置一个分配给应用程序运行的完整 URL 的 ORIGIN 变量。 Qwik 需要此信息来正确配置其 CSRF 保护。

如果您不知道 URL,可以通过设置 createQwikCity options 属性在 /src/entry.preview.tsx 文件中禁用此功能 checkOriginfalse

导出默认createQwikCity({
  使成为,
  qwik城市规划,
  检查来源: false
});

此过程文档中有更详细的概述,但建议不要禁用,因为 CSRF 可能非常危险。无论如何,您都需要一个 URL 来部署应用程序,因此最好只设置 ORIGIN 环境变量。请注意,如果进行此更改,您将需要重新部署并重新运行构建和服务命令。

如果一切配置正确并正在运行,您应该开始在终端中看到来自 Fastify 的日志,确认应用程序已启动并正在运行。

{"level":30,"time":1703810454465,"pid":23834,"hostname":"localhost","msg":"服务器监听 http://[::1] :3000"}

不幸的是,通过 IP 地址和端口号访问该应用程序不会显示该应用程序(至少对我来说不是)。这可能是一个网络问题,但也将在下一节中解决,我们将在根域中运行我们的应用程序。

缺少的步骤

从技术上讲,该应用程序已部署、构建并运行,但在我看来,在我们将其称为“生产就绪”之前,还有很多需要改进的地方。有些教程会假设您知道如何做其余的事情,但我不想那样做。我们将介绍:

  • 在后台模式下运行应用
  • 如果服务器崩溃则重新启动应用
  • 访问根域的应用
  • 设置 SSL 证书

您需要自己做的一件事就是购买域名。有很多好地方。我一直是 Porkbun 和 Namesilo 的粉丝。我认为您使用的注册商没有太大区别,但我喜欢这些,因为它们除了已经很低的价格外,还免费提供 WHOIS 隐私和电子邮件转发。

在我们对服务器执行任何其他操作之前,最好将您域名的 A 记录 (@) 指向服务器的 IP 地址。尽早执行此操作有助于缩短传播时间。

现在,回到服务器,我们需要首先处理一个明显的问题。当我们运行 npm runserve 命令时,只要我们保持终端打开,我们的应用程序就会运行。显然,最好退出服务器,关闭终端,然后离开计算机去吃披萨,而应用程序不会崩溃。因此我们希望在后台运行该命令。

有很多方法可以实现这一点:Docker、Kubernetes、Pulumis 等,但我不喜欢增加太多复杂性。因此,对于基本应用程序,我喜欢使用 PM2,一个 Node.js 框架。 Node.js 进程管理器具有强大的功能,包括在后台运行我们的应用程序的能力。

从服务器内部运行以下命令将 PM2 安装为全局 NPM 模块:

npm install -g pm2

安装完成后,我们可以使用“start”命令告诉 PM2 要运行什么命令:

pm2 启动“npm runserve”

除了在后台运行我们的应用程序之外,PM2 还有许多非常好的功能。您需要注意的一件事是查看应用程序日志的命令:

pm2日志

除了在后台运行我们的应用程序之外,PM2 还可以配置为在服务器崩溃时启动或重新启动任何进程。这对于避免停机非常有帮助。您可以使用以下命令进行设置:

pm2启动

好的,我们的应用程序现在正在运行,并将在服务器重新启动后继续运行。太棒了!

但我们仍然无法做到这一点。哈哈!

我的首选解决方案是使用 Caddy。这将解决网络问题,充当出色的反向代理,并为我们处理整个 SSL 过程。我们可以按照其文档中的安装说明并运行这五个命令:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
卷曲 -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
卷曲 -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
须藤apt更新
sudo apt install caddy

完成后,您可以访问服务器的 IP 地址,您应该会看到默认的 Caddy 欢迎页面:

<图>
默认 Caddy 主页,包含如何开始使用的说明。

请注意,您可能需要从 PM2 中删除当前实例并重新运行启动命令,除非您更改了 Caddy 文件,否则不必重新启动 Caddy 进程,并且对 Node.js 源代码的任何更改都需要在再次运行之前重建。

天啊是啊!我们做到了!

好的,本篇博文本系列就到此为止。我真诚地希望您喜欢两者并学到一些很酷的东西。今天,我们介绍了部署人工智能应用程序时需要了解的许多内容:

  • 运行时适配器
  • 生产建筑
  • 环境变量
  • 流程管理器
  • 反向代理
  • SSL 证书

如果您错过了之前的任何帖子,请务必返回并查看它们。

我很想知道你对整个系列的看法。如果需要,您可以使用我构建的应用。如果您部署了自己的应用程序,请告诉我。另外,如果您对希望我将来讨论的主题有想法,我很乐意听到它们:)

更新:如果您喜欢这个项目并且很好奇它作为SvelteKit 应用程序,查看 Tim Smith 的这篇博客文章,他在其中转换了这个现有的应用程序。

非常感谢您的阅读。

Comments are closed.