Ubuntu 18.04でPrismaサーバーを手動でセットアップする方法

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにthe Electronic Frontier Foundationを選択しました。

前書き

Prismaは、アプリケーションの従来のオブジェクトリレーショナルマッピングツール(ORM)を置き換えるデータレイヤーです。 Prismaは、GraphQLサーバーとREST APIの両方の構築をサポートし、type safetyに重点を置いてデータベースへのアクセスを簡素化し、declarative database migrationsを有効にします。 型の安全性は、潜在的なコードエラーと矛盾を減らすのに役立ちますが、宣言的なデータベース移行により、データモデルをバージョン管理に保存できます。 これらの機能は、開発者がデータベースアクセス、移行、およびデータ管理ワークフローの設定に集中する時間を短縮するのに役立ちます。

データベースのプロキシとして機能するPrismaサーバーをさまざまな方法で展開し、リモートまたはローカルでホストできます。 Prismaサービスを通じて、GraphQL APIを使用してデータにアクセスし、データベースに接続することができます。これにより、リアルタイム操作とデータの作成、更新、削除が可能になります。 GraphQLは、ユーザーがサーバーから必要な正確なデータにアクセスするためのクエリを送信できるようにするAPIのクエリ言語です。 Prismaサーバーは、データベースの上にあるスタンドアロンコンポーネントです。

このチュートリアルでは、Ubuntu 18.04にPrismaサーバーを手動でインストールし、GraphQL PlaygroundでテストGraphQLクエリを実行します。 リモートサーバーでPrismaを実行しながら、Prismaセットアップコードと開発をローカルでホストし、実際にアプリケーションをビルドします。 インストールを手動で実行することにより、セットアップの基礎となるインフラストラクチャをより深く理解し、カスタマイズできるようになります。

このチュートリアルでは、Ubuntu 18.04サーバーにPrismaをデプロイするための手動の手順について説明しますが、Prismaのサイトでこのtutorialを実行することにより、DockerMachineを使用してより自動化された方法でこれを実行することもできます。

Note:このセクションで説明するセットアップには、自動バックアップやアクティブフェイルオーバーなど、本番環境対応サーバーに通常期待される機能は含まれていません。

前提条件

このチュートリアルを完了するには、次のものが必要です。

[[step-1 -—- starting-the-prisma-server]] ==ステップ1—Prismaサーバーを起動します

Prisma CLIは、Prismaサービスの展開と管理に使用される主要なツールです。 サービスを開始するには、必要なインフラストラクチャをセットアップする必要があります。これには、接続するPrismaサーバーとデータベースが含まれます。

Docker Composeを使用すると、マルチコンテナアプリケーションを管理および実行できます。 これを使用して、Prismaサービスに必要なインフラストラクチャをセットアップします。

まず、サーバーにPrismaサービス構成を保存するためのdocker-compose.ymlファイルを作成します。 このファイルを使用して、関連するデータベースであるPrismaを自動的に起動し、必要な詳細をすべて1ステップで構成します。 ファイルがDockerComposeでスピンアップされると、データベースのパスワードが構成されるため、managementAPIsecretMYSQL_ROOT_PASSWORDのパスワードを安全なものに置き換えてください。 次のコマンドを実行して、docker-compose.ymlファイルを作成および編集します。

sudo nano docker-compose.yml

次のコンテンツをファイルに追加して、Prismaセットアップのサービスとボリュームを定義します。

docker-compose.yml

version: "3"
services:
  prisma:
    image: prismagraphql/prisma:1.20
    restart: always
    ports:
      - "4466:4466"
    environment:
      PRISMA_CONFIG: |
        port: 4466
        managementApiSecret: my-secret
        databases:
          default:
            connector: mysql
            host: mysql
            port: 3306
            user: root
            password: prisma
            migrations: true
  mysql:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: prisma
    volumes:
      - mysql:/var/lib/mysql
volumes:
  mysql:

この構成は次のことを行います。

  • prisma-dbdbの2つのサービスを起動します。

  • Prismaの最新バージョンを取り込みます。 この記事を書いている時点では、それがPrisma 1.20です。

  • Prismaが使用できるポートを設定し、databasesセクションでMySQLデータベースに接続するためのすべての資格情報を指定します。

docker-compose.ymlファイルはmanagementApiSecretを設定します。これにより、他のユーザーがエンドポイントを知っていてもデータにアクセスできなくなります。 このチュートリアルをテスト展開以外の目的で使用している場合は、managementAPIsecretをより安全なものに変更する必要があります。 その場合は、後でprisma initプロセス中に入力できるように、必ず覚えておいてください。

