跳到主要内容
Deno 2.4 发布,带来 deno bundle、bytes/text 导入、稳定的 OTel 等功能
了解更多
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 镜像构建的 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 来在本地测试。

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 控制台

然后点击“容器 (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 interface

准备好后,点击“创建容器服务 (Create container service)”。

稍等片刻,您的新容器应该就会部署完成。点击公共地址,您应该就能看到您的 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(Google Cloud Platform)的私有 Docker 镜像注册表。

在使用它之前,请前往 GCP 的Artifact Registry并点击“创建仓库 (Create repository)”。系统会要求您提供名称(deno-repository)和区域(us-central1)。然后点击“创建 (Create)”。

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 并点击“创建服务 (Create Service)”。

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

选择“从现有容器镜像部署一个修订版本 (Deploy one revision from an existing container image)”。使用下拉菜单从 deno-repository Artifact Registry 中选择镜像。

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

完成后,您的应用程序就应该上线了。

Hello from Google Cloud Run

太棒了!

使用 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

Hello from Google Cloud Run

成功!

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

npm 和 Deno 的下一步计划

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

为了帮助我们让 Deno 使用 npm 变得轻而易举,我们非常希望您能尝试将 npm 与 Deno 结合使用。如果您遇到任何问题,请提交问题

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