تخطَّ إلى المحتوى
NerdLevelTech

انشر أول تطبيق Prisma لك إلى الإنتاج — Composer وPostgres وCompute في ٢٠ دقيقة

الأساس الإنتاجي لأي تطبيق Prisma: أنشئ API بـ TypeScript مع Prisma ORM 8، ونمذج البيانات بـ contract، وشغّله محلياً على Prisma Postgres، وانشره على Prisma Compute بأمر واحد. بلا واجهة وبلا ميزات منتج — تنتهي بـ API حي وبسير العمل نفسه لتبني عليه. كل خطوة مُختبَرة على خطة Free.

Nerd Level Techحُدّث في تطوير الواجهة الخلفيةEnglish

Prisma هي stack TypeScript كاملة: تُصرّح عن تطبيقك (services وقواعد البيانات والاتصالات) في TypeScript، وتنمذج بياناتك مع Prisma ORM، وتنشر كل شيء على Prisma Compute بأمر واحد. تتضمن خطة Free 200,000 عملية قاعدة بيانات و2GB تخزين و٥٠ قاعدة بيانات و1M طلب compute و360 GB-hours ذاكرة — بدون بطاقة ائتمان، بدون حد زمني، بدون فوترة استخدام.

في هذا الدليل، ستنشئ API بـ TypeScript على Prisma Postgres، وتفهم Composer declaration، وتنمذج البيانات مع Prisma ORM، وتشغّله محلياً مع بيانات seeded، وتختبر API، وتنشره على Prisma Compute.

ما الذي ستبنيه: Hono API بمسارين (/ و/users) على قاعدة بيانات Prisma Postgres، يعمل محلياً ومُنشر على Prisma Compute.

الوقت: ~٢٠ دقيقة | التكلفة: مجاني (بدون بطاقة ائتمان)

النطاق — ما هذا الدليل وما ليس هو

هذا هو الأساس الإنتاجي، وليس منتجاً مكتملاً. لا واجهة، ولا مصادقة، ولا CRUD يتجاوز قراءة المستخدمين الثلاثة seeded. وهذا مقصود: الهدف إزالة كل مجهول بين مجلد فارغ وAPI حي type-safe — Bun، والـ emulators المحلية، والـ contracts، والـ migrations، ومصادقة CLI، وسير النشر.

بعد إتمام هذه الخطوات، يصبح بناء نماذجك وmutations وواجهة أمامية فوقه عملاً تطبيقياً عادياً بلا عوائق إعداد. إن أردت تطبيقاً مكتمل الميزات، فاعتبر هذا الخطوة صفر.


كيف تُشغّل الأوامر في هذا الدليل

  • كل أمر يُشغَّل في terminal، من جذر المشروع (my-app/) إلا إذا ذكرت الخطوة غير ذلك.
  • $ ترمز لـ shell prompt — اكتب ما بعدها فقط.
  • الـ scaffold ثبّت الاعتماديات بالفعل، لذا لا حاجة إلى npm install.
  • الخطوتان ٤ و٥ تحتاجان terminalين: الأول يشغّل dev server ويبقى مشغولاً، والثاني يشغّل curl.
  • macOS وLinux يستخدمان bash/zsh. على Windows تعمل أوامر CLI في PowerShell، لكن prisma dev (التطوير المحلي) لا يدعم Windows بعد.

