随时随地运行 npm 和 Deno
我们迎来了首次“发布周”的尾声!除了宣布 npm 兼容性在 1.28 版本中得到稳定之外,我们还展示了如何使用持久化数据 npm 模块、如何使用框架进行构建,以及 Deno 默认安全模型如何帮助缓解依赖漏洞。我们甚至举办了一场特别直播,在直播中我们回答了您的问题,并演示了多种将 npm 说明符与 Deno 结合使用的方法。
今天,我们想强调的是,您可以在任何虚拟私有服务器上运行您的 npm 和 Deno 代码。
是的,Deno Deploy 是托管 Deno 代码的绝佳选择,特别是如果您希望代码在边缘靠近用户执行。部署到我们的 V8 隔离云只需几秒钟,并且可以在全球范围内在几秒钟内访问。此外,Deploy 目前不支持 npm 说明符,但很快就会支持。
但是,有许多虚拟私有服务器可以托管 Deno 代码并设置 CI/CD。本篇博客文章将向您展示如何将 Deno 部署到这些平台。
请注意,所有这些指南都要求您拥有 docker
命令行工具 (CLI),因为我们将使用 Docker 进行部署。
请查看我们的手册,了解更多关于部署 Deno 代码和使用 GitHub Actions 设置自动部署的“如何操作”指南。.
使用 Docker
在我们部署任何东西之前,这三个示例都将基本上使用相同的 main.ts
文件、一个使用我们的 Docker 镜像构建的 Dockerfile
,以及 docker-compose.yml
文件。我们在这里展示它们,这样以后就不必重复了。
在您的 main.ts
文件中(下面的示例可能会将“Hello from Deno and AWS Lightsail”这一行更改为该平台特有的内容,例如“Hello from Deno and Digital Ocean!”)
import { Application } from "https://deno.land/x/oak@11.1.0/mod.ts";
const app = new Application();
app.use((ctx) => {
ctx.response.body = "Hello from Deno and AWS Lightsail!";
});
await app.listen({ port: 8000 });
您的 Dockerfile
FROM denoland/deno
EXPOSE 8000
WORKDIR /app
ADD . /app
RUN deno cache main.ts
CMD ["run", "--allow-net", "main.ts"]
然后,在我们的 docker-compose.yml
文件中
version: "3"
services:
web:
build: .
container_name: deno-container
image: deno-image
ports:
- "8000:8000"
让我们通过运行 docker compose -f docker-compose.yml build
,然后 docker compose up
,并访问 localhost:8000
来在本地测试。
下面每个部分都将重点介绍如何构建这些镜像并将其部署到各自的平台。
AWS Lightsail
Amazon Lightsail 是开始使用 Amazon Web Services 最简单、最经济的方式。它允许您托管虚拟机甚至整个容器服务。
本节将向您展示如何使用 Docker、Docker Hub 和 GitHub Actions 将 Deno 应用程序部署到 Lightsail。
您将需要:
- 一个 Docker Hub 账户
- 一个 AWS 账户
构建、标记并推送到 Docker Hub
首先,让我们登录 Docker Hub 并创建一个仓库。我们将其命名为 deno-on-aws-lightsail
。
然后,让我们标记并推送我们的新镜像,将 username
替换为您的用户名。
然后,让我们在本地构建镜像。请注意,我们的 docker-compose.yml
文件将把构建命名为 deno-image
。
docker compose -f docker-compose.yml build
让我们使用 {{ username }}/deno-on-aws-lightsail
标记本地镜像。
docker tag deno-image {{ username }}/deno-on-aws-lightsail
现在我们可以将镜像推送到 Docker Hub。
docker push {{ username }}/deno-on-aws-lightsail
成功后,您应该能够在您的 Docker Hub 仓库中看到新镜像。
创建并部署到 Lightsail 容器
让我们前往 Amazon Lightsail 控制台。
然后点击“容器 (Containers)”和“创建容器服务 (Create container service)”。在页面中部,点击“设置您的首次部署 (Setup your first Deployment)”并选择“指定自定义部署 (Specify a custom deployment)”。
您可以填写任何您想要的容器名称。
在 Image
中,请务必使用您在 Docker Hub 中设置的 {{ username }}/{{ image }}
。在此示例中,它是 lambtron/deno-on-aws-lightsail
。
让我们点击 添加开放端口 (Add open ports)
并添加 8000
。
最后,在 公共端点 (PUBLIC ENDPOINT)
下,选择您刚刚创建的容器名称。
完整表单应如下图所示:
准备好后,点击“创建容器服务 (Create container service)”。
稍等片刻,您的新容器应该就会部署完成。点击公共地址,您应该就能看到您的 Deno 应用程序了。
它奏效了!
在我们的手册中了解更多关于使用 GitHub Actions 自动化此部署的信息。
Digital Ocean
Digital Ocean 是一个受欢迎的云基础设施提供商,提供从网络、计算到存储的各种托管服务。
您将需要:
构建、标记并将您的 Docker 镜像推送到 Digital Ocean 容器注册表
本节假设您已设置好 main.ts
、Dockerfile
和 docker-compose.yml
(如果尚未设置,请参考使用 Docker)。
Digital Ocean 有自己的私有容器注册表,我们可以用它来推送和拉取 Docker 镜像。为了使用此注册表,请在命令行中安装并认证 doctl
。
之后,我们将创建一个名为 deno-on-digital-ocean
的新私有注册表。
doctl registry create deno-on-digital-ocean
使用我们的 Dockerfile 和 docker-compose.yml,我们将构建一个新镜像,标记它,并将其推送到注册表。请注意,docker-compose.yml
会将本地构建命名为 deno-image
。
docker compose -f docker-compose.yml build
让我们用 new
标记它。
docker tag deno-image registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
现在我们可以将其推送到注册表了。
docker push registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
您应该能在您的 Digital Ocean 容器注册表中看到带有 new
标签的新 deno-image
。
完美!
通过 SSH 部署到 Digital Ocean
一旦我们的 deno-image
镜像在注册表中,我们就可以使用 docker run
在任何地方运行它。在这种情况下,我们将在我们的 Digital Ocean Droplet(他们的托管虚拟机)中运行它。
在您的 Droplet 页面上,点击您的 Droplet,然后点击 console
以 SSH 连接到虚拟机。(或者您可以直接从命令行进行 SSH 连接。)
要拉取 deno-image
镜像并运行它,我们运行:
docker run -d --restart always -it -p 8000:8000 --name deno-image registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
在浏览器中访问 Digital Ocean 地址,我们现在看到:
搞定了!
了解更多关于使用 GitHub Actions 自动化部署到 Digital Ocean 的信息。.
Google Cloud Run
Google Cloud Run 是一个托管计算平台,允许您在 Google 的可伸缩基础设施上运行容器。
您将需要:
- 一个 Google Cloud Platform 账户
- 已安装
gcloud
设置 Google Artifact Registry
本节假设您已设置好 main.ts
、Dockerfile
和 docker-compose.yml
(如果尚未设置,请参考使用 Docker)。
Artifact Registry 是 GCP(Google Cloud Platform)的私有 Docker 镜像注册表。
在使用它之前,请前往 GCP 的Artifact Registry并点击“创建仓库 (Create repository)”。系统会要求您提供名称(deno-repository
)和区域(us-central1
)。然后点击“创建 (Create)”。
构建、标记并推送到 Artifact Registry
创建仓库后,我们就可以开始向其推送镜像了。
首先,让我们将注册表地址添加到 gcloud
。
gcloud auth configure-docker us-central1-docker.pkg.dev
然后,让我们构建您的 Docker 镜像。(请注意,镜像名称是在我们的 docker-compose.yml
文件中定义的。)
docker compose -f docker-compose.yml build
然后,使用新的 Google Artifact Registry 地址、仓库和名称标记它。镜像名称应遵循以下结构:{{ location }}-docker.pkg.dev/{{ google_cloudrun_project_name }}/{{ repository }}/{{ image }}
。
docker tag deno-image us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image
如果您未指定标签,它将默认使用 :latest
。
接下来,推送镜像。
docker push us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image
更多关于如何向 Google Artifact Registry 推送和拉取镜像的信息。.
您的镜像现在应该会出现在您的 Google Artifact Registry 中了!
创建 Google Cloud Run 服务
我们需要一个可以构建这些镜像的实例,所以让我们前往 Google Cloud Run 并点击“创建服务 (Create Service)”。
我们将其命名为“hello-from-deno”。
选择“从现有容器镜像部署一个修订版本 (Deploy one revision from an existing container image)”。使用下拉菜单从 deno-repository
Artifact Registry 中选择镜像。
选择“允许未经身份验证的请求 (allow unauthenticated requests)”,然后点击“创建服务 (Create service)”。确保端口为 8000
。
完成后,您的应用程序就应该上线了。
太棒了!
gcloud
部署
使用 创建完成后,我们就可以从 gcloud
命令行工具部署到该服务了。命令遵循以下结构:gcloud run deploy {{ service_name }} --image={{ image }} --region={{ region }} --allow-unauthenticated
。请注意,image
名称遵循上述结构。
对于本示例,命令如下:
gcloud run deploy hello-from-deno --image=us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image --region=us-central1 --allow-unauthenticated
成功!
了解更多关于使用 GitHub Actions 自动化部署到 Google Cloud Run 的信息。.
npm 和 Deno 的下一步计划
虽然稳定 npm 兼容性是 Deno 的一个重要里程碑,但在接下来的几个月里,我们还有大量工作要做,包括修复 bug、增加对更多 npm 模块的覆盖范围以及优化性能。
为了帮助我们让 Deno 使用 npm 变得轻而易举,我们非常希望您能尝试将 npm 与 Deno 结合使用。如果您遇到任何问题,请提交问题。