跳到主要内容
Run npm and Deno anywhere.

随处运行 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 镜像 构建的 Dockerfiledocker-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 在本地测试一下。

hello world from localhost

以下每个部分都将重点介绍构建这些镜像并将它们部署到各自的平台。

AWS Lightsail

Amazon Lightsail 是开始使用 Amazon Web Services 最简单且最便宜的方式。它允许你托管虚拟机甚至整个容器服务。

本节将向你展示如何使用 Docker、Docker Hub 和 GitHub Actions 将 Deno 应用程序部署到 Lightsail。

你将需要

在此处查看源代码.

构建、标记并推送到 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 仓库中看到新的镜像

new image on docker hub

创建并部署到 Lightsail 容器

让我们前往 Amazon Lightsail 控制台

然后点击“容器”和“创建容器服务”。在页面中间,点击“设置你的首次部署”,然后选择“指定自定义部署”。

你可以编写任何你想要的容器名称。

在“镜像”中,请务必使用你在 Docker Hub 中设置的 {{ username }}/{{ image }}。对于此示例,它是 lambtron/deno-on-aws-lightsail

让我们点击“添加开放端口”并添加 8000

最后,在“公共端点”下,选择你刚刚创建的容器名称。

完整表格应如下所示

create container service interface

准备就绪后,点击“创建容器服务”。

片刻之后,你的新容器应该已部署。点击公共地址,你应该会看到你的 Deno 应用程序

Hello world from Deno and AWS Lightsail

它工作了!

在我们的手册中了解更多关于使用 GitHub Actions 自动化此部署的信息。

Digital Ocean

Digital Ocean 是一个流行的云基础设施提供商,提供各种托管服务,从网络到计算再到存储。

你将需要

在此处查看源代码.

构建、标记并将你的 Docker 镜像推送到 Digital Ocean 容器注册表

本节假设你已设置好你的 main.tsDockerfiledocker-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

New deno image on Digital Ocean container registry

完美!

通过 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 地址,我们现在看到

Hello from Deno and Digital Ocean

成功了!

了解更多关于使用 GitHub Actions 自动化部署到 Digital Ocean 的信息.

Google Cloud Run

Google Cloud Run 是一个托管计算平台,允许你在 Google 的可扩展基础设施上运行容器。

你将需要

在此处查看源代码.

设置 Google Artifact Registry

本节假设你已设置好你的 main.tsDockerfiledocker-compose.yml(如果你尚未设置,请参考使用 Docker)。

Artifact Registry 是 GCP 的私有 Docker 镜像注册表。

在使用它之前,请转到 GCP 的 Artifact Registry 并点击“创建仓库”。你将被要求输入名称(deno-repository)和区域(us-central1)。然后点击“创建”。

New repository in Google Artifact Repository

构建、标记并推送到 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 中了!

Image in Google Artifact Registry

创建 Google Cloud Run 服务

我们需要一个实例来构建这些镜像,因此让我们转到 Google Cloud Run 并点击“创建服务”。

我们将其命名为“hello-from-deno”。

选择“从现有容器镜像部署一个修订版本”。使用下拉菜单从 deno-repository Artifact Registry 中选择镜像。

选择“允许未经身份验证的请求”,然后点击“创建服务”。确保端口为 8000

完成后,你的应用程序现在应该已上线

Hello from Google Cloud Run

太棒了!

使用 gcloud 部署

创建服务后,我们将能够从 gcloud CLI 部署到此服务。该命令遵循以下结构: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

Hello from Google Cloud Run

成功!

了解更多关于使用 GitHub Actions 自动化部署到 Google Cloud Run 的信息.

npm 和 Deno 的下一步是什么

虽然稳定 npm 兼容性是 Deno 的一个重要里程碑,但在未来几个月内,我们还有大量工作要做,以修复错误、增加更多 npm 模块的覆盖范围并优化性能。

为了帮助我们更轻松地将 npm 与 Deno 一起使用,我们希望你尝试将 npm 与 Deno 一起使用。如果你遇到任何问题,请打开一个 issue

你正在使用 Deno 和 npm 构建吗?请在 TwitterDiscord 上告诉我们!