المتطلبات المسبقة

  • Node.js 22.18+ أو ٢٤٫١١+ أو ٢٦+ (٢٤ موصى به) — node --version
  • npm (يأتي مع Node.js)
  • Bun — مطلوب للتطوير المحلي (curl -fsSL https://bun.sh/install | bash)
  • حساب Prisma — مجاني للإنشاء at console.prisma.io، بدون بطاقة ائتمان لخطة Free

تحقق من إعدادك:

bash
node --version   # v22.18+ أو v24.11+ أو v26+
npm --version    # 10+
bun --version    # 1.x

الخطوة ١ — Scaffold التطبيق

شغّل هذا في الدليل الذي تريد أن يُنشأ فيه مجلد المشروع (مثلاً مجلد ~/Code). ينشئ my-app/، ويثبّت كل الاعتماديات بـ npm، ويُنشئ baseline migration، ويهيّئ مستودع Git — يستغرق دقيقتين ويحتاج اتصالاً بالشبكة.

bash
npx --yes create-prisma@latest my-app --template hono --provider postgres --no-deploy --package-manager npm --authoring psl --skills none --yes
cd my-app

أُعيد اختبار هذا الدليل بـ create-prisma 0.14.6 وPrisma CLI 8.0.0-rc.28. قد يتغيّر @latest؛ الأوامر أدناه تعكس هذا الإصدار.

الflags:

  • --template hono — يستخدم Hono كـ web framework (خادم API صغير وسريع)
  • --provider postgres — قاعدة بيانات Prisma Postgres
  • --no-deploy — scaffold فقط، لا نشر بعد
  • --authoring psl — Prisma Schema Language لـ data modeling
  • --skills none — تخطي agent skill files
  • --yes — قبول defaults، بدون prompts

ما يتم إنشاؤه:

my-app/
├── module.ts                 # App declaration (Composer)
├── service.ts                # Service declaration
├── prisma.config.ts          # Prisma config (ORM + Composer + deploy)
├── tsdown.config.ts          # Build config (bundles src/index.ts → dist/server.mjs)
├── migrations/
│   ├── app/<timestamp>_init/ # migration.json, migration.ts, ops.json
│   └── snapshots/            # contract.json and contract.d.ts per snapshot
└── src/
    ├── index.ts              # Hono server with / and /users routes
    └── prisma/
        ├── contract.prisma   # Data model (User + Post)
        ├── contract.json     # Emitted contract (generated)
        ├── contract.d.ts     # Contract types (generated)
        ├── composer.ts       # Typed data contract for Composer
        ├── db.ts             # Prisma Postgres client from the contract
        ├── users.ts          # listUsers() query helper
        └── seed.ts           # Seeds alice, bob, carol on first query

In this walkthrough the baseline folder is migrations/app/20261030T1854_init/; the timestamp is generated when you scaffold, so use your own _init folder later.

Prisma scaffold output — project created with all files


الخطوة ٢ — فهم Composer Declaration

التطبيق مُصرّح في ملفين. ابدأ بـ declaration — إنها ما يعمل عليه كل أمر لاحق.

module.ts — التطبيق

typescript
import { module } from "@prisma/composer";
import { postgres } from "@prisma/composer-prisma-cloud/orm";

import { appContract } from "./src/prisma/composer.ts";
import app from "./service.ts";

export default module("my-app", ({ provision }) => {
  const database = provision(
    postgres({
      name: "database",
      contract: appContract,
      config: "./prisma.config.ts",
    }),
    { id: "database" },
  );

  provision(app, { deps: { database } });
});

module.ts in VS Code — the app declaration

هذا يُصرّح عن:

  • قاعدة بيانات Prisma Postgres named "database"
  • service (تطبيق Hono) يعتمد على قاعدة البيانات
  • قاعدة البيانات typed بـ contract الخاص بك (schema)

service.ts — الخدمة

typescript
import node from "@prisma/composer/node";
import { compute } from "@prisma/composer-prisma-cloud";
import { postgres } from "@prisma/composer-prisma-cloud/orm";

import { appContract } from "./src/prisma/composer.ts";

export default compute({
  name: "app",
  deps: {
    database: postgres(appContract),
  },
  build: node({ module: import.meta.url, entry: "./dist/server.mjs" }),
});

service.ts in VS Code — the service declaration

هذا يُصرّح عن:

  • compute service named "app"
  • اعتماده على قاعدة البيانات (typed by contract)
  • كيفية بنائه (Node.js، entry point dist/server.mjs)

prisma.config.ts — Prisma config

typescript
import { definePrismaConfig } from "prisma/config";
import { defineConfig as ormConfig } from "@prisma/orm-postgres/config";
import { defineConfig as composer } from "@prisma/composer/config";
import { nodeBuild } from "@prisma/composer/node/control";
import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control";

export default definePrismaConfig({
  skills: {
    agents: [],
  },
  orm: ormConfig({
    contract: "./src/prisma/contract.prisma",
    db: {
      connection: process.env.DATABASE_URL!,
    },
  }),
  composer: composer({
    entry: "./module.ts",
    extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild()],
    state: prismaState(),
  }),
});

prisma.config.ts in VS Code — ORM, Composer, and deploy config

نقاط رئيسية:

  • orm.contract — يشير إلى ملف Prisma schema الخاص بك
  • orm.db.connection — DATABASE_URL (يُستخدم فقط بـ ORM commands مثل db:*، وليس بـ prisma dev أو prisma deploy)
  • composer.entry — يشير إلى module.ts؛ يقرأ prisma dev وprisma deploy الـ entry من هنا
  • composer.extensions — يُنشر على Prisma Cloud في region us-east-1
  • composer.state — يحتفظ بـ deploy state

