
Prisma ORM ile Next.js ve Node.js: Schema, Migration ve Production Deploy Rehberi
Prisma 5.x ile Next.js App Router entegrasyonu, schema-first model tanımlama, migration workflow (dev/deploy), CRUD ve transaction kullanımı, connection pool yönetimi ve Buyukweb VDS üzerinde PM2 ile self-host pratiği.
Prisma ORM ile Next.js ve Node.js: Schema, Migration ve Production Deploy
Bu rehberi yazdığımız sırada elinizde okuduğunuz buyukweb.com blog sayfasının arkasında da Prisma çalışıyor — Next.js App Router + @prisma/client 5.22 + SQLite kombinasyonu. Yani aşağıdaki tavsiyeler kitap-bilgisi değil, kendi prodüksiyon stack'imizden çıkmış pratik notlar.
Prisma "tip-güvenli ORM" cümlesinin ötesinde aslında üç ayrı parça: schema-first bir DSL, migration motoru ve TypeScript ile otomatik tiplenmiş bir client. Üçü birlikte çalıştığında schema değişikliği → migration → kod tipi güncellemesi zinciri tek komut zinciriyle akıyor. Bu yazıda Prisma 5.x'i Buyukweb VDS (₺250/ay başlangıç E5 v4 VDS) üzerinde Node.js + Next.js ile production'a almanın somut adımlarını göreceksiniz: kurulum, schema yazma kuralları, migrate dev ile migrate deploy farkı, CRUD ve transaction örnekleri, connection pool ayarı ve PM2 ile deploy.
Buyukweb perspektifi: cPanel paylaşımlı hosting paketleri PHP/MySQL ağırlıklıdır; bazı cPanel sürümlerinde Node.js Selector eklentisi bulunur ama Node.js LTS sürümünü, port izinlerini ve sistem servislerini kendiniz seçmek istiyorsanız doğru seçenek VDS'tir. Üretim için
/e5v4-vdspaketinden başlayıp Node.js 20 LTS, PostgreSQL veya MariaDB ile kendi kurulumunuzu yapmak en sağlıklı yoldur.
Prisma Neden? Raw SQL ve Diğer ORM'lerle Kısa Karşılaştırma
ORM seçimi ekibe ve uygulamaya bağlı kararlar barındırır. Prisma'nın güçlü tarafı schema-first yaklaşım + otomatik üretilen TypeScript tipleri; zayıf tarafı raw SQL'in tüm esnekliğini her zaman karşılayamaması.
| Yaklaşım | Yazım Stili | Type Safety | Migration | Öğrenme Eğrisi | Tercih Senaryosu |
|---|---|---|---|---|---|
Raw SQL (pg, mysql2) |
Düz string sorgu | Manuel | Yok / kendi araç | Düşük | Performans-kritik, küçük schema |
| Knex.js (query builder) | Zincirli API | Manuel/parça | migrations |
Orta | SQL'e yakın, esnek |
| Sequelize | Class tabanlı | Eksik (TS desteği zayıf) | umzug |
Orta-yüksek | Legacy Node.js |
| TypeORM | Decorator + Active Record/Data Mapper | İyi | Otomatik | Yüksek | Enterprise, Java/.NET deneyimli ekip |
| Drizzle | TypeScript şema + zincir API | Çok iyi | Hafif | Düşük-orta | Edge runtime, küçük bundle |
| Prisma 5.x | Schema DSL + auto-generated client | Çok iyi | prisma migrate |
Düşük | Modern Next.js/Node.js, schema-first |
Prisma'nın "type-safe" iddiası şu somut şeydir: prisma.user.findMany({ where: { name: 'Ali' } }) yazdığınızda name alanı yoksa TypeScript derlemede patlar; include: { posts: true } dediğinizde dönen tipte posts: Post[] otomatik gelir. select ile alan filtreleyince dönen tip de daralır. Bu özellik IDE içinde ciddi hata önleyici.
Tercih etmeyin: Tek tablolu, 200 satırlık bir mikro hizmet için Prisma kurmayı. Schema-first iş akışı ve migration motoru oraya değer katmaz; raw
mysql2veyabetter-sqlite3daha hızlı sonuç verir. Prisma, en az 4-5 model ve büyüyen bir schema olduğunda kazanmaya başlar.
Kurulum (Buyukweb VDS Senaryosu)
VDS'te Ubuntu 22.04 / 24.04 veya AlmaLinux 9 üzerinde Node.js 20 LTS önerilir. nvm ile sürüm yönetimi pratiktir.
# Buyukweb VDS — Node.js 20 LTS kurulumu
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
node -v # v20.x.x
# Proje klasörü
mkdir uygulama && cd uygulama
npm init -y
# Prisma — dev araç + runtime client
npm install -D prisma
npm install @prisma/client
# PostgreSQL ile başlatma
npx prisma init --datasource-provider postgresql
# veya MySQL/MariaDB:
# npx prisma init --datasource-provider mysql
# veya SQLite (küçük ölçek):
# npx prisma init --datasource-provider sqlite
Komut iki dosya üretir: .env (içinde DATABASE_URL) ve prisma/schema.prisma (datasource + generator). DATABASE_URL değerini gerçek bağlantı bilgileriyle güncelleyin:
# PostgreSQL
DATABASE_URL="postgresql://kullanici:[email protected]:5432/uygulama_db?schema=public"
# MariaDB / MySQL
DATABASE_URL="mysql://kullanici:[email protected]:3306/uygulama_db"
# SQLite (Buyukweb blog stack'inin de kullandığı, küçük-orta ölçek için)
DATABASE_URL="file:./prisma/blog.db"
schema.prisma Yazımı: Model, Alan Tipleri, Relations
schema.prisma Prisma'nın kalbidir. datasource, generator ve model blokları içerir.
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
role Role @default(USER)
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
}
model Post {
id Int @id @default(autoincrement())
slug String @unique
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
tags Tag[]
publishedAt DateTime?
createdAt DateTime @default(now())
@@index([slug])
@@index([authorId, published])
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
enum Role {
USER
EDITOR
ADMIN
}
Alan tipleri pratik liste: Int, BigInt, String (@db.Text ile uzun), Boolean, DateTime, Float, Decimal (para için), Json (SQLite desteklemez), Bytes.
@default stratejileri: autoincrement() Int PK için tipik; uuid() ve cuid() collision-güvenli ID üretir; now() createdAt için; @updatedAt her update çağrısında otomatik.
Relations: 1-to-N Post.author User @relation(fields: [authorId], references: [id]), 1-to-1 @unique ile, implicit N-to-N Post.tags Tag[] + Tag.posts Post[] (Prisma ara tabloyu kendi yönetir). Ara tabloda ek alan gerekiyorsa explicit PostTag modeli yazılır. onDelete: Cascade parent silindiğinde ilişkiyi siler; üretimde Restrict "yanlışlıkla silme" riskine karşı daha güvenli.
Migration Workflow: dev / deploy / db push Farkı
Bu üç komut karıştırıldığında production'da veri kaybı yaşanır.
| Komut | Ne Yapar | Ne Zaman |
|---|---|---|
prisma migrate dev --name <isim> |
Yeni migration dosyası üretir, uygular, Prisma Client'ı yeniden oluşturur | Geliştirme — schema değiştirdikten sonra |
prisma migrate deploy |
Sadece pending migration'ları uygular; schema reset YOK | Production deploy adımı |
prisma db push |
Migration üretmeden DB schema'yı şema dosyasına eşler | Prototipleme — migration history yok |
prisma migrate reset |
TÜM DB'yi düşürür ve baştan migration'ları uygular | DEV-ONLY — production'da ASLA |
prisma migrate status |
Hangi migration'lar uygulanmış göstermek | Deploy öncesi sağlık kontrolü |
prisma migrate diff |
İki schema arasındaki farkı SQL olarak çıkarmak | Drift kontrolü |
Tipik Geliştirme Akışı
# 1) schema.prisma'yı düzenle (yeni model ekle vs.)
# 2) Migration üret + uygula
npx prisma migrate dev --name post_publishedAt_eklendi
# 3) Tip güncellenmiş Prisma Client otomatik regenerate olur
# (Manuel tetiklemek için): npx prisma generate
migrate dev her çağrıda prisma/migrations/<timestamp>_<isim>/migration.sql üretir; bu dosyaları git'e commit edin.
Production Deploy
# Buyukweb VDS — production sunucusunda
git pull
npm ci
npx prisma generate # Client kodunu yenile
npx prisma migrate deploy # Sadece pending migration'ları uygula
pm2 reload uygulama
Öneri: postinstall hook'una prisma generate koyun, build script'ine prisma generate && next build koyun (Buyukweb blog package.json'unda da bu pattern kullanılıyor).
{
"scripts": {
"build": "prisma generate && next build",
"start": "next start",
"postinstall": "prisma generate"
}
}
Prisma Client: CRUD ve Filter Pratikleri
@prisma/client kullanımı için tipik pattern'ler.
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
// findMany — pagination + ordering + select
const posts = await prisma.post.findMany({
where: { published: true, title: { contains: 'next', mode: 'insensitive' } },
orderBy: { publishedAt: 'desc' },
take: 20,
skip: 0,
select: {
id: true,
slug: true,
title: true,
author: { select: { name: true } },
},
});
// findUnique — tek kayıt, indeks/PK üzerinden
const post = await prisma.post.findUnique({
where: { slug: 'prisma-orm-next-js' },
include: { author: true, tags: true },
});
// create
await prisma.post.create({
data: {
slug: 'yeni-yazi',
title: 'Yeni Yazı',
author: { connect: { id: 1 } },
tags: { connect: [{ id: 3 }, { id: 5 }] },
},
});
// upsert — varsa güncelle, yoksa oluştur
await prisma.user.upsert({
where: { email: '[email protected]' },
update: { role: 'EDITOR' },
create: { email: '[email protected]', role: 'EDITOR' },
});
// updateMany / deleteMany — toplu işlem
await prisma.post.updateMany({
where: { author: { role: 'USER' } },
data: { published: false },
});
// count
const yayinli = await prisma.post.count({ where: { published: true } });
Filter Operatörleri
equals, not, in, notIn, contains, startsWith, endsWith, gt, gte, lt, lte, AND, OR, NOT, mode: 'insensitive' (PostgreSQL).
const result = await prisma.post.findMany({
where: {
AND: [
{ published: true },
{ OR: [{ title: { contains: 'vds' } }, { content: { contains: 'vds' } }] },
{ createdAt: { gte: new Date('2026-01-01') } },
{ NOT: { author: { role: 'USER' } } },
],
},
});
Transaction: Atomik İşlemler
İki yaklaşım vardır: array-tabanlı sequential ve interactive callback.
// Array — sıralı işlem; tümü başarılı olursa commit
await prisma.$transaction([
prisma.account.update({ where: { id: 1 }, data: { balance: { decrement: 100 } } }),
prisma.account.update({ where: { id: 2 }, data: { balance: { increment: 100 } } }),
prisma.transferLog.create({ data: { fromId: 1, toId: 2, amount: 100 } }),
]);
// Interactive — koşullu mantık
await prisma.$transaction(async (tx) => {
const stok = await tx.product.findUnique({ where: { id: 5 } });
if (!stok || stok.quantity < 1) throw new Error('Stok yok');
await tx.product.update({
where: { id: 5 },
data: { quantity: { decrement: 1 } },
});
await tx.order.create({ data: { productId: 5, userId: 7 } });
});
Interactive transaction içinde throw ederseniz tüm işlem rollback olur. Default maxWait: 2000ms, timeout: 5000ms; uzun işlemde prisma.$transaction(async (tx) => { ... }, { timeout: 15000 }) ile artırın.
Raw Queries: Ne Zaman ve Nasıl
Prisma yetmediğinde $queryRaw ve $executeRaw template literal SQL injection korumalı çalışır.
// SELECT — typed
const rows = await prisma.$queryRaw<Array<{ id: number; total: number }>>\`
SELECT id, COUNT(*)::int AS total
FROM "Post"
WHERE "authorId" = ${userId}
GROUP BY id
\`;
// INSERT/UPDATE/DELETE
const affected = await prisma.$executeRaw\`
UPDATE "Post" SET "published" = true WHERE "authorId" = ${userId}
\`;
// Dinamik kolon adı gerekiyorsa — $queryRawUnsafe (DİKKAT: SQL injection riski)
const data = await prisma.$queryRawUnsafe(
`SELECT * FROM "Post" ORDER BY "${guvenliKolon}" LIMIT 10`,
);
$queryRawUnsafe kullanırken parametreler mutlaka allow-list ile filtrelenmeli; aksi halde tek satırlık SQL injection açığı doğar.
Connection Pool ve Production Tuning
PrismaClient instance başına default 5-10 PostgreSQL bağlantısı açar. Pool boyutu DATABASE_URL içinde connection_limit parametresiyle ayarlanır:
DATABASE_URL="postgresql://kullanici:[email protected]:5432/uygulama_db?connection_limit=20&pool_timeout=10"
PostgreSQL max_connections ile orantılı düşünün. PM2 cluster mode ile 4 worker çalıştırıyorsanız her worker kendi PrismaClient'ını yaratır → 4 × 20 = 80 bağlantı. PostgreSQL max_connections=100'da yetersiz kalır; bu durumda PgBouncer transaction mode önerilir (detaylı kurulum için ID 185 PgBouncer rehberimize bakabilirsiniz).
// Query log debug
const prisma = new PrismaClient({
log: ['query', 'error', 'warn'],
});
Tercih etmeyin: Her HTTP isteğinde
new PrismaClient()çağırmayı. Connection leak ve "too many connections" hatası kaçınılmaz olur. Aşağıdaki singleton pattern Next.js HMR'ında bile bağlantıyı korur.
Next.js App Router Entegrasyonu
Next.js geliştirme sırasında HMR (Hot Module Replacement) modülü yeniden yükler; her yüklemede yeni PrismaClient oluşursa bağlantı sızar. Singleton pattern bunu önler:
// lib/prisma.ts
import { PrismaClient } from '@prisma/client';
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma ??
new PrismaClient({
log: process.env.NODE_ENV === 'development' ? ['query', 'error'] : ['error'],
});
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
Server Component (App Router)
// app/blog/page.tsx
import { prisma } from '@/lib/prisma';
export default async function BlogIndex() {
const posts = await prisma.post.findMany({
where: { published: true },
orderBy: { publishedAt: 'desc' },
take: 20,
select: { id: true, slug: true, title: true },
});
return (
<ul>
{posts.map((p) => (
<li key={p.id}><a href={`/blog/${p.slug}`}>{p.title}</a></li>
))}
</ul>
);
}
Server Action ile Mutation
// app/admin/post/actions.ts
'use server';
import { prisma } from '@/lib/prisma';
import { revalidatePath } from 'next/cache';
export async function publishPost(slug: string) {
await prisma.post.update({
where: { slug },
data: { published: true, publishedAt: new Date() },
});
revalidatePath(`/blog/${slug}`);
}
Route Handler (REST API)
// app/api/posts/route.ts
import { prisma } from '@/lib/prisma';
import { NextResponse } from 'next/server';
export async function GET() {
const posts = await prisma.post.findMany({
where: { published: true },
take: 50,
});
return NextResponse.json(posts);
}
Prisma 5.x
@prisma/clientEdge runtime'da doğrudan çalışmaz; Edge'de çalıştırmak için Prisma Accelerate gerekir. Buyukweb VDS senaryosunda Node.js runtime kullanılır — Edge gerekli değil.
Prisma Studio ve Seed
prisma studio lokal browse için 5555 portunda arayüz açar. Buyukweb VDS senaryosunda bu portu firewall'da kapalı tutun, lokalden SSH tunnel ile erişin:
# Lokal makineden SSH tunnel
ssh -L 5555:127.0.0.1:5555 kullanici@vds-ip-adresi
# VDS üzerinde
npx prisma studio # 127.0.0.1:5555 dinler
# Tarayıcıda lokalden: http://localhost:5555
Seed Script
// prisma/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
await prisma.user.upsert({
where: { email: '[email protected]' },
update: {},
create: { email: '[email protected]', name: 'Admin', role: 'ADMIN' },
});
}
main()
.catch((e) => { console.error(e); process.exit(1); })
.finally(() => prisma.$disconnect());
package.json'a prisma bloğu ekleyin:
{
"prisma": {
"seed": "tsx prisma/seed.ts"
}
}
npx prisma db seed ile çalıştırırsınız. Ekipçe tsx veya ts-node kullandığınıza göre script komutunu uyarlayın.
Performans İpuçları
selectile over-fetching önle.include: { posts: true }her postun tüm alanlarını çeker; gerekiyorsainclude: { posts: { select: { id: true, title: true } } }deyin.- N+1 problemi: Listede her elemana ayrı sorgu atmak yerine
includeveyafindMany+where: { id: { in: [...] } }ile batch çekin. - Pagination:
take+skipküçük ölçekte tamam; büyük tablolarda cursor-based pagination (cursor: { id: lastId }) daha verimli. - Index:
@@index([authorId, published])gibi composite index'ler en sık WHERE kalıbına göre eklenmeli. - Query log: Yavaş sorgu varsa
log: ['query']ile süresini ölçün, sonra EXPLAIN ile DB tarafına bakın.
Tipik Hatalar ve Çözümleri
| Hata Kodu | Anlam | Çözüm |
|---|---|---|
P2002 |
Unique constraint çakışması | upsert veya try/catch ile yakala |
P2025 |
Kayıt bulunamadı (update/delete öncesi) |
findUnique ile null kontrol |
P1001 |
DB sunucusuna erişilemedi | DATABASE_URL, firewall, port |
P1008 |
İşlem zaman aşımı | pool_timeout artır veya pool boyutu büyüt |
P2024 |
Connection pool timeout | connection_limit artır, PgBouncer ekle |
P3009 |
Migration drift / failed migration | prisma migrate resolve --rolled-back <name> |
import { Prisma } from '@prisma/client';
try {
await prisma.user.create({ data: { email: '[email protected]' } });
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError && e.code === 'P2002') {
return { error: 'Bu e-posta zaten kayıtlı.' };
}
throw e;
}
Buyukweb VDS Üzerinde PM2 ile Self-Host
Production deploy adımları (Ubuntu 22.04 / 24.04 — /e5v4-vds üzerinde):
# Node 20 + PM2
nvm install 20 && nvm use 20
npm install -g pm2
# PostgreSQL 15 (kendi DB'niz)
sudo apt install postgresql-15 -y
sudo -u postgres psql -c "CREATE USER uygulama_user WITH PASSWORD 'GUVENLI_SIFRE';"
sudo -u postgres psql -c "CREATE DATABASE uygulama_db OWNER uygulama_user;"
# Uygulama
git clone <repo-url> /var/www/uygulama
cd /var/www/uygulama
npm ci
cp .env.example .env.production # DATABASE_URL'i düzenleyin
NODE_ENV=production npx prisma migrate deploy
NODE_ENV=production npm run build
# PM2 ile başlat
pm2 start npm --name uygulama -- start
pm2 save
pm2 startup systemd
PostgreSQL portu 5432 dış dünyaya açık olmamalı; listen_addresses = 'localhost' ve pg_hba.conf localhost-only kalsın. Uygulama aynı VDS'te çalıştığında bu varsayılan yeterli. Nginx proxy_pass http://127.0.0.1:3000 ile Next.js'i 80/443 portunda yayınlar; TLS için Let's Encrypt + certbot standart yol. PM2 cluster mode'da (pm2 start npm --name uygulama -i max -- start) her worker kendi PrismaClient'ını yaratır — toplam bağlantı = worker × connection_limit; PostgreSQL max_connections'ı buna göre planlayın.
Tercih etmeyin: Production veritabanını deploy'larda
prisma db pushile güncellemeyi. Migration history oluşmaz ve schema drift kaçınılmaz olur. Production yolu daimamigrate deploy.
Buyukweb Hosting Bağlantısı
| Kullanım | Önerilen Buyukweb Paket |
|---|---|
| Üretim Node.js + Prisma | VDS Sunucu — root, port izinleri |
| NVMe IOPS isteyen DB | E5 v4 VDS — PostgreSQL/MariaDB için ideal |
| PHP/MySQL ağırlıklı klasik site | cPanel Web Hosting — Node.js çalıştırması için VDS önerilir |
| WordPress (Prisma'sız) | WordPress Hosting |
| Ölçek büyürse | Fiziksel Dedicated |
Buyukweb VDS paketleri NVMe SSD + KVM sanallaştırma + L3/L4/L7 DDoS koruması + Veeam altyapısıyla günlük otomatik sunucu yedeklemesi içerir; Prisma uygulamanızın altyapı tarafı tamamen sizin kontrolünüzdedir.
Sıkça Sorulan Sorular
Prisma vs Sequelize hangisi?
Yeni bir TypeScript projesi başlatıyorsanız Prisma'nın schema-first yaklaşımı ve otomatik üretilen tipler iş akışını hızlandırır. Sequelize daha eski bir kütüphane, TypeScript desteği eklenmiş olsa da Prisma kadar tip-güvenli değil. Legacy bir Sequelize projesinin Prisma'ya taşınması ise schema'nın prisma db pull ile introspect edilip migration'ların elden geçirilmesini gerektirir; küçük projede 1-2 gün, büyükte 1-2 hafta.
migrate dev ile db push farkı nedir?
migrate dev her schema değişikliği için prisma/migrations/ altında SQL dosyası üretir; bu dosyalar git'e commit edilir, production'a migrate deploy ile uygulanır — yani versiyonlanmış değişiklik geçmişi olur. db push migration üretmeden direkt schema'yı DB'ye dayatır; prototipleme için pratiktir ama production'da kullanılmamalıdır çünkü hangi değişiklik ne zaman yapıldı bilgisi kaybolur.
Next.js'te Prisma singleton şart mı?
Production build'de Next.js modülü tek kez yükler, tek instance yeterli olur. Geliştirme sırasında HMR her dosya değişikliğinde modülü yeniden yükler ve singleton olmazsa her seferinde yeni PrismaClient doğar — kısa sürede "too many connections" hatası alırsınız. Yani dev için şart, production için iyi pratik.
Connection pool ne işe yarar?
Her sorgu için yeni TCP/PostgreSQL bağlantısı açıp kapatmak yerine, hazır bir bağlantı havuzu tutar; gelen istek havuzdan müsait olanı alır, biter bırakır. Pool olmadan PostgreSQL'in max_connections sınırına çabuk dayanırsınız. Prisma default pool 5-10 bağlantıdır; connection_limit URL parametresiyle artırılır.
Prisma Edge runtime'da çalışır mı?
Standart @prisma/client Node.js runtime gerektirir; Edge çalıştırmaz. Edge'de Prisma kullanmanın yolu Prisma Accelerate (HTTP-tabanlı bağlantı yönetimi) servisidir. Buyukweb VDS senaryosunda Node.js runtime kullandığınız için Edge sınırlaması sizi etkilemez.
Schema değişikliğinde mevcut data nasıl korunur?
migrate dev üretilen migration.sql dosyasını git'e commit etmeden önce gözle inceleyin: DROP COLUMN veya rename gibi yıkıcı bir adım varsa veri kaybı olabilir. Kolon yeniden adlandırması Prisma için iki adım sorunu olur (drop + add); önce @map("eski_isim") ile mapping tanıtıp sonra fiziksel rename'i ayrı migration'da yapın. Production migration öncesi mutlaka DB yedeği alın (ID 176 yedekleme rehberimizde detayı var).
PostgreSQL mi MySQL mi MariaDB mi Prisma için?
Prisma üçünü de provider seviyesinde tam destekler; seçim ekibinize ve gereksinimlerinize bağlı. PostgreSQL'in jsonb ve gelişmiş tip sistemi modern uygulamalar için artıdır; MariaDB cPanel hosting'te varsayılan olduğundan bu tarafa yakınsanız sürtünmesizdir. Buyukweb VDS'te ikisinden birini kendiniz kurarsınız.
SQLite production'da kullanılır mı?
Tek sunucu, düşük yazma yoğunluğu ve okuma-ağırlıklı uygulamalarda kullanılır — Buyukweb blog'u (bu yazıyı okuduğunuz site) SQLite kullanır ve memnunuz. Ama yüksek concurrent yazma gerekiyorsa veya birden fazla uygulama sunucusu DB'ye eşzamanlı yazıyorsa PostgreSQL/MariaDB tercih edin.
Prisma generate ne zaman tetiklenir?
prisma migrate dev otomatik tetikler. schema.prisma değiştirip migration üretmediğinizde manuel npx prisma generate çalıştırın. CI/CD pipeline'da postinstall hook ile veya build script'inin başında prisma generate koymak güvenlidir — Buyukweb blog package.json'unda da aynı pattern kullanılıyor.
"Connection pool timeout (P2024)" hatası ne demek?
Pool dolu, müsait bağlantı yok ve pool_timeout saniyesi içinde de boşalmadı. İki neden tipik: (a) uzun sorgu pool'u tıkıyor — yavaş sorguları optimize edin, (b) pool boyutu yetersiz — connection_limit artırın veya PgBouncer ekleyin. PM2 cluster ile çalışıyorsanız worker × connection_limit toplamı PostgreSQL max_connections'tan büyükse PgBouncer kaçınılmaz olur.
Sonuç
Prisma, modern TypeScript-Node.js uygulamalarında schema-first iş akışını ve tip-güvenli sorgu API'sini birleştirir. Doğru kullanıldığında bir hafta içinde geliştirme + migration + deploy zincirinin tamamı oturur; yanlış kullanıldığında db push'la production'a girip schema drift sorunlarıyla uğraşırsınız. Bu yazıdaki üç altın kural: production'da daima migrate deploy, Next.js dev'de Prisma singleton, ve connection pool'u uygulama yükünüze göre ayarlayın.
Buyukweb VDS (₺250/ay başlangıç) Node.js + Prisma + PostgreSQL stack'i için root yetkisi, NVMe SSD ve günlük Veeam yedeklemesi sunar. /e5v4-vds paketinden başlayıp PM2 ile self-host yapmak — bu yazının baştan sona pratiklediği yol.
Teknik destek için: 0850 302 60 70 veya iletişim sayfamız.
İlgili Büyükweb Hizmetleri
Node.js + Prisma stack'ini Türkiye lokasyonlu sunucularda çalıştırmak için:
- VDS Sunucu — root yetkili, Node.js LTS + Prisma kurulumu serbest
- E5 v4 VDS — NVMe SSD, PostgreSQL/MariaDB için yüksek IOPS
- cPanel Web Hosting — PHP/MariaDB klasik stack için
- WordPress Hosting — Prisma değil ama PHP-WordPress ihtiyaçları için
- Fiziksel Dedicated — Yüksek ölçek, tam kontrol
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Veritabanı Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

