SDK جاوااسکریپت / تایپاسکریپت
SDK رسمی ابرکلیک برای جاوااسکریپت و تایپاسکریپت. تمام عملیات پلتفرم از جمله مدیریت اپلیکیشنها، دیتابیسها و دیپلوی را از کد خود انجام دهید.
نصب
npm install @abrclick/sdk
یا با pnpm / yarn:
pnpm add @abrclick/sdk
yarn add @abrclick/sdk
راهاندازی اولیه
برای استفاده از SDK به یک API Key نیاز دارید. از داشبورد به تنظیمات → API Keys بروید و یک کلید جدید بسازید.
import { AbrclickClient } from '@abrclick/sdk';
const client = new AbrclickClient({
apiKey: 'abr_live_xxxxxxxxxxxxxxxxxxxx',
});
API Key خود را هرگز مستقیم در کد قرار ندهید. از متغیر محیطی استفاده کنید:
const client = new AbrclickClient({
apiKey: process.env.ABRCLICK_API_KEY!,
});
اپلیکیشنها
لیست اپلیکیشنها
import { AbrclickClient } from '@abrclick/sdk';
const client = new AbrclickClient({ apiKey: process.env.ABRCLICK_API_KEY! });
async function listApps() {
const apps = await client.apps.list({ projectId: 'proj_abc123' });
for (const app of apps) {
console.log(`${app.name} — ${app.status} — ${app.url}`);
}
}
listApps();
نوع بازگشتی:
interface App {
id: string;
name: string;
slug: string;
runtime: 'node' | 'python' | 'go' | 'php' | 'static' | 'docker';
status: 'running' | 'stopped' | 'building' | 'error' | 'creating';
url: string;
projectId: string;
createdAt: string;
updatedAt: string;
}
ساخت اپلیکیشن جدید
const app = await client.apps.create({
projectId: 'proj_abc123',
name: 'my-api',
runtime: 'node',
port: 3000,
});
console.log(`اپ ساخته شد: ${app.url}`);
پارامترها:
interface CreateAppInput {
projectId: string;
name: string;
runtime: 'node' | 'python' | 'go' | 'php' | 'static' | 'docker';
port?: number; // پیشفرض: 3000
rootDir?: string; // پیشفرض: '/'
}
اطلاعات یک اپلیکیشن
const app = await client.getApp('app_xyz789');
console.log(app.status); // 'running'
console.log(app.url); // 'https://my-api.apps.abrclick.cloud'
شروع، توقف و ریاستارت
await client.startApp('app_xyz789');
await client.stopApp('app_xyz789');
await client.restartApp('app_xyz789');
حذف اپلیکیشن
await client.deleteApp('app_xyz789');
دیپلوی
دیپلوی از سورس کد
import { AbrclickClient } from '@abrclick/sdk';
import path from 'path';
const client = new AbrclickClient({ apiKey: process.env.ABRCLICK_API_KEY! });
async function deploy() {
// گام 1: دریافت URL آپلود
const { uploadUrl, sourceKey } = await client.getSourceUploadUrl('app_xyz789');
// گام 2: آپلود tarball به S3 (با axios یا fetch)
// ... (آپلود کد منبع به uploadUrl)
// گام 3: شروع دیپلوی
const deployment = await client.deployApp('app_xyz789', {
source_type: 'upload',
source_key: sourceKey,
});
console.log(`دیپلوی شروع شد: ${deployment.id}`);
// پیگیری لاگهای live
for await (const line of client.streamBuildLogs('app_xyz789', deployment.id)) {
process.stdout.write(line);
}
console.log(`دیپلوی کامل شد`);
}
deploy();
دیپلوی با ایمیج از پیش ساختهشده
const deployment = await client.deployApp('app_xyz789', {
source_type: 'image',
image_tag: 'harbor.abrclick.ir/my-tenant/my-app:v1.2.3',
});
نوع Deployment:
interface Deployment {
id: string;
appId: string;
status: 'pending' | 'building' | 'deploying' | 'success' | 'failed';
imageTag: string;
createdAt: string;
finishedAt?: string;
}
دیتابیسها
لیست دیتابیسها
const { data: databases } = await client.getDatabases('proj_abc123', 1, 20);
for (const db of databases) {
console.log(`${db.name} (${db.type} ${db.version}) — ${db.status}`);
}
نوع Database:
interface Database {
id: string;
name: string;
type: 'postgresql' | 'redis' | 'mongodb';
version: string;
status: 'provisioning' | 'running' | 'error' | 'deleting';
storageGb: number;
projectId: string;
createdAt: string;
}
ساخت دیتابیس جدید
// PostgreSQL
const pg = await client.createDatabase('proj_abc123', {
name: 'main-db',
type: 'postgres',
version: '16',
storage_gb: 10,
});
// Redis
const redis = await client.createDatabase('proj_abc123', {
name: 'cache',
type: 'redis',
version: '7',
storage_gb: 2,
});
// MongoDB
const mongo = await client.createDatabase('proj_abc123', {
name: 'documents',
type: 'mongo',
version: '7',
storage_gb: 20,
});
console.log(`دیتابیس در حال ساخت: ${pg.id}`);
پارامترها:
interface CreateDatabaseInput {
name: string;
type: 'postgres' | 'redis' | 'mongo' | 'mysql' | 'mariadb' | 'valkey' | 'memcached' | 'rabbitmq' | 'kafka';
version: string;
storage_gb: number;
cpu_limit?: string;
memory_limit?: string;
replica_set?: boolean;
}
اطلاعات یک دیتابیس
const db = await client.getDatabase('db_abc456');
console.log(db.status); // 'running'
console.log(db.storage_gb); // 10
دریافت اطلاعات اتصال
const credentials = await client.getDatabaseCredentials('db_abc456');
console.log(credentials.host);
console.log(credentials.port);
console.log(credentials.username);
console.log(credentials.password);
console.log(credentials.connection_string);
// postgresql://user:pass@host:5432/dbname
نوع DatabaseCredentials:
interface DatabaseCredentials {
host: string;
port: number;
username: string;
password: string;
database: string;
connectionString: string;
}
اطلاعات اتصال را هرگز در کد یا لاگ ذخیره نکنید. آنها را مستقیم به عنوان متغیر محیطی به اپلیکیشن تزریق کنید.
حذف دیتابیس
await client.deleteDatabase('db_abc456');
پروژهها
// لیست پروژهها
const projects = await client.getProjects();
// ساخت پروژه جدید
const project = await client.createProject({ name: 'my-startup' });
// حذف پروژه
await client.deleteProject('proj_abc123');
نوع Project:
interface Project {
id: string;
name: string;
slug: string;
createdAt: string;
}
مدیریت خطا
تمام متدها در صورت بروز خطا یک نمونه از AbrclickError پرتاب میکنند:
import { AbrclickClient, AbrclickError } from '@abrclick/sdk';
const client = new AbrclickClient({ apiKey: process.env.ABRCLICK_API_KEY! });
async function safeCreateApp() {
try {
const app = await client.apps.create({
projectId: 'proj_abc123',
name: 'my-api',
runtime: 'node',
});
console.log('اپ ساخته شد:', app.id);
} catch (err) {
if (err instanceof AbrclickError) {
console.error('کد خطا:', err.code);
// مثال: 'APP_LIMIT_REACHED'
console.error('پیام فارسی:', err.messageFa);
// مثال: 'به محدودیت تعداد اپلیکیشن رسیدهاید.'
console.error('وضعیت HTTP:', err.status);
// مثال: 400
} else {
throw err;
}
}
}
ساختار AbrclickError:
class AbrclickError extends Error {
code: string; // کد ماشینی مانند APP_LIMIT_REACHED
messageFa: string; // پیام فارسی برای نمایش به کاربر
status: number; // HTTP status code
}
| کد | توضیح |
|---|---|
APP_LIMIT_REACHED | تعداد اپها به سقف پلن رسیده |
DB_LIMIT_REACHED | تعداد دیتابیسها به سقف پلن رسیده |
UNAUTHORIZED | API Key نامعتبر یا منقضی |
NOT_FOUND | اپ یا دیتابیس یافت نشد |
BUILD_FAILED | خطا در مرحله بیلد |
SOURCE_TOO_LARGE | حجم سورس از ۱۰۰ مگابایت بیشتر است |
مثال کامل: اتوماسیون دیپلوی
import { AbrclickClient, AbrclickError } from '@abrclick/sdk';
import path from 'path';
const client = new AbrclickClient({
apiKey: process.env.ABRCLICK_API_KEY!,
});
async function deployProject() {
const projectId = process.env.ABRCLICK_PROJECT_ID!;
// ساخت اپ در صورت نبود
let app;
const { data: apps } = await client.getApps(projectId);
const existing = apps.find((a) => a.name === 'backend-api');
if (existing) {
app = existing;
console.log('اپ موجود پیدا شد:', app.id);
} else {
app = await client.createApp(projectId, {
name: 'backend-api',
runtime: 'node',
port: 4000,
});
console.log('اپ جدید ساخته شد:', app.id);
}
// دیپلوی سورس کد (در واقعیت باید سورس را آپلود کنید)
console.log('شروع دیپلوی...');
const { uploadUrl, sourceKey } = await client.getSourceUploadUrl(app.id);
// ... آپلود tarball به uploadUrl ...
const deployment = await client.deployApp(app.id, {
source_type: 'upload',
source_key: sourceKey,
});
// نمایش لاگهای real-time
for await (const line of client.streamBuildLogs(app.id, deployment.id)) {
process.stdout.write(line);
}
console.log(`\nدیپلوی موفق: ${app.url}`);
}
deployProject().catch((err: unknown) => {
if (err instanceof AbrclickError) {
console.error(err.messageFa);
} else {
console.error(err);
}
process.exit(1);
});
پشتیبانی از تایپاسکریپت
پکیج @abrclick/sdk به صورت کامل با تایپاسکریپت نوشته شده است و نیازی به نصب @types/* جداگانه ندارد. تمام تایپها از خود پکیج قابل import هستند:
import type {
App,
Database,
Deployment,
Project,
DatabaseCredentials,
CreateAppInput,
CreateDatabaseInput,
} from '@abrclick/sdk';
امکانات پیشرفته
نواحی (Regions)
// لیست نواحی موجود
const regions = await client.listRegions();
for (const r of regions) {
console.log(`${r.slug} — ${r.display_name} — ${r.api_url}`);
}
// تغییر ناحیه فعال
const tehran = regions.find(r => r.slug === 'ir-thr-1');
client.useRegion(tehran!);
قالبهای آماده (Templates)
// لیست قالبهای آماده
const templates = await client.getTemplates();
// استقرار یک قالب (مثلاً WordPress)
const deployment = await client.deployTemplate('wordpress', {
project_id: 'proj_abc123',
app_name: 'my-blog',
app_cpu: '500m',
app_memory: '512Mi',
db_cpu: '500m',
db_memory: '512Mi',
});
// پیگیری وضعیت استقرار
const status = await client.getTemplateDeployment(deployment.id);
console.log(status.status); // 'provisioning_db' | 'deploying_app' | 'running'
دامنهها و DNS
// لیست دامنههای یک اپ
const domains = await client.getDomains('app_xyz789');
// افزودن دامنه سفارشی
await client.addDomain('app_xyz789', 'example.com');
// تأیید دامنه
await client.verifyDomain('app_xyz789', 'domain_123');
// مدیریت DNS zones
const zones = await client.getDnsZones();
const zone = await client.createDnsZone('example.com');
// افزودن رکورد DNS
await client.upsertDnsRecord(zone.id, {
name: 'www',
type: 'A',
ttl: 3600,
records: ['192.0.2.1'],
});
مانیتورینگ و هشدارها
// متریکهای اپ
const appMetrics = await client.getAppMetrics('app_xyz789', '24h');
console.log(appMetrics.metrics.cpu);
console.log(appMetrics.metrics.memory);
// متریکهای دیتابیس
const dbMetrics = await client.getDatabaseMetrics('db_abc456', '7d');
console.log(dbMetrics.metrics.active_connections);
// ایجاد قانون هشدار
await client.createAlertRule({
resourceId: 'app_xyz789',
resourceType: 'app',
metric: 'cpu',
operator: 'gt',
threshold: 80,
durationMinutes: 2,
notifyVia: 'email',
});
// لیست قوانین هشدار
const rules = await client.getAlertRules();
// فعال/غیرفعال کردن یک قانون
await client.toggleAlertRule('rule_123', false);
// حذف قانون
await client.deleteAlertRule('rule_123');
اعلانها (Notifications)
// دریافت اعلانها
const notifications = await client.getNotifications();
// فقط خواندهنشدهها
const unread = await client.getNotifications(true);
// تعداد خواندهنشده
const count = await client.getUnreadCount();
// علامتگذاری به عنوان خواندهشده
await client.markNotificationRead('notif_123');
// علامتگذاری همه به عنوان خواندهشده
await client.markAllNotificationsRead();
وظایف (Tasks)
// لیست وظایف پروژه
const tasks = await client.getTasks('proj_abc123');
// ایجاد وظیفه جدید
await client.createTask('proj_abc123', {
title: 'Fix login bug',
description: 'User reported 500 error',
appId: 'app_xyz789',
status: 'todo',
priority: 'high',
labels: ['bug', 'backend'],
});
// بهروزرسانی وظیفه
await client.updateTask('task_123', {
status: 'done',
assigneeId: 'user_456',
});
صورتحساب و کیف پول
// اطلاعات کیف پول
const wallet = await client.getWallet();
console.log(wallet.balance); // موجودی به تومان
// تراکنشهای کیف پول
const txs = await client.getWalletTransactions(50, 0);
// لیست صورتحسابها
const invoices = await client.getInvoices(1, 20);
// لیست پلنها
const plans = await client.getPlans();
// ارتقا پلن
await client.upgradePlan('rain');
// لیست افزونهها
const addons = await client.getAddons();
// خرید افزونه
await client.purchaseAddon('storage', 2);
بکآپ دیتابیس
// لیست بکآپها
const backups = await client.getBackups('db_abc456');
// ایجاد بکآپ دستی
await client.createBackup('db_abc456');
// بازگردانی از بکآپ
await client.restoreBackup('db_abc456', 'backup_123');
// کلون کردن از بکآپ (دیتابیس جدید)
await client.cloneBackup('db_abc456', 'backup_123', {
name: 'staging-db',
cpu_limit: '500m',
memory_limit: '1Gi',
storage_gb: 10,
});
// تنظیم زمانبندی خودکار بکآپ
await client.setBackupSchedule('db_abc456', '0 3 * * *'); // روزانه ساعت 3 صبح
GitHub Integration
// دریافت لینک نصب GitHub App
const { url } = await client.getGithubInstallUrl();
console.log('Install app:', url);
// لیست ریپازیتوریهای متصل
const repos = await client.listGithubRepos();
// قطع اتصال GitHub
await client.githubDisconnect();
SDK با Node.js نسخه ۱۸ و بالاتر سازگار است. برای استفاده از for await...of روی stream لاگها، Node.js 18+ توصیه میشود.