لا connection string في declaration. قاعدة البيانات هي dependency مُصرّح عنها. Composer يحقن الاتصال أينما يعمل التطبيق. Declaration هي TypeScript عادي — npx tsc --noEmit يتحقق من wiring.


الخطوة ٣ — نموذج بيانات Prisma ORM

الجانب data يقع under src/prisma/. schema الخاص بك هو starter contract، ويُصدر الـ scaffold typed client مع query helper seeded.

src/prisma/contract.prisma

prisma
// use prisma-8

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  username  String?
  name      String?
  posts     Post[]
  createdAt TimestamptzString @default(now())
  updatedAt temporal.updatedAtString()
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
  createdAt TimestamptzString @default(now())
  updatedAt temporal.updatedAtString()
}

contract.prisma in VS Code — the starter data model

npm run contract:emit يُجمّع هذا إلى contract.json وcontract.d.ts — الـ artifacts التي تُفحص استعلاماتك مقابلها. شغّله الـ scaffold مرة واحدة؛ وأعد تشغيله من جذر المشروع كلما عدّلت contract.

src/prisma/composer.ts — typed contract لـ Composer

typescript
import { dataContract } from "@prisma/composer-prisma-cloud/orm";

import type { Contract } from "./contract.d.ts";
import contractJson from "./contract.json" with { type: "json" };

export const appContract = dataContract<Contract>(contractJson);

src/prisma/composer.ts in VS Code

src/prisma/db.ts — Prisma Postgres client

typescript
import postgres from "@prisma/orm-postgres/runtime";
import { contractFromJson } from "@prisma/orm-postgres/static";

import "temporal-polyfill/global";

import service from "../../service.ts";
import type { Contract } from "./contract.d.ts";
import contractJson from "./contract.json" with { type: "json" };

export const contract = contractFromJson<Contract>(contractJson);

function loadComposerDatabase() {
  try {
    return service.load().database.client;
  } catch {
    return undefined;
  }
}

export const db =
  loadComposerDatabase() ??
  (process.env.DATABASE_URL
    ? postgres({ contract, url: process.env.DATABASE_URL })
    : postgres({ contract }));

src/prisma/db.ts in VS Code — the Prisma Postgres client

Composer يحقن اتصال قاعدة البيانات at runtime. التشغيل المستقل يستخدم DATABASE_URL عند تعيينه.

src/prisma/seed.ts — seeds sample users مرة واحدة

typescript
import { db } from "./db.ts";

const users = [
  { email: "alice@prisma.io", username: "alice", name: "Alice" },
  { email: "bob@prisma.io", username: "bob", name: "Bob" },
  { email: "carol@prisma.io", username: "carol", name: "Carol" },
];

let pendingSeed: Promise<void> | undefined;

async function runSeed(): Promise<void> {
  for (const user of users) {
    await db.orm.public.User.upsert({
      create: user,
      update: {},
      conflictOn: { email: user.email },
    });
  }
}

export function seed(): Promise<void> {
  pendingSeed ??= runSeed().catch((error: unknown) => {
    pendingSeed = undefined;
    throw error;
  });
  return pendingSeed;
}

src/prisma/seed.ts in VS Code — the three sample users

src/prisma/users.ts — الـ typed query

typescript
import { db } from "./db.ts";
import { seed } from "./seed.ts";

export { db };

export async function listUsers(limit = 10) {
  await seed();
  const users = await db.orm.public.User.select("id", "email", "username", "name", "createdAt").limit(limit).all();

  return users.map((user) => ({
    id: String(user.id),
    email: user.email,
    username: user.username ?? null,
    name: user.name ?? null,
    createdAt: user.createdAt,
  }));
}

export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];

src/prisma/users.ts in VS Code — the typed query

لاحظ Prisma ORM 8 API: db.orm.public.User.select(...).limit(...).all() يُرجع typed rows مباشرة — بدون PrismaClient import.

src/index.ts — Hono server

typescript
import { serve } from "@hono/node-server";
import { Hono } from "hono";

import { listUsers } from "./prisma/users";

const app = new Hono();

app.get("/", (c) => {
  return c.json({
    message: "hello from create-prisma + hono",
  });
});

app.get("/users", async (c) => {
  const users = await listUsers(10).catch((error: unknown) => {
    console.error("Failed to query users:", error);
    return undefined;
  });

  if (!users) {
    return c.json({ error: "Could not query users. Check the server log for the error." }, 500);
  }

  return c.json(users);
});

