メインコンテンツへスキップ

Deno Deployへのデプロイ

このガイドでは、シンプルなアプリケーションを構築し、Deno Deployにデプロイする方法を学ぶことができます。このアプリケーションはPrisma ORMを使用して、Prisma Postgresデータベースへの各リクエストのログを保存します。

このガイドでは、Deno CLI、Deno Deploy、Prisma Client、およびPrisma PostgresとPrisma CLIの使用について説明します。

情報

このガイドでは、Prisma Postgresデータベースと連携してDeno Deployにアプリケーションをデプロイする方法を示しますが、Prisma Accelerateで独自のデータベースを使用することもできます。

前提条件

  • 無料のアカウント
  • 無料の Deno Deployアカウント
  • Node.jsとnpmがインストール済み
  • Deno v1.29.4 以降がインストール済み。詳細はこちら
  • (推奨)Prisma ORMの最新バージョン。
  • (推奨)VS Code用Deno拡張機能。詳細はこちら

1. アプリケーションとデータベースのセットアップ

まず、プロジェクト用のディレクトリを作成し、`deno run`を使用して`prisma init`をnpm specifiersを持つnpmパッケージとしてアプリケーションを初期化します。

アプリケーションをセットアップするには、ターミナルを開き、任意の場所に移動します。次に、以下のコマンドを実行してアプリケーションをセットアップします

mkdir prisma-deno-deploy
cd prisma-deno-deploy
deno run --reload -A npm:prisma@latest init --db

プロジェクトの名前を入力し、データベースリージョンを選択してください。

このコマンドは

  • CLIをあなたのに接続しますアカウント。ログインしていない場合やアカウントをお持ちでない場合は、ブラウザが開き、新しいアカウントの作成または既存のアカウントへのサインインの手順を説明します。
  • データベースモデル用の`schema.prisma`ファイルを含む`prisma`ディレクトリを作成します。
  • `DATABASE_URL`を含む`.env`ファイルを作成します(例:Prisma Postgresの場合、`DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..."`のようになります)。

`prisma/schema.prisma`ファイルを編集して、`Log`モデルを定義し、カスタム`output`パスを追加し、`deno`プレビュー機能フラグを有効にします

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["deno"]
output = "../generated/client"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model Log {
id Int @id @default(autoincrement())
level Level
message String
meta Json
}

enum Level {
Info
Warn
Error
}
注意

Denoを使用するには、`schema.prisma`ファイルの`generator`ブロックにプレビュー機能フラグ`deno`を追加する必要があります。

Denoでは、Prisma Clientをカスタムロケーションに生成する必要もあります。これは、`generator`ブロックの`output`パラメータで有効にできます。

次に、Prisma Postgresを使用するために必要なClient拡張機能をインストールします

deno install npm:@prisma/extension-accelerate

Prisma ClientはデフォルトでDenoの`.env`ファイルを読み取らないため、`dotenv-cli`もローカルにインストールする必要があります

deno install npm:dotenv-cli

2. データベーススキーマを作成する

データモデルが配置され、データベース接続が構成されたので、データモデルをデータベースに適用できます。

deno run -A npm:prisma migrate dev --name init

このコマンドは2つのことを行います

  1. このマイグレーションのための新しいSQLマイグレーションファイルを作成します
  2. データベースに対してSQLマイグレーションファイルを実行します

この時点で、コマンドには追加の効果があります。コマンドはPrisma Clientをインストールし、プロジェクト用の`package.json`ファイルを作成します。

3. アプリケーションを作成する

これでローカルのDenoアプリケーションを作成できます。プロジェクトのルートフォルダに`index.ts`を作成し、以下のコンテンツを追加します

index.ts
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { withAccelerate } from "npm:@prisma/extension-accelerate";
import { PrismaClient } from "./generated/client/deno/edge.ts";

const prisma = new PrismaClient().$extends(withAccelerate());

async function handler(request: Request) {
// Ignore /favicon.ico requests:
const url = new URL(request.url);
if (url.pathname === "/favicon.ico") {
return new Response(null, { status: 204 });
}

const log = await prisma.log.create({
data: {
level: "Info",
message: `${request.method} ${request.url}`,
meta: {
headers: JSON.stringify(request.headers),
},
},
});
const body = JSON.stringify(log, null, 2);
return new Response(body, {
headers: { "content-type": "application/json; charset=utf-8" },
});
}

