欢迎回到本系列,我们一直在使用 Qwik 构建应用程序合并了来自 OpenAI 的 AI 工具。到目前为止,我们已经创建了一个非常酷的应用程序,它使用人工智能生成文本和图像。
现在,只剩下一件事要做了。启动时间到了!
让我们开始吧!
设置运行时适配器
我们首先需要解决一些问题:决定我们将在哪里运行我们的应用程序、它将在哪个运行时中运行以及部署管道的外观。
正如我之前提到的,我将部署到 Akamai 连接云中的 VPS,但任何其他 VPS 都应该可以工作。对于运行时,我将使用 Node.js,并使用 Git 来保持部署简单。
Qwik 很酷,因为它设计为在多个 JavaScript 运行时中运行。这很方便,但这也意味着我们的代码还没有准备好在生产中运行。 Qwik 需要了解其运行时环境,我们可以使用适配器来做到这一点。
我们可以使用命令npm run qwik add
来访问查看并安装可用的适配器。这将提示我们一些适配器、集成和插件的选项。
<图>
Fastify 适配器。它在运行 Node.js 的 VPS 上运行良好。如果您愿意,可以选择不同的目标。
选择集成后,终端将向您显示即将进行的更改并提示您确认。您会看到它想要修改一些文件、创建一些新文件、安装依赖项并添加一些新的 npm
脚本。在确认之前,请确保您对这些更改感到满意。
<图>
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
文件中禁用此功能 checkOrigin
为 false
:
导出默认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 欢迎页面:
<图>
请注意,您可能需要从 PM2 中删除当前实例并重新运行启动命令,除非您更改了 Caddy 文件,否则不必重新启动 Caddy 进程,并且对 Node.js 源代码的任何更改都需要在再次运行之前重建。
天啊是啊!我们做到了!
好的,本篇博文和本系列就到此为止。我真诚地希望您喜欢两者并学到一些很酷的东西。今天,我们介绍了部署人工智能应用程序时需要了解的许多内容:
- 运行时适配器
- 生产建筑
- 环境变量
- 流程管理器
- 反向代理
- SSL 证书
如果您错过了之前的任何帖子,请务必返回并查看它们。
我很想知道你对整个系列的看法。如果需要,您可以使用我构建的应用。如果您部署了自己的应用程序,请告诉我。另外,如果您对希望我将来讨论的主题有想法,我很乐意听到它们:)
更新:如果您喜欢这个项目并且很好奇它作为SvelteKit 应用程序,查看 Tim Smith 的这篇博客文章,他在其中转换了这个现有的应用程序。
非常感谢您的阅读。