const rawPort = (process.env.PORT ?? "").trim();
const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
const port =
  Number.isInteger(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 3000;
serve({
  fetch: app.fetch,
  port,
});

console.log(`Server running at http://localhost:${port}`);

src/index.ts in VS Code — the Hono server

غيّر contract عندما تكون جاهزاً لـ model your own data، شغّل npm run contract:emit، وسيُرشدك compiler عبر كل query يحتاج إلى تحديث.


الخطوة ٤ — التشغيل محلياً على Prisma Postgres

افتح terminal في جذر المشروع (my-app/، المجلد الذي يحتوي module.ts). تحقق من مكانك:

bash
pwd          # .../my-app
ls module.ts # module.ts

ثم ابنِ التطبيق وشغّل المنصة المحلية. السكربتان يفعلان شيئين مختلفين:

bash
npm run build        # يحزم src/index.ts → dist/server.mjs
npm run composer:dev # يشغّل `prisma dev`

npm run dev:composer يشغّل الاثنين معاً إن أردت.

ما يحدث في أول تشغيل:

  1. يبدأ Prisma قاعدة Postgres محلية وcompute emulator محلياً على جهازك.
  2. database-migrate يطبّق baseline migration الموجودة في migrations/app/<timestamp>_init/.
  3. يُبنى service ويُشغّل، ويُطبع عنوانه.

prisma dev يعمل في الواجهة (foreground) ويراقب التغييرات — اترك ذلك الـ terminal مفتوحاً. أوقفه بـ Ctrl+C، أو بـ npx prisma dev stop من terminal آخر.

متطلب: prisma dev يشغّل service باستخدام Bun، لذا يجب أن يكون bun على PATH. إن لم يكن موجوداً يفشل الأمر بـ:

local dev runs services under bun — the Prisma Compute runtime — and `bun` was not found on PATH. Install it: https://bun.sh

ثبّته بـ curl -fsSL https://bun.sh/install | bash، ثم افتح terminal جديداً ليُعاد تحميل PATH.

الشاشة الأخيرة من التشغيل الأول (الخطة تطبع كل مورد أثناء إنشائه؛ التشغيلات اللاحقة تطبع Plan · no changes):

Plan · 9 created

✔ my-app.app (Prisma.App) created (493ms)
✔ my-app.app.deployment (Prisma.Deployment) created (336ms)
✔ my-app.app.env.COMPOSER_MY_APP_APP_DATABASE_URL (Prisma.EnvironmentVariable) created (339ms)
✔ my-app.app.env.COMPOSER_MY_APP_APP_ORIGIN (Prisma.EnvironmentVariable) created (483ms)
✔ my-app.app.env.COMPOSER_MY_APP_APP_PORT (Prisma.EnvironmentVariable) created (496ms)
✔ my-app.database (Prisma.Database) created (499ms)
✔ my-app.database.connection (Prisma.Connection) created (487ms)
✔ my-app.database.migration (PrismaOrm.Migration) created (467ms)
✔ my-app.database.warmup (PrismaCloud.PgWarm) created (479ms)

stack deployed (9/9)

dev: ready
my-app.app: http://localhost:3009

استخدم العنوان الظاهر في سطر my-app.app: — لا تفترض الـ port. يمكنك أيضاً سؤاله بينما dev يعمل:

bash
npx prisma dev url my-app.app
# http://localhost:3009

Sample users are seeded automatically the first time the app queries the database. البيانات المحلية تبقى بعد إعادة التشغيل؛ شغّل npx prisma dev --fresh لمسحها والبدء نظيفاً.

Prisma local dev — build output and dev server ready on the printed local URL


الخطوة ٥ — اختبار API

اترك dev server يعمل وافتح terminal ثانياً في نفس جذر المشروع. الـ terminal الأول مشغول بـ prisma dev.

bash
APP_URL="$(npx prisma dev url my-app.app | tail -1)"
curl "$APP_URL/users"

هذا التشغيل طبع http://localhost:3009؛ قد يختلف port عندك.

الاستجابة من نفس التشغيل:

json
[
    {
        "id": "1",
        "email": "alice@prisma.io",
        "username": "alice",
        "name": "Alice",
        "createdAt": "2026-10-28 11:07:04.591+00"
    },
    {
        "id": "2",
        "email": "bob@prisma.io",
        "username": "bob",
        "name": "Bob",
        "createdAt": "2026-10-28 11:07:04.595+00"
    },
    {
        "id": "3",
        "email": "carol@prisma.io",
        "username": "carol",
        "name": "Carol",
        "createdAt": "2026-10-28 11:07:04.596+00"
    }
]

Prisma API response — seeded users returned from the /users endpoint

المسار الجذري فحص سريع:

bash
curl "$APP_URL/"
# {"message":"hello from create-prisma + hono"}

من أين يأتي المستخدمون الثلاثة

هم ليسوا حسابات، ومسار /users لا يُنشئهم. الـ scaffold يعرّفهم في src/prisma/seed.ts:

typescript
import { db } from "./db.ts";

const users = [
  { email: "alice@prisma.io", username: "alice", name: "Alice" },
  { email: "bob@prisma.io", username: "bob", name: "Bob" },
  { email: "carol@prisma.io", username: "carol", name: "Carol" },
];

let pendingSeed: Promise<void> | undefined;

async function runSeed(): Promise<void> {
  for (const user of users) {
    await db.orm.public.User.upsert({
      create: user,
      update: {},
      conflictOn: { email: user.email },
    });
  }
}

export function seed(): Promise<void> {
  pendingSeed ??= runSeed().catch((error: unknown) => {
    pendingSeed = undefined;
    throw error;
  });
  return pendingSeed;
}

وsrc/prisma/users.ts يستدعي seed() قبل أول استعلام:

typescript
import { db } from "./db.ts";
import { seed } from "./seed.ts";

export { db };

export async function listUsers(limit = 10) {
  await seed();
  const users = await db.orm.public.User.select("id", "email", "username", "name", "createdAt").limit(limit).all();

  return users.map((user) => ({
    id: String(user.id),
    email: user.email,
    username: user.username ?? null,
    name: user.name ?? null,
    createdAt: user.createdAt,
  }));
}

export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];