serve(handler);
情報

VS Codeエラー:`An import path cannot end with a '.ts' extension`

VS Codeを使用しており、`index.ts`の先頭にある`import`ステートメントに対してエラー`An import path cannot end with a '.ts' extension`が表示される場合は、VS Code用Deno拡張機能をインストールし、[表示] > [コマンドパレット]を選択して、コマンド[Deno: ワークスペース構成の初期化]を実行する必要があります。これにより、VS Codeに現在のプロジェクトのTypeScriptファイルをDenoで実行する必要があることを伝え、正しい検証がトリガーされます。

4. ローカルでアプリケーションをテストする

これで、ローカルでアプリケーションを起動し、ログエントリの作成をテストできます。

npx dotenv -- deno run -A ./index.ts

ウェブブラウザで、http://localhost:8000/ を開きます。このページは、リクエストをデータベースに書き込みます。

{
"id": 1,
"level": "Info",
"message": "GET http://localhost:8000/",
"meta": {
"headers": "{}"
}
}

ページを数回リロードしてください。

リロードするたびに、スクリプトは新しいログエントリを生成し、現在のログエントリの`id`が増加します。

これにより、ローカル環境から実行した場合にアプリケーションが動作することが確認できます。

5. リポジトリを作成してGitHubにプッシュする

プロジェクトをDeno Deployに追加し、変更をプッシュするたびに自動デプロイを有効にするには、GitHubリポジトリが必要です。

GitHubリポジトリをセットアップするには

  1. プライベートGitHubリポジトリを作成する.

  2. ローカルでリポジトリを初期化し、次のコマンドを使用して変更をGitHubにプッシュします

    git init -b main
    git remote add origin https://github.com/<username>/prisma-deno-deploy
    git add .
    git commit -m "initial commit"
    git push -u origin main

6. Deno Deployへのデプロイ

GitHubリポジトリを使用して、アプリケーションをDeno Deployに追加します

  1. https://dash.deno.com/ にアクセスします。
  2. GitHub組織またはユーザーを選択し、次にリポジトリを選択します。
  3. 本番ブランチを選択し、[Fresh(自動)]モードを選択して、リポジトリに変更をプッシュするたびにDeno Deployがデプロイできるようにします。
  4. プロジェクトのエントリーポイントとして`index.ts`を選択します。
  5. [作成とデプロイ]をクリックします。

`DATABASE_URL`環境変数を追加する必要があるため、デプロイは失敗するはずです。

プロジェクトの設定を見つけて移動します。

  1. データベース接続文字列を定義するには、[環境変数]セクションの[変数を追加]をクリックします。
    1. [KEY]に、`DATABASE_URL`と入力します。
    2. [VALUE]に、データベース接続文字列を貼り付けます。
  2. [保存]をクリックします。

再デプロイメントをトリガーするには、コードを追加して別のコミットを作成する必要があります。

`index.ts`ファイルに次のコードを追加します

index.ts
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { withAccelerate } from "npm:@prisma/extension-accelerate";
import { PrismaClient } from "./generated/client/deno/edge.ts";

const prisma = new PrismaClient().$extends(withAccelerate());

async function handler(request: Request) {
// Ignore /favicon.ico requests:
const url = new URL(request.url);
if (url.pathname === "/favicon.ico") {
return new Response(null, { status: 204 });
}

console.log("Request received.")

const log = await prisma.log.create({
data: {
level: "Info",
message: `${request.method} ${request.url}`,
meta: {
headers: JSON.stringify(request.headers),
},
},
});
const body = JSON.stringify(log, null, 2);
return new Response(body, {
headers: { "content-type": "application/json; charset=utf-8" },
});
}

serve(handler);

新しい変更をコミットします

git add . 
git commit -m "add log"
git push origin main

これによりデプロイが再構築され、環境変数が追加されたため、これで動作するようになります。完了したら、デプロイ出力のURLに従ってください。アプリケーションは以前と同じ結果を示し、新しい、インクリメントされたログレコードIDが表示されるはずです

{
"id": 5,
"level": "Info",
"message": "GET https://prisma-deno-deploy.deno.dev/",
"meta": {
"headers": "{}"
}
}

まとめ

TypeScriptで作成したDenoアプリケーションを正常にデプロイしました。このアプリケーションは、Prisma Postgresデータベースに接続するPrisma Clientを使用しています。