在任何地方运行 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 镜像 构建的 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/[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
来在本地测试它。
以下每个部分将重点介绍如何构建这些镜像并将其部署到各自的平台。
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 控制台。
然后单击“容器”和“创建容器服务”。在页面下半部分,单击“设置您的第一个部署”并选择“指定自定义部署”。
您可以随意输入任何容器名称。
在 Image
中,请确保使用您在 Docker Hub 中设置的 {{ username }}/{{ image }}
。在本例中,它是 lambtron/deno-on-aws-lightsail
。
让我们单击 Add open ports
并添加 8000
。
最后,在 PUBLIC ENDPOINT
下,选择您刚刚创建的容器名称。
完整表单应如下所示
准备就绪后,单击“创建容器服务”。
片刻之后,您的新容器将部署完成。单击公共地址,您应该会看到您的 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 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。如果您遇到任何问题,请提交问题。