seed() يعمل upsert لكل صف حسب البريد مرة واحدة في العملية، لذا ضرب /users مرتين لا يُنشئ تكراراً. غيّر المصفوفة لتزرع بياناتك، أو أزل الاستدعاء إن لم ترد صفوفاً تجريبية.

البيانات type-safe end to end. غيّر User model في contract.prisma، شغّل npm run contract:emit، وسيُعلّم TypeScript كل query يحتاج إلى تحديث.


الخطوة ٦ — النشر على Prisma Compute

كل هذه الخطوة تستخدم Prisma CLI الذي ثبّته الـ scaffold كـ dev dependency — بدون نقر في لوحة التحكم. شغّل الأوامر من جذر المشروع.

٦٫١ تسجيل دخول CLI

bash
npx prisma auth login

يطبع الأمر verification URL ويفتح متصفحك. وافق، فيحفظ CLI جلسة لتلك workspace. تحقق:

bash
npx prisma auth whoami

يجب أن ترى status: signed in والـ workspace الذي سينشر إليه CLI.

لـ CI أو أي بيئة headless، تخطَّ تدفق المتصفح واستخدم service token من الـ console (Console → Settings → Service Tokens → New Service Token):

Prisma Console service tokens — create a token for headless deploys and third-party platforms

bash
export PRISMA_SERVICE_TOKEN="your-service-token"
export PRISMA_WORKSPACE_ID="your-workspace-id"

مع هذين المتغيرين يُبلغ prisma auth whoami عن environment variable: PRISMA_SERVICE_TOKEN. عند وجود token وجلسة محفوظة معاً، يفوز الـ token.

٦٫٢ النشر

bash
npm run deploy

هذا السكربت يشغّل أمرين:

bash
npm run build            # tsdown → dist/server.mjs
npx prisma deploy

prisma deploy لا يبني لك — بل يجمع ما أنتجه build، لذا يجب تشغيل build أولاً (npm run deploy يرتب ذلك).

أول نشر يُنشئ Prisma project (باسم الـ module، my-app) وproduction branch وقاعدة Postgres والservice. المنطقة تأتي من prismaCloud({ region: "us-east-1" }) في prisma.config.ts، فاضبطها قبل أول نشر إن احتجت منطقة أخرى. النشرات اللاحقة تُطبّق الفرق بدلاً من إعادة إنشاء كل شيء.

ناتج نشر my-app في هذا الدليل:

my-app
├─ database   postgres-database db_deb2i8b2avdhig1qny91ms8e
└─ app        compute-service cps_gxooak0zynndovlamqkaq5w7
              https://gxooak0zynndovlamqkaq5w7.ewr.prisma.build

