とあるウェブアプリを作っていて、そのアプリがNext.jsとCockroachDBとPrismaで動いています。
そしてローカル環境はDocker Composeでまとめて動かしているのですが、今までCockroachDBのローカル環境は作らずPostgreSQLでなんとかしていたのですが、さすがに作りたいなと思い、作ってみました。
そこでDocker Compose + CockroachDB + Prismaの環境立ち上げとか記事を調べてみたのですが、全然見つからない!
公式ドキュメントみてもなんかちょっとよく分からなかった...(読解力 & 技術力の欠如)
まぁ結局なんとかしてみたので簡単にまとめます。
結論
とりあえず簡単に環境立ち上げまでの完成形を説明します。
クラウド上のCockroachDBにアクセスできるようにPrismaの設定とかはもう終わってる前提で行きます。
あくまでローカル上で立ち上げる際の説明です。
ステップ1 Docker Composeで立ち上げ
Dockerfileを作ります。
FROM cockroachdb/cockroach:v23.1.22
まぁ、これだけなんですけど。
compose.ymlを書きます。
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
tty: true
stdin_open: true
init: true
environment:
TZ: Asia/Tokyo
CHOKIDAR_USEPOLLING: 1
HOST: 0.0.0.0
ports:
- "10111:10111"
working_dir: /app/
volumes:
- ./:/app/
db:
build:
context: .
dockerfile: ./docker/db/Dockerfile
tty: true
stdin_open: true
ports:
- "26257:26257"
- "8080:8080"
environment:
TZ: Asia/Tokyo
COCKROACH_USER: root
COCKROACH_PASSWORD: root
command: start-single-node --insecure
app
がPrismaを動かすアプリです。Node.js用のコンテナですね。portsやworking_dirはご自身の環境に合わせてください。
db
がcockrachDB用のコンテナです。公式サイトには「3つのノードが~なんたら~」って言ってるのですがローカルだしとりあえず1でいいやの精神で行ってます。
COCKROACH_USER
がユーザー名で、COCKROACH_PASSWORD
がパスワードです。そのままですね。
ポートはDB接続用の26257
と、CockroachDBのコンソール?管理画面?的なのにアクセスできる8080
を指定してます。
これでコンテナたちを起動します。
docker compose up -d
ステップ2 接続テスト
これでコンテナが起動するとCockroachDBには接続できる状態だと思います。接続してみます。
ウェブ上でhttp://localhost:8080/
にアクセスしてみてください。こういう画面に行けたらOKです。
SQLも打ってみます。
ご自身のターミナルに戻ってもらって、DBに接続してSQL shellを開きます。
docker compose exec -it db ./cockroach sql --insecure
このコマンドで接続できます。
Welcome to ~って歓迎されます。
show databases;
って打ってみましょう。
接続できてますね。
ステップ3 Prismaの設定
クラウド上のCockroachDBには接続できる前提(勝手に前提にしましたが)なので、もうschema.prisma
とかは手元にあると思います。
なのであとはenvファイルを書き換えるだけですね。こんな感じです。
DATABASE_URL="postgresql://root:root@db:26257/defaultdb"
CockroachDBはPostgreSQLベースなので、URLはpostgresql://[ユーザー]:[パスワード]@[ホスト]:[ポート]/[DB名]
です。なので、先程compose.yml
で設定した、ユーザー名はroot
、パスワードもroot
、ホストはcompose.yml
のサービス名ですね、dbを設定して、ポートに26257、DB名にdefaultdbを設定している感じです。
一応Prismaのschema.prisma
の例も記載しておきます。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "cockroachdb"
url = env("DATABASE_URL")
}
// 例としてusersテーブル
model User {
id String @id @default(cuid())
email String @unique
password String
@@map("users")
}
こんな感じでPrismaでローカルのCockroachDBにアクセスできるかと思います。
pushしてみます。
npx prisma db push
動いてそうですね。
良いんじゃないでしょうか!
間違ってるとことかあれば教えてください。