跳到主要内容
Deno 2 终于来了 🎉️
了解更多
Run npm and Deno anywhere.

在任何地方运行 npm 和 Deno

我们完成了第一个发布周!除了宣布 npm 兼容性在 1.28 版中稳定,我们还展示了如何 使用持久性数据 npm 模块使用框架构建,以及 Deno 的安全优先模型如何帮助缓解依赖项漏洞。我们甚至举办了一场 特别直播,在直播中我们回答了您的问题,并演示了使用 Deno 与 npm 说明符的多种方法。

今天,我们想重点介绍一下,您可以在任何 *虚拟专用服务器* 上运行您的 npm 和 Deno 代码。

是的,Deno Deploy 是托管 Deno 代码的绝佳选择,尤其是当您希望它在 边缘 上靠近您的用户执行时。部署到 我们的 V8 隔离云 只需几秒钟,并且可以在几秒钟内在世界各地访问。此外,npm 说明符目前在 Deploy 中不受支持,但很快就会支持。

但是,有很多虚拟专用服务器可以托管 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/[email protected]/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 控制台

然后单击“容器”和“创建容器服务”。在页面下半部分,单击“设置您的第一个部署”并选择“指定自定义部署”。

您可以随意输入任何容器名称。

Image 中,请确保使用您在 Docker Hub 中设置的 {{ username }}/{{ image }}。在本例中,它是 lambtron/deno-on-aws-lightsail

让我们单击 Add open ports 并添加 8000

最后,在 PUBLIC ENDPOINT 下,选择您刚刚创建的容器名称。

完整表单应如下所示

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。如果您遇到任何问题,请提交问题

您是否正在使用 Deno 和 npm 进行构建?请在 TwitterDiscord 上告诉我们!