Plan · 9 created · 1 ran

✔ app-deploy (Prisma.Deployment) created (6.6s)
✔ app-svc (Prisma.App) created (23.8s)
✔ COMPOSER_APP_DATABASE_URL-var (Prisma.EnvironmentVariable) created (8.2s)
✔ COMPOSER_APP_ORIGIN-var (Prisma.EnvironmentVariable) created (22.1s)
✔ COMPOSER_APP_PORT-var (Prisma.EnvironmentVariable) created (23.8s)
✔ database-conn (Prisma.Connection) created (21.2s)
✔ database-db (Prisma.Database) created (23.9s)
✔ database-migrate (PrismaOrm.Migration) created (15.6s)
✔ database-warm (PrismaCloud.PgWarm) created (17.0s)
✔ composer-deployment-report ran [action] (804ms)

stack deployed (10/10)

✔ plan and apply (36.0s)
▸ record result
✔ record result (7.3s)
app: https://gxooak0zynndovlamqkaq5w7.ewr.prisma.build
✔ Deployed my-app to production in 46.9s.

Address   Deployed
database  postgres-database db_deb2i8b2avdhig1qny91ms8e
app       compute-service cps_gxooak0zynndovlamqkaq5w7

انسخ app URL من ناتجك — الـ hostname فريد لنشرك.

النص أعلاه من النشر الأصلي لهذا الدليل. إصدارات CLI الحالية تسمّي الموارد my-app.app / my-app.database وتضيف اسم التطبيق إلى متغيرات البيئة (COMPOSER_MY_APP_APP_*)، كما يظهر ناتج التطوير المحلي. الأمر وشكل النشر لم يتغيرا: npx prisma deploy.

Prisma deploy — real CLI output; the database, service, and app URL are example identifiers

٦٫٣ ربط المجلد ثم التحقق

النشر لا يربط المجلد، لذا أوامر المشروع مثل prisma service لا تجد المشروع بعد. اربطه مرة واحدة:

bash
npx prisma project link my-app

يكتب هذا .prisma/local.json داخل المشروع (أبعده عن version control إن كنت تلتزم التطبيق). الآن تحقق من النشر وافحص service:

bash
curl https://<your-app-url>/users
npx prisma service list
npx prisma service logs app

في هذا الدليل التطبيق المنشور هو https://gxooak0zynndovlamqkaq5w7.ewr.prisma.build; نشرك يحصل على hostname فريد، لذا استخدم العنوان من ناتجك.

prisma service list يطبع اسم service وid والمنطقة والعنوان المباشر. prisma service logs app يعرض سجل التشغيل — في نشر سليم ينتهي بسطر إقلاع الخادم.

الاستجابة من التطبيق المنشور:

json
[
    {
        "id": "1",
        "email": "alice@prisma.io",
        "username": "alice",
        "name": "Alice",
        "createdAt": "2026-10-28 11:12:05.387121+00"
    },
    {
        "id": "2",
        "email": "bob@prisma.io",
        "username": "bob",
        "name": "Bob",
        "createdAt": "2026-10-28 11:12:05.394182+00"
    },
    {
        "id": "3",
        "email": "carol@prisma.io",
        "username": "carol",
        "name": "Carol",
        "createdAt": "2026-10-28 11:12:05.396076+00"
    }
]

٦٫٤ نشر stage معزول (اختياري)

الـ stages نسخ كاملة من التطبيق بخدمات وقواعد بيانات خاصة بها — مفيدة لبيئة staging دائمة أو واحدة لكل pull request:

bash
npx prisma deploy --stage staging

النشر بدون --stage يستهدف production. للنشر باسم تطبيق مختلف مرّر --name.

صفحة مشروع Prisma Console — مشروع my-app بعد النشر في هذا الدليل


ما التالي

  • إضافة more models — عدّل contract.prisma، شغّل npm run contract:emit، حدّث queries

  • إضافة migrations — بعد تغيير contract.prisma، شغّل:

    bash
    npx prisma contract emit
    npx prisma migration plan --name <change> --from <timestamp>_init
    npm run build
    npx prisma deploy
    

    <change> هو الاسم الذي تختاره. <timestamp>_init هو مجلد baseline تحت migrations/app/ — في هذا الدليل هو 20261030T1854_init؛ سيتغيّر عندك. بدون --from تحاول الخطة إعادة إنشاء كل الجداول. راجع الشرح الكامل.

  • تحقق من usage — npx prisma postgres usage <database> أو تتبعه في Prisma Console. كل استعلام يُحتسب عملية واحدة، قراءة كان أو كتابة.