このファイルは、MySQL Dockerイメージも取り込み、それらの資格情報も設定します。 このチュートリアルでは、このDocker ComposeファイルはMySQLイメージをスピンアップしますが、PrismaでPostgreSQLを使用することもできます。 両方のDockerイメージはDockerハブで利用できます。

ファイルを保存して終了します。

すべての詳細を保存したので、Dockerコンテナーを開始できます。 -dコマンドは、コンテナをデタッチモードで実行するように指示します。つまり、コンテナはバックグラウンドで実行されます。

sudo docker-compose up -d

これにより、prismamysqlの両方のDockerイメージがフェッチされます。 次のコマンドを使用して、Dockerコンテナが実行されていることを確認できます。

sudo docker ps

次のような出力が表示されます。

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
24f4dd6222b1        prismagraphql/prisma:1.12   "/bin/sh -c /app/sta…"   15 seconds ago      Up 1 second         0.0.0.0:4466->4466/tcp   root_prisma_1
d8cc3a393a9f        mysql:5.7                   "docker-entrypoint.s…"   15 seconds ago      Up 13 seconds       3306/tcp                 root_mysql_1

Prismaサーバーとデータベースをセットアップしたら、ローカルでPrismaサービスを展開する準備ができました。

[[step-2 -—- installing-prisma-locally]] ==ステップ2—Prismaをローカルにインストールする

Prismaサーバーは、Prismaサービスのランタイム環境を提供します。 Prismaサーバーが起動したので、Prismaサービスを展開できます。 これらの手順は、サーバーではなくローカルで実行します。

開始するには、すべてのPrismaファイルを含む別のフォルダーを作成します。

mkdir prisma

次に、そのフォルダーに移動します。

cd prisma

MacOSを使用している場合は、HomebrewでPrismaをインストールできます。 これを行うには、次のコマンドを実行してPrismaリポジトリを追加します。

brew tap prisma/prisma

その後、次のコマンドでPrismaをインストールできます。

brew install prisma

または、npmを使用して:

npm install -g prisma

Prismaをローカルにインストールすると、新しいPrismaサービスをブートストラップする準備が整います。

[[step-3 -—- creating-the-configuration-for-a-new-prisma-service]] ==ステップ3—新しいPrismaサービスの構成を作成する

インストール後、prisma initを使用して、新しいPrismaデータベースAPIのファイル構造を作成できます。これにより、Prismaを使用してアプリケーションを構築するために必要なファイルが生成されます。 エンドポイントは自動的にprisma.ymlファイルに含まれ、datamodel.prismaには、次の手順でクエリできるサンプルデータモデルが既に含まれています。 データモデルは、Prisma APIの基礎として機能し、アプリケーションのモデルを指定します。 この時点では、ファイルとサンプルデータモデルのみを作成しています。 このステップの後半でprisma deployを実行するまで、データベースに変更を加えることはありません。

これで、次のコマンドをローカルで実行して、新しいファイル構造を作成できます。

prisma init hello-world

このコマンドを実行すると、インタラクティブプロンプトが表示されます。 求められたら、Use other serverを選択し、ENTERを押します。

Output  Set up a new Prisma server or deploy to an existing server?

  You can set up Prisma for local development (based on docker-compose)
  Use existing database      Connect to existing database
  Create new database        Set up a local database using Docker

  Or deploy to an existing Prisma server:
  Demo server                Hosted demo environment incl. database (requires login)
❯ Use other server           Manually provide endpoint of a running Prisma server

次に、Prismaサーバーとして機能するサーバーのエンドポイントを提供します。 http://SERVER_IP_ADDRESS:4466のようになります。 エンドポイントがhttp(またはhttps)で始まり、ポート番号が示されていることが重要です。

OutputEnter the endpoint of your Prisma server http://SERVER_IP_ADDRESS:4466

管理APIシークレットの場合は、構成ファイルで以前に指定したフレーズまたはパスワードを入力します。

OutputEnter the management API secret my-secret

以降のオプションでは、service nameおよびservice stageに対してENTERを押すことにより、デフォルトの変数を選択できます。

OutputChoose a name for your service hello-world
Choose a name for your stage dev

また、Prismaクライアント用のプログラミング言語を選択することもできます。 この場合、優先言語を選択できます。 クライアントhereの詳細を読むことができます。

