随处运行 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 控制台。
然后点击“容器”和“创建容器服务”。在页面中间,点击“设置你的首次部署”,然后选择“指定自定义部署”。
你可以编写任何你想要的容器名称。
在“镜像”中,请务必使用你在 Docker Hub 中设置的 {{ username }}/{{ image }}
。对于此示例,它是 lambtron/deno-on-aws-lightsail
。
让我们点击“添加开放端口”并添加 8000
。
最后,在“公共端点”下,选择你刚刚创建的容器名称。
完整表格应如下所示
准备就绪后,点击“创建容器服务”。
片刻之后,你的新容器应该已部署。点击公共地址,你应该会看到你的 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 的私有 Docker 镜像注册表。
在使用它之前,请转到 GCP 的 Artifact Registry 并点击“创建仓库”。你将被要求输入名称(deno-repository
)和区域(us-central1
)。然后点击“创建”。
构建、标记并推送到 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 并点击“创建服务”。
我们将其命名为“hello-from-deno”。
选择“从现有容器镜像部署一个修订版本”。使用下拉菜单从 deno-repository
Artifact Registry 中选择镜像。
选择“允许未经身份验证的请求”,然后点击“创建服务”。确保端口为 8000
。
完成后,你的应用程序现在应该已上线
太棒了!
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
成功!
了解更多关于使用 GitHub Actions 自动化部署到 Google Cloud Run 的信息.
npm 和 Deno 的下一步是什么
虽然稳定 npm 兼容性是 Deno 的一个重要里程碑,但在未来几个月内,我们还有大量工作要做,以修复错误、增加更多 npm 模块的覆盖范围并优化性能。
为了帮助我们更轻松地将 npm 与 Deno 一起使用,我们希望你尝试将 npm 与 Deno 一起使用。如果你遇到任何问题,请打开一个 issue。