Prisma Console usage — 93 طلباً و475 عملية قاعدة بيانات مقابل حد 200,000 شهرياً في خطة Free

هذا الرسم من نفس الـ workspace بعد هذا الدليل ودليل الوكيل: ٩٣ طلباً، و٤٧٥ عملية، و٠٫٠٠٥٣٩ GiB-hours ذاكرة provisioned، وفاتورة $0.00. خط الـ ٢٠٠٬٠٠٠ عملية هو الحد الشهري؛ أما التخزين فمنفصل ولا يُعاد ضبطه شهرياً. العمليات تُحتسب لكل استعلام، لذا مسار API ينفّذ ثلاثة استعلامات يكلّف ثلاث عمليات.

  • الإدارة من الـ console — console.prisma.io يعرض كل project وbranch وقاعدة بيانات ونشر

Prisma Console dashboard — workspace usage, projects, and invoices

  • الترقية إلى خطة paid — إذا وصلت إلى حدود Free plan، انقل workspace الخاص بك إلى خطة paid
  • استكشاف other templates — next، svelte، nuxt، tanstack-start، والمزيد. تطبيقات SvelteKit وDeno لا تُنشر على Prisma Compute بعد. ويحتاج Nuxt إلى Node 22.22.3+ على خط ٢٢، أو ٢٤٫١٥+ على خط ٢٤، أو ٢٦+.
  • قراءة docs — prisma.io/docs للمرجع الكامل

استكشاف الأخطاء

bun not found: التطوير المحلي يتطلب Bun. ثبّته بـ curl -fsSL https://bun.sh/install | bash وأعد تشغيل terminal ليُحمَّل PATH.

prisma dev على Windows: التطوير المحلي غير مدعوم على Windows بعد. استخدم macOS أو Linux (أو WSL) للخطوتين ٤–٥؛ خطوات النشر تعمل في أي مكان.

Build fails: شغّل npx tsc --noEmit للتحقق من أخطاء TypeScript. Declaration هي TypeScript عادي — الأخطاء fail the compile.

Deploy fails بخطأ auth: لا توجد جلسة لـ CLI. شغّل npx prisma auth login (أو عيّن PRISMA_SERVICE_TOKEN وPRISMA_WORKSPACE_ID). تحقق بـ npx prisma auth whoami.

PROJECT.SETUP_REQUIRED عند تشغيل prisma service ...: المجلد غير مربوط بمشروع. شغّل npx prisma project link <name>، أو مرّر --project <id-or-name>.

Deploy يتوقف بـ HostedStateBootstrapError: يوجد مشروع بنفس الاسم لكن حالته المستضافة أُنشئت خارج نشرات هذا module. انشر باسم مختلف عبر --name، أو أعد تسمية module.

Database not seeding: Sample users are seeded automatically on first query. إذا لم يظهر، تحقق من migration logs in the dev output.

الـ scaffold ينتظر عند “Ok to proceed? (y)”: الأمر npx يطلب إذن تثبيت حزمة create-prisma. الأمر في الخطوة ١ يستخدم npx --yes لقبوله. إذا شغّلته بدون --yes، اكتب y، أو أعد تشغيل الأمر مع --yes بعد npx.

Port already in use: prisma dev يعيّن port حراً تلقائياً ويطبعه في سطر my-app.app:. إذا لم يستجب URL المطبوع، تحقق مما يستمع على ذلك المنفذ: lsof -i :<port> (استخدم الـ port من العنوان المطبوع).

الأسئلة الشائعة

هل Prisma مجاني للاستخدام؟

نعم. خطة Free هي $0 شهرياً بدون بطاقة ائتمان، وبلا حد زمني، وبلا فوترة استخدام. حدودها تنطبق على الـ workspace كله: ٢٠٠٬٠٠٠ عملية قاعدة بيانات شهرياً، و٢ GB تخزين، و٥٠ قاعدة بيانات، ونقل بيانات غير محدود، و١٠ اتصالات pooled و10 direct (خمسة من direct محجوزة لعمليات المنصة)، وبلا نسخ احتياطي آلي. ويضيف Prisma Compute مليون طلب و٣٦٠ GB-hours ذاكرة provisioned و4 vCPU-hours و10 GB نطاق ترددي صادر شهرياً. المصدر: https://www.prisma.io/docs/full-stack-tutorial وhttps://www.prisma.io/pricing.