Output  Select the programming language for the generated Prisma client (Use arrow keys)
❯ Prisma TypeScript Client
  Prisma Flow Client
  Prisma JavaScript Client
  Prisma Go Client
  Don't generate

プロンプトを完了すると、行った選択を確認する次の出力が表示されます。

Output Created 3 new files:

  prisma.yml           Prisma service definition
  datamodel.prisma    GraphQL SDL-based datamodel (foundation for database)
  .env                 Env file including PRISMA_API_MANAGEMENT_SECRET

Next steps:

  1. Open folder: cd hello-world
  2. Deploy your Prisma service: prisma deploy
  3. Read more about deploying services:
     http://bit.ly/prisma-deploy-services

hello-worldディレクトリに移動します。

cd hello-world

これらの変更をサーバーにprisma deployで同期します。 これにより、ローカルマシンからPrismaサーバーに情報が送信され、Prismaサーバー上にPrismaサービスが作成されます。

prisma deploy

Noteprisma deployを再度実行すると、Prismaサービスが更新されます。

出力は次のようになります。

OutputCreating stage dev for service hello-world ✔
Deploying service `hello-world` to stage 'dev' to server 'default' 468ms

Changes:

  User (Type)
  + Created type `User`
  + Created field `id` of type `GraphQLID!`
  + Created field `name` of type `String!`
  + Created field `updatedAt` of type `DateTime!`
  + Created field `createdAt` of type `DateTime!`

Applying changes 716ms

Your Prisma GraphQL database endpoint is live:

  HTTP:  http://SERVER_IP_ADDRESS:4466/hello-world/dev
  WS:    ws://SERVER_IP_ADDRESS:4466/hello-world/dev

出力は、Prismaがデータモデル(prisma initステップで作成)に従ってtypeUserでデータベースを更新したことを示しています。 型はデータモデルの重要な部分です。これらはアプリケーションのアイテムを表し、各タイプには複数のフィールドが含まれます。 データモデルの場合、ユーザーを説明する関連フィールドは、ユーザーのID、名前、作成日時、更新日時です。

この段階で問題が発生して別の出力が得られた場合は、対話型プロンプトですべてのフィールドに正しく入力したことを再確認してください。 これを行うには、prisma.ymlファイルの内容を確認します。

Prismaサービスを実行すると、2つの異なるエンドポイントに接続できます。

  • Prismaサービスを管理および展開できるhttp://SERVER_IP_ADDRESS:4466/managementで使用可能な管理インターフェース。

  • Prismaサービス用のGraphQLAPI。http://SERVER_IP_ADDRESS:4466/hello-world/devで入手できます。

GraphQL API exploring <em>Your Project</em>

Prismaサーバーのセットアップとデプロイが正常に完了しました。 GraphQLでクエリと突然変異を調べることができます。

[[step-4 -—- running-an-example-query]] ==ステップ4—サンプルクエリの実行

Prismaの別のユースケースを調べるために、サーバー上のオープンソースのGraphQL統合開発環境(IDE)であるGraphQL playgroundツールを試すことができます。 それにアクセスするには、前のステップからブラウザーでエンドポイントにアクセスします。

http://SERVER_IP_ADDRESS:4466/hello-world/dev

mutationは、GraphQLを介してバックエンドのデータを変更(作成、更新、または削除(CRUD))する方法を説明するGraphQL用語です。 突然変異を送信して新しいユーザーを作成し、機能を調べることができます。 これを行うには、ページの左側で次の突然変異を実行します。

mutation {
  createUser(data: { name: "Alice" }) {
    id
    name
  }
}

再生ボタンを押すと、ページの右側に結果が表示されます。
GraphQL Playground Creating a New User

その後、データベースのID列を使用してユーザーを検索する場合は、次のクエリを実行できます。

query {
  user(where: { id: "cjkar2d62000k0847xuh4g70o" }) {
    id
    name
  }
}

これで、Prismaサーバーとサービスがサーバー上で稼働し、GraphQL IDEでテストクエリを実行できました。

結論

サーバーに機能するPrismaセットアップがあります。 Getting Started Guideでいくつかの追加のPrismaの使用例と次のステップを確認したり、Prisma DocsでPrismaの機能セットを調べたりできます。 このチュートリアルのすべての手順を完了すると、データベースへの接続を確認するためのいくつかのオプションがあります。1つの可能性は、Prisma Clientを使用することです。