prismaをGCPにデプロイする

2025-01-02

cloud
Example Image

expressとmySQLならデプロイできるのに、prismaが入るとエラーにはまる。

やっとエラーから脱出したので、その方法をまとめます!

WebSocket

prismaの環境変数にDATABASE_URLを指定しますが、ローカルで開発する時とGCPで実行する時とでurlのスキーマが異なります。

例えば、ローカル開発環境では以下のように指定します。

DATABASE_URL="mysql://root:password@localhost:3306/データベース名"

しかし、GCP上で実行する場合、以下のようにsocket を追加する必要があります。

DATABASE_URL=mysql://root:password@localhost:3306/データベース名?socket=/cloudsql/接続名

接続名はCloud SQLインスタンスの接続名です。この形式で、PrismaがCloud SQLに接続できるようになります。

Dockerfile

Dockerfile内でnpx prisma migrate deployやnpx prisma db seedを実行するとビルドエラーが生じます。

これは、コンテナ実行前にデータベースとの接続ができないためです。

ただし、prisma-clientの生成はデータベースを介さないので、npx prisma generateは実行することができます。

npx prisma generateがないとエラーが生じるので忘れずに実行します。

コンテナの軽量化は後回しにして、ファイルを全てコンテナに入れます。

FROM node:20

WORKDIR /app

COPY . .
RUN npm install

RUN npx prisma generate

EXPOSE 3000

CMD ["npm", "start"]

マイグレーションの場所

アプリのデプロイ時に実行できないマイグレーションは、Cloud Runジョブで行います!

この方法により、アプリケーションのサービスとは独立した形でマイグレーションを管理できます。

Cloud Runサービスの横にあります。

サービス同様コンテナをデプロイし実行できます。

Cloud Runジョブのコンテナではnpx migrate deployなどのコマンドが使用できます。

アプリのコンテナとは別に、マイグレーションを実行するコンテナをを作ってここで実行します。

環境変数DATABASE_URLには、アプリに使用するデータベースと同じ値を使用します。

これにより、アプリでもマイグレーション済みのデータベースを使用できるようになります!

マイグレーション用のコンテナの作り方

Archfact Registryにて、アプリのリポジトリと別にマイグレーション用のリポジトリを作成します。

まずは、アプリをローカルでマイグレートしsqlを生成しておきます。

それから、以下の内容でスクリプトファイルmigrate.tsを作成します。

import { execSync } from 'child_process';

async function main() {
  try {
    console.log('Starting database migration...');

    // データベースマイグレーションの実行
    execSync('npx prisma db seed', { stdio: 'inherit' });

    console.log('Migration completed successfully');
  } catch (error) {
    console.error('Migration failed:', error);
  }
}

main();

execSyncは、Node.jsでシェルコマンドを実行させるメソッドです。

上記のスクリプトを実行することでprismaのコマンドを実行できます。

それから、以下の内容でDockerfileを作成します。

FROM node:20

WORKDIR /app

COPY . .
RUN npm install

RUN npx prisma generate

EXPOSE 3000

CMD ["ts-node", "src/migrate.ts"]

最後にdockerでビルドし、マイグレーション用のリポジトリにプッシュします。

まとめ

環境変数と、マイグレーションする場所を変更することで、マイグレーションが成功しました。

デプロイできるようになると、開発のモチベーションがぐっとあがりますね!

GitHub - risu043/prisma-express...

Contribute to risu043/prisma-express dev...

favicon github.com

OGP image

share