هل أحتاج Prisma ORM لاستخدام Prisma Postgres؟

لا. Prisma ORM اختياري على المنتجين: Prisma Postgres يعمل مع أي عميل PostgreSQL، وPrisma Compute يشغّل تطبيقات لا تستخدم Prisma ORM. هذا الدليل يستخدم Prisma ORM لأنه يُنمّط الاستعلامات، لكن pg أو Drizzle أو أي عميل آخر سيعمل أيضاً. المصدر: https://www.prisma.io/docs/full-stack-tutorial.

ما هو Prisma Composer؟

Prisma Composer هو إطار TypeScript لتطبيقات مكوّنة من عدة خدمات. تُصرّح عن الخدمات واعتمادياتها كقيم TypeScript عادية، ثم تشغّل أوامر dev وdeploy في Prisma CLI ما صرّحت عنه وتُوفّره على Prisma Compute وPrisma Postgres. الـ declaration بيانات: يفحص المترجم الربط، ويوفّرها النشر، ويحقن الـ runtime الاعتماديات. المصدر: https://www.prisma.io/docs/composer/core-concepts.

ما هو Prisma contract؟

الـ contract هو الوصف الواحد لنموذج بياناتك وكيفية تخزينه — ملف contract.prisma الذي حلّ محل schema.prisma في Prisma ORM 8. تُفحص استعلاماتك مقابله، وتُخطَّط الـ migrations كتغييرات عليه، ويتحقق prisma db verify من قاعدة بيانات حية مقابله. الـ contract هو ما تكتبه؛ أما schema فهي البنية الفعلية لقاعدة بياناتك. الأمر npx prisma contract emit يكتب contract.json وcontract.d.ts. المصدر: https://www.prisma.io/docs/orm/contract-authoring/the-data-contract.

كيف يعمل التطوير المحلي؟

شغّل npm run composer:dev (أي prisma dev) من جذر المشروع. التطوير المحلي يشغّل تطبيقك على Bun، ويبدأ قاعدة Prisma Postgres محلية، ويطبّق الـ migrations التي التزمت بها، ويطبع عنوان التطبيق. لا حساب ولا credentials ولا connection string. يجب أن يكون Bun على PATH. المصدر: https://www.prisma.io/docs/local-development.

كيف أنشر في الإنتاج؟

شغّل npm run deploy، الذي يبني التطبيق ثم يشغّل prisma deploy. النشر يستخدم جلسة prisma auth login؛ وفي CI عيّن PRISMA_SERVICE_TOKEN وPRISMA_WORKSPACE_ID بدلاً منها. أول نشر يُنشئ المشروع ويحتاج منطقة، تُعيَّن بـ prismaCloud({ region }) في prisma.config.ts أو بمتغير PRISMA_REGION؛ والمشروع الموجود يحتفظ بمنطقته. الأمر prisma deploy نفسه لا يبني — شغّل البناء أولاً. المصدر: https://www.prisma.io/docs/cli/deploy.

ماذا يحدث إذا وصلت إلى حد خطة Free؟

لا يُحصَّل شيء. خطة Free بلا فوترة استخدام، لذا الوصول إلى حد لا يضيف رسماً. العمليات وعدادات Compute الأربعة حدود شهرية؛ أما التخزين وعدد قواعد البيانات فغير مرتبطة بشهر. لتجاوز حد، انقل الـ workspace إلى خطة مدفوعة، تُفوتر الاستخدام الزائد عن المبالغ المشمولة ويمكنها تحديد سقف للإنفاق. المصدر: https://www.prisma.io/docs/full-stack-tutorial.

من أين تأتي هذه الإجابات عن المنتج؟

كل ادعاء عن المنتج أعلاه مأخوذ من توثيق Prisma: https://www.prisma.io/docs/full-stack-tutorial (خطة Free واختيارية ORM)، https://www.prisma.io/docs/composer/core-concepts (Composer)، https://www.prisma.io/docs/orm/contract-authoring/the-data-contract (contract)، https://www.prisma.io/docs/local-development (التطوير المحلي على Bun)، وhttps://www.prisma.io/docs/cli/deploy (النشر والمصادقة والمنطقة). السلوك الخاص بهذا التطبيق مأخوذ من الكود في هذا الدليل والتشغيلات المعروضة أعلاه.

المزيد من الأدلّة