رفتن به محتوا
cloudhostمستندات
راهنما

دیتابیس

دیتابیس SQL بدون سرور: با اولین اتصال بیدار می‌شود و وقتی کاری ندارد می‌خوابد. با هر کلاینت SQL وصل شوید، از هر لحظهٔ تاریخچه شاخه بگیرید و به هر لحظه برگردید.

ایجاد و اتصال#

cloudhost db create shop
# created database shop (branch main)
#   host      shop.database.trustpage.ir:5432
#   database  shop
#   user      app
#   password  …   (shown once)
#   url       postgres://app:…@shop.database.trustpage.ir:5432/shop?sslmode=require

هر کلاینت SQL یا ORM کار می‌کند (psql، Prisma، Drizzle، pg، …). کاربر همیشه app است و رمز فقط یک بار نشان داده می‌شود. cloudhost db password shop رمز جدید ایجاد می‌کند و رمز قبلی در چند ثانیه از کار می‌افتد.

اتصال‌ها رمزنگاری می‌شوند (sslmode=require).

هر دیتابیس تعداد مشخصی اتصال هم‌زمان می‌پذیرد (max_connections، پیش‌فرض ۲۰؛ ۴ تا برای env.DB نگه داشته می‌شود). اتصال بیشتر از این رد نمی‌شود: در صف می‌ماند و به محض بسته شدن یک اتصال دیگر وارد می‌شود، و فقط اگر تا ۶۰ ثانیه جا باز نشود خطای 53300 too many clients می‌گیرد. اتصال‌های بیکار را در pool برنامه‌تان کم نگه دارید تا جای دیگران را نگیرند.

برای اتصال‌های کوتاه و زیاد (فانکشن‌ها، کلاینت‌های بدون سرور) از درگاه اشتراکی 6432 استفاده کنید: همان رشتهٔ اتصال با :6432 به جای :5432 (pooled_connection_string در پاسخ ایجاد و رمز جدید). در این درگاه هر تراکنش روی یکی از اتصال‌های مشترک دیتابیس اجرا می‌شود، پس هزاران کلاینت با چند اتصال کار می‌کنند و دستورهای آماده (prepared statements) هم کار می‌کنند. تنظیم‌های نشست (SET بیرون از تراکنش)، LISTEN و قفل‌های advisory نشست را مستقیم روی 5432 بزنید؛ کلاینتی که آن‌ها را روی 6432 بفرستد تا پایان اتصال یک اتصال اختصاصی می‌گیرد.

env.DB در فانکشن‌ها#

type Env = {
  DB: {
    query(sql: string, params?: unknown[]): Promise<{ rows: Record<string, unknown>[]; rowCount: number }>;
    transaction(queries: { query: string; params?: unknown[] }[]): Promise<unknown[]>;
  };
};

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const name = new URL(request.url).searchParams.get("name");
    if (name) await env.DB.query("insert into guestbook (name) values ($1)", [name]);
    const { rows } = await env.DB.query("select name, at from guestbook order by id desc limit 5");
    return Response.json(rows);
  },
};

فانکشن دیتابیس را با env.DB می‌خواند؛ نه رمزی در کد هست و نه اتصالی که باید باز و بسته کنید. query(sql, params) یک دستور اجرا می‌کند و transaction([...]) چند دستور را با هم. فقط دیتابیس‌های تیم خودتان قابل اتصال‌اند.

شاخه‌ها#

cloudhost db branch shop dev                                  # from main, now
cloudhost db branch shop yesterday --at 2026-11-03T09:30:00+03:30
cloudhost db branch shop fix --from dev
cloudhost db branches shop
cloudhost db branch delete shop dev

شاخه یک کپی copy-on-write از دیتابیس در یک لحظه است: فوری ایجاد می‌شود و تا وقتی در آن ننویسید فضای اضافه نمی‌گیرد. به شاخه با همان آدرس و رمز وصل شوید و نام دیتابیس را <branch>--<db> بگذارید. نقطهٔ شروع: آخرین وضعیت (پیش‌فرض)، یک زمان با منطقهٔ زمانی (--at) یا یک موقعیت WAL (--lsn).

  • تا ۵۰ شاخه و پیش‌نمایش برای هر دیتابیس (پشتیبان‌ها جدا).
  • هر پیش‌نمایش برنامه یا فانکشنی که به دیتابیس متصل است شاخهٔ خودش را دارد: preview-<branch>. با حذف پیش‌نمایش، آن شاخه هم حذف می‌شود.
  • شاخهٔ main و شاخه‌ای که شاخهٔ دیگری از آن شروع شده پاک نمی‌شوند.

بازگردانی به یک لحظه#

بازگردانی
cloudhost db restore shop main --at 2026-11-04T09:30:00+03:30
# restored main to 0/1FA2728 (as of 2026-11-04T06:00:00.000Z)
# its state before the restore is kept as branch main-before-20261104t093512z

بازگردانی شاخه را به وضعیتش در یک زمان (یا موقعیت WAL) برمی‌گرداند. نام و آدرس شاخه همان می‌ماند، و وضعیت پیش از بازگردانی به شکل شاخهٔ پشتیبان <branch>-before-<time> نگه داشته می‌شود؛ برای برگشتن، دوباره از پشتیبان بازگردانی کنید یا از آن شاخه بگیرید. تا ۲۰ پشتیبان برای هر دیتابیس.

تا کجای گذشته می‌توان رفت به پلن بستگی دارد؛ قیمت‌ها را ببینید. پشتیبان‌هایی که از این بازه قدیمی‌تر شوند حذف می‌شوند، مگر شاخه‌ای از آن‌ها شروع شده باشد.

بازگردانی، حذف شاخه، حذف دیتابیس و رمز جدید کارهای حساس‌اند: از داشبورد یک عامل دوم می‌خواهند. کلید API نیازی به آن ندارد.

مانیتورینگ#

مصرف پردازش، اندازه، اتصال‌ها، نرخ برخورد کش، تراکنش‌ها و پرهزینه‌ترین دستورها، در داشبورد، با ابزار MCP get_resource_observability، یا از API. وقتی دیتابیس خواب است نقطه‌ای ثبت نمی‌شود.

API
curl -H "Authorization: Bearer $KEY" "https://api.ibel.ai/v1/db/projects/shop/observability?range=24h"

حذف#

cloudhost db delete shop دیتابیس را با همهٔ شاخه‌ها و تاریخچه‌اش حذف می‌کند. تا وقتی نسخهٔ زنده‌ای (پروداکشن یا پیش‌نمایش) به آن متصل است حذف انجام نمی‌شود.