ملخص سريع
تُمكّن واجهة برمجة تطبيقات Heroku المطورين من أتمتة عمليات النشر، وإدارة التطبيقات، وتكوين الإضافات، وتوسيع نطاق البنية التحتية برمجياً. تستخدم الواجهة OAuth 2.0 ومصادقة قائمة على الرموز، ونقاط نهاية RESTful للتطبيقات، والدينو، وعمليات البناء، وخطوط الأنابيب، مع حدود معدل تبلغ 10,000 طلب في الساعة لكل حساب. يغطي هذا الدليل إعداد المصادقة، ونقاط النهاية الأساسية، وتكامل CI/CD، واستراتيجيات النشر للإنتاج.
مقدمة
تُشغل Heroku أكثر من 4 ملايين تطبيق في أكثر من 170 دولة. بالنسبة للمطورين الذين يقومون ببناء أتمتة النشر، أو خطوط أنابيب CI/CD، أو أدوات إدارة التطبيقات المتعددة، فإن تكامل Heroku API ليس اختيارياً - بل هو ضروري.
هنا تكمن الحقيقة: الفرق التي تدير أكثر من 10 تطبيقات Heroku تخسر 8-12 ساعة أسبوعياً في عمليات النشر اليدوية وتغييرات التكوين. يتيح تكامل Heroku API القوي أتمتة عمليات النشر، وتوسيع نطاق الدينو بناءً على حركة المرور، ومزامنة التكوين عبر البيئات المختلفة.
يشرح هذا الدليل عملية تكامل Heroku API بالكامل. ستتعلم مصادقة الرمز، وإدارة التطبيقات والدينو، وبناء خطوط الأنابيب، وتوفير الإضافات، واستكشاف أخطاء العمل وإصلاحها. بحلول النهاية، سيكون لديك تكامل Heroku جاهز للإنتاج.
ما هي واجهة برمجة تطبيقات Heroku؟
توفر Heroku واجهة برمجة تطبيقات منصة RESTful لإدارة التطبيقات والبنية التحتية على منصة Heroku. تتعامل الواجهة مع:
- إنشاء التطبيقات وتكوينها وحذفها
- توسيع نطاق الدينو وإدارة العمليات
- إدارة البناء والإصدار
- توفير الإضافات وتكوينها
- إدارة خطوط الأنابيب والترويج
- إدارة النطاقات وشهادات SSL
- إعداد تصريف السجلات والمراقبة
- إدارة الفرق والمتعاونين
الميزات الرئيسية
| الميزة | الوصف |
|---|---|
| تصميم RESTful | طرق HTTP قياسية مع استجابات JSON |
| مصادقة الرمز | رمز حامل (Bearer token) مع دعم OAuth 2.0 |
| طلبات النطاق | ترقيم الصفحات لمجموعات النتائج الكبيرة |
| تحديد المعدل | 10,000 طلب في الساعة لكل حساب |
| إنشاءات متطابقة (Idempotent Creates) | سلوك إعادة محاولة آمن لعمليات الكتابة |
| ضغط Gzip | ضغط الاستجابة لتوفير عرض النطاق الترددي |
نظرة عامة على بنية API
تستخدم Heroku بنية REST API ذات إصدارات:
https://api.heroku.com/
تتبع API مواصفات JSON:API بأنماط موارد وعلاقات متسقة.
مقارنة إصدارات API
| الإصدار | الحالة | المصادقة | حالة الاستخدام |
|---|---|---|---|
| Platform API (v3) | الحالي | رمز حامل (Bearer Token) | جميع عمليات التكامل الجديدة |
| GitHub Integration | الحالي | OAuth 2.0 | التطبيقات المتصلة بـ GitHub |
| Container Registry | الحالي | مصادقة Docker | نشر الحاويات |
البدء: إعداد المصادقة
الخطوة 1: إنشاء حساب Heroku الخاص بك
قبل الوصول إلى API، تحتاج إلى حساب Heroku:

- زر موقع Heroku الإلكتروني
- انقر على Sign Up (التسجيل) وأنشئ حساباً
- تحقق من عنوان بريدك الإلكتروني
- أكمل إعداد الحساب
الخطوة 2: تثبيت Heroku CLI
يساعدك CLI في إنشاء رموز API واختبار الأوامر:
# macOS
brew tap heroku/brew && brew install heroku
# Windows
npm install -g heroku
# Linux
curl https://cli-assets.heroku.com/install.sh | sh
الخطوة 3: إنشاء رمز API
المصادقة باستخدام Heroku CLI:
# تسجيل الدخول إلى Heroku
heroku login
# هذا يفتح متصفحاً للمصادقة
# بعد تسجيل الدخول، يتم تخزين الرمز الخاص بك محلياً
استرداد رمز API الخاص بك:
# عرض رمز المصادقة الحالي الخاص بك
heroku authorizations:create --short-lived
# أو إنشاء رمز طويل الأمد (لـ CI/CD)
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"
ملاحظة أمنية: قم بتخزين الرموز في متغيرات البيئة، ولا تضعها أبداً في الكود:
# ملف .env
HEROKU_API_KEY="your_api_key_here"
HEROKU_APP_NAME="your-app-name"
الخطوة 4: فهم مصادقة الرمز
تستخدم Heroku مصادقة رمز حامل (Bearer token):
Authorization: Bearer {api_key}
Accept: application/vnd.heroku+json; version=3
يتطلب كل طلب API هذه الرؤوس.
الخطوة 5: إجراء أول استدعاء API الخاص بك
اختبر مصادقتك:
curl -n https://api.heroku.com/account \
-H "Accept: application/vnd.heroku+json; version=3" \
-H "Authorization: Bearer $HEROKU_API_KEY"
الاستجابة المتوقعة:
{
"id": "user-id-here",
"email": "developer@example.com",
"name": "Developer Name",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2026-03-20T14:22:00Z"
}
الخطوة 6: تطبيق المصادقة في الكود
إنشاء عميل API قابل لإعادة الاستخدام:
const HEROKU_API_KEY = process.env.HEROKU_API_KEY;
const HEROKU_BASE_URL = 'https://api.heroku.com';
const herokuRequest = async (endpoint, options = {}) => {
const response = await fetch(`${HEROKU_BASE_URL}${endpoint}`, {
...options,
headers: {
'Authorization': `Bearer ${HEROKU_API_KEY}`,
'Accept': 'application/vnd.heroku+json; version=3',
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Heroku API Error: ${error.message}`);
}
return response.json();
};
// الاستخدام
const account = await herokuRequest('/account');
console.log(`تم تسجيل الدخول باسم: ${account.email}`);
إدارة التطبيقات
إنشاء تطبيق جديد
إنشاء تطبيق Heroku برمجياً:
const createApp = async (appName, region = 'us') => {
const response = await herokuRequest('/apps', {
method: 'POST',
body: JSON.stringify({
name: appName,
region: region
})
});
return response;
};
// الاستخدام
const app = await createApp('my-awesome-app-2026');
console.log(`تم إنشاء التطبيق: ${app.name}`);
console.log(`عنوان Git: ${app.git_url}`);
console.log(`عنوان الويب: ${app.web_url}`);
استجابة التطبيق المتوقعة
{
"id": "app-uuid-here",
"name": "my-awesome-app-2026",
"region": { "name": "us" },
"created_at": "2026-03-25T10:00:00Z",
"updated_at": "2026-03-25T10:00:00Z",
"git_url": "https://git.heroku.com/my-awesome-app-2026.git",
"web_url": "https://my-awesome-app-2026.herokuapp.com",
"owner": { "email": "developer@example.com" },
"build_stack": { "name": "heroku-24" }
}
سرد تطبيقاتك
جلب جميع التطبيقات في حسابك:
const listApps = async (limit = 50) => {
const response = await herokuRequest(`/apps?limit=${limit}`);
return response;
};
// الاستخدام
const apps = await listApps();
apps.forEach(app => {
console.log(`${app.name} - ${app.web_url}`);
});
الحصول على تفاصيل التطبيق
استرداد معلومات التطبيق المفصلة:
const getApp = async (appName) => {
const response = await herokuRequest(`/apps/${appName}`);
return response;
};
// الاستخدام
const app = await getApp('my-awesome-app-2026');
console.log(`المكدس: ${app.build_stack.name}`);
console.log(`المنطقة: ${app.region.name}`);
تحديث تكوين التطبيق
تعديل إعدادات التطبيق:
const updateApp = async (appName, updates) => {
const response = await herokuRequest(`/apps/${appName}`, {
method: 'PATCH',
body: JSON.stringify(updates)
});
return response;
};
// الاستخدام - تغيير اسم التطبيق
const updated = await updateApp('old-app-name', {
name: 'new-app-name'
});
حذف تطبيق
إزالة تطبيق من حسابك:
const deleteApp = async (appName) => {
await herokuRequest(`/apps/${appName}`, {
method: 'DELETE'
});
console.log(`تم حذف التطبيق ${appName} بنجاح`);
};
إدارة الدينو
توسيع نطاق الدينو
توسيع نطاق تطبيقك لأعلى أو لأسفل:
const scaleDyno = async (appName, processType, quantity) => {
const response = await herokuRequest(`/apps/${appName}/formation/${processType}`, {
method: 'PATCH',
body: JSON.stringify({
quantity: quantity
})
});
return response;
};
// الاستخدام - توسيع نطاق دينو الويب إلى 3
const formation = await scaleDyno('my-app', 'web', 3);
console.log(`تم التوسيع إلى ${formation.quantity} من ${processType} دينو`);
الحصول على تكوين الدينو
عرض تكوين الدينو الحالي:
const getFormation = async (appName, processType = null) => {
const endpoint = processType
? `/apps/${appName}/formation/${processType}`
: `/apps/${appName}/formation`;
const response = await herokuRequest(endpoint);
return response;
};
// الاستخدام
const formation = await getFormation('my-app');
formation.forEach(proc => {
console.log(`${proc.type}: ${proc.quantity} دينو (@ ${proc.size})`);
});
أحجام الدينو المتاحة
| نوع الدينو | حالة الاستخدام | التكلفة/الشهر |
|---|---|---|
| eco | مشاريع الهواة، العروض التوضيحية | $5 |
| basic | تطبيقات إنتاج صغيرة | $7 |
| standard-1x | أعباء العمل القياسية | $25 |
| standard-2x | تطبيقات عالية الأداء | $50 |
| performance | تطبيقات حيوية للإنتاج | $250+ |
| private | عزل الشركات | مخصص |
إعادة تشغيل الدينو
إعادة تشغيل جميع الدينو لتطبيق ما:
const restartDynos = async (appName, processType = null) => {
const endpoint = processType
? `/apps/${appName}/formation/${processType}`
: `/apps/${appName}/dynos`;
await herokuRequest(endpoint, {
method: 'DELETE'
});
console.log(`تمت إعادة تشغيل الدينو لتطبيق ${appName}`);
};
تشغيل دينو لمرة واحدة
تنفيذ الأوامر في دينو معزولة:
const runCommand = async (appName, command) => {
const response = await herokuRequest(`/apps/${appName}/dynos`, {
method: 'POST',
body: JSON.stringify({
command: command,
size: 'standard-1x'
})
});
return response;
};
// الاستخدام - تشغيل ترحيل قاعدة البيانات
const dyno = await runCommand('my-app', 'npm run migrate');
console.log(`بدأ الدينو: ${dyno.id}`);
متغيرات التكوين
الحصول على متغيرات التكوين
استرداد متغيرات البيئة:
const getConfigVars = async (appName) => {
const response = await herokuRequest(`/apps/${appName}/config-vars`);
return response;
};
// الاستخدام
const config = await getConfigVars('my-app');
console.log(`DATABASE_URL: ${config.DATABASE_URL}`);
console.log(`NODE_ENV: ${config.NODE_ENV}`);
تعيين متغيرات التكوين
تحديث متغيرات البيئة:
const setConfigVars = async (appName, variables) => {
const response = await herokuRequest(`/apps/${appName}/config-vars`, {
method: 'PATCH',
body: JSON.stringify(variables)
});
return response;
};
// الاستخدام
const updated = await setConfigVars('my-app', {
NODE_ENV: 'production',
API_SECRET: 'your-secret-key',
LOG_LEVEL: 'info'
});
أفضل الممارسات لمتغيرات التكوين
- لا تقم أبداً بتخزين الأسرار في الكود - استخدم متغيرات البيئة لجميع البيانات الحساسة
- استخدم تكوينات منفصلة لكل بيئة - متغيرات مختلفة للمرحلة التجريبية مقابل الإنتاج
- قم بتدوير الأسرار بانتظام - قم بتحديث مفاتيح API وكلمات المرور ربع سنوياً
- قم ببادئة المتغيرات ذات الصلة -
STRIPE_SECRET_KEY،STRIPE_WEBHOOK_SECRET
إدارة البناء والإصدار
إنشاء بناء
نشر الكود عبر API:
const createBuild = async (appName, sourceBlobUrl) => {
const response = await herokuRequest(`/apps/${appName}/builds`, {
method: 'POST',
body: JSON.stringify({
source_blob: {
url: sourceBlobUrl
}
})
});
return response;
};
// الاستخدام
const build = await createBuild('my-app', 'https://storage.example.com/source.tar.gz');
console.log(`بدأ البناء: ${build.id}`);
console.log(`الحالة: ${build.status}`);
الحصول على حالة البناء
التحقق من تقدم البناء:
const getBuild = async (appName, buildId) => {
const response = await herokuRequest(`/apps/${appName}/builds/${buildId}`);
return response;
};
// انتظر حتى الاكتمال
const checkBuildStatus = async (appName, buildId, maxAttempts = 30) => {
for (let i = 0; i < maxAttempts; i++) {
const build = await getBuild(appName, buildId);
if (build.status === 'succeeded') {
console.log('تم البناء بنجاح!');
return build;
} else if (build.status === 'failed') {
throw new Error(`فشل البناء: ${build.output}`);
}
console.log(`البناء قيد التقدم... المحاولة ${i + 1}`);
await new Promise(resolve => setTimeout(resolve, 5000));
}
throw new Error('انتهت مهلة البناء');
};
سرد الإصدارات
عرض سجل الإصدارات:
const listReleases = async (appName, limit = 10) => {
const response = await herokuRequest(`/apps/${appName}/releases?limit=${limit}`);
return response;
};
// الاستخدام
const releases = await listReleases('my-app');
releases.forEach(release => {
console.log(`الإصدار v${release.version} - ${release.description} - ${release.created_at}`);
});
العودة إلى الإصدار السابق
العودة إلى إصدار سابق:
const rollback = async (appName, releaseId) => {
const response = await herokuRequest(`/apps/${appName}/releases`, {
method: 'POST',
body: JSON.stringify({
rollback: releaseId
})
});
return response;
};
// الاستخدام - العودة إلى الإصدار 42
const rollbackRelease = await rollback('my-app', 42);
console.log(`تمت العودة إلى الإصدار v${rollbackRelease.version}`);
إدارة خطوط الأنابيب
إنشاء خط أنابيب
إعداد خطوط أنابيب CI/CD:
const createPipeline = async (pipelineName) => {
const response = await herokuRequest('/pipelines', {
method: 'POST',
body: JSON.stringify({
name: pipelineName
})
});
return response;
};
// الاستخدام
const pipeline = await createPipeline('my-app-pipeline');
console.log(`تم إنشاء خط الأنابيب: ${pipeline.id}`);
إضافة تطبيقات إلى خط الأنابيب
ربط التطبيقات بمراحل خط الأنابيب:
const addAppToPipeline = async (pipelineId, appName, stage) => {
const response = await herokuRequest('/pipeline-couplings', {
method: 'POST',
body: JSON.stringify({
pipeline: pipelineId,
app: appName,
stage: stage // 'development', 'staging', 'production'
})
});
return response;
};
// الاستخدام
await addAppToPipeline(pipelineId, 'my-app-dev', 'development');
await addAppToPipeline(pipelineId, 'my-app-staging', 'staging');
await addAppToPipeline(pipelineId, 'my-app-prod', 'production');
ترقية السلاغ إلى المرحلة التالية
نقل الكود عبر خط الأنابيب:
const promoteSlug = async (slugId, toApp) => {
await herokuRequest('/promotions', {
method: 'POST',
body: JSON.stringify({
from: toApp, // تطبيق المصدر
to: toApp, // التطبيق الهدف (المرحلة التالية)
slug: slugId
})
});
console.log(`تمت ترقية السلاغ ${slugId} إلى ${toApp}`);
};
إدارة الإضافات
توفير الإضافات
تثبيت إضافات Heroku:
const provisionAddon = async (appName, addonPlan, config = {}) => {
const response = await herokuRequest('/addon-attachments', {
method: 'POST',
body: JSON.stringify({
app: appName,
plan: addonPlan,
config: config
})
});
return response;
};
// الاستخدام - توفير PostgreSQL
const db = await provisionAddon('my-app', 'heroku-postgresql:mini', {});
console.log(`تم توفير قاعدة البيانات: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);
الإضافات الشائعة
| الإضافة | الخطة | السعر المبدئي | حالة الاستخدام |
|---|---|---|---|
| heroku-postgresql | mini | $5/شهر | قاعدة بيانات الإنتاج |
| heroku-redis | mini | $5/شهر | التخزين المؤقت، الجلسات |
| papertrail | choklad | $7/شهر | تجميع السجلات |
| sentry | developer | مجاني | تتبع الأخطاء |
| mailgun | sandbox | مجاني | تسليم البريد الإلكتروني |
| newrelic | lite | مجاني | مراقبة التطبيق |
سرد الإضافات
عرض الإضافات المثبتة:
const listAddons = async (appName) => {
const response = await herokuRequest(`/apps/${appName}/addons`);
return response;
};
// الاستخدام
const addons = await listAddons('my-app');
addons.forEach(addon => {
console.log(`${addon.plan.name} - $${addon.pricing.plan.price} - ${addon.state}`);
});
إزالة الإضافات
إلغاء تثبيت الإضافات:
const removeAddon = async (appName, addonId) => {
await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
method: 'DELETE'
});
console.log(`تمت إزالة الإضافة ${addonId} من ${appName}`);
};
إدارة النطاقات وشهادات SSL
إضافة نطاقات مخصصة
تكوين نطاقات مخصصة:
const addDomain = async (appName, domainName) => {
const response = await herokuRequest(`/apps/${appName}/domains`, {
method: 'POST',
body: JSON.stringify({
hostname: domainName
})
});
return response;
};
// الاستخدام
const domain = await addDomain('my-app', 'api.example.com');
console.log(`هدف CNAME: ${domain.cname}`);
تكوين شهادات SSL
إضافة SSL إلى النطاقات المخصصة:
const addSslCertificate = async (appName, domainId, certificateChain, privateKey) => {
const response = await herokuRequest(`/apps/${appName}/domains/${domainId}/ssl_endpoint`, {
method: 'PATCH',
body: JSON.stringify({
ssl_cert: {
cert_chain: certificateChain,
private_key: privateKey
}
})
});
return response;
};
SSL تلقائي باستخدام ACM
تمكين إدارة الشهادات التلقائية (ACM):
const enableACM = async (appName, domainName) => {
const response = await herokuRequest(`/apps/${appName}/domains/${domainName}/sni_endpoint`, {
method: 'POST',
body: JSON.stringify({
kind: 'acm'
})
});
return response;
};
تحديد المعدل والحصص
فهم حدود المعدل
تفرض Heroku حدوداً على المعدل لحماية استقرار API:
- الحد القياسي: 10,000 طلب في الساعة لكل حساب
- النافذة: نافذة متجددة مدتها 60 دقيقة
- إعادة الضبط: تلقائية بعد مرور النافذة
تجاوز الحدود يؤدي إلى استجابات HTTP 429 (طلبات كثيرة جداً).
تطبيق معالجة حدود المعدل
استخدم التراجع الأسي لإعادة المحاولة:
const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const response = await herokuRequest(endpoint, options);
// تحقق من رؤوس حدود المعدل
const remaining = response.headers.get('RateLimit-Remaining');
const resetTime = response.headers.get('RateLimit-Reset');
if (remaining < 100) {
console.warn(`الحد المتبقي المنخفض: ${remaining}، يتم إعادة تعيينه في ${resetTime}`);
}
return response;
} catch (error) {
if (error.message.includes('429') && attempt < maxRetries) {
const delay = Math.pow(2, attempt) * 1000;
console.log(`تم تجاوز الحد. إعادة المحاولة خلال ${delay} مللي ثانية...`);
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
};
رؤوس حدود المعدل
تتضمن Heroku هذه الرؤوس في كل استجابة:
| الرأس | الوصف |
|---|---|
RateLimit-Limit |
الحد الأقصى للطلبات في الساعة |
RateLimit-Remaining |
الطلبات المتبقية في النافذة |
RateLimit-Reset |
طابع زمني Unix عند إعادة تعيين النافذة |
استكشاف الأخطاء الشائعة وإصلاحها
المشكلة: فشل المصادقة برمز 401
الأعراض: الحصول على أخطاء "بيانات اعتماد غير صالحة".
الحلول:
- تحقق من صحة مفتاح API:
heroku authorizations - تأكد من أن الرمز لم تنته صلاحيته (الرموز طويلة الأمد تستمر لمدة عام واحد)
- تحقق من وجود مسافات بيضاء إضافية في متغير البيئة
- أعد إنشاء الرمز إذا لزم الأمر:
heroku authorizations:create
المشكلة: اسم التطبيق محجوز بالفعل
الأعراض: الحصول على خطأ "الاسم محجوز بالفعل".
الحلول:
- استخدم أسماء فريدة عالمياً - قم بتضمين اسم الفريق أو لاحقة عشوائية
- أنشئ أسماء تستند إلى UUID:
app-${Date.now()} - استخدم بادئات مساحة الاسم:
teamname-appname-env
const generateUniqueAppName = (baseName) => {
const timestamp = Date.now().toString(36);
const random = Math.random().toString(36).substring(2, 6);
return `${baseName}-${timestamp}-${random}`;
};
المشكلة: فشل تكوين الدينو
الأعراض: عمليات التوسيع تعيد أخطاء.
الحلول:
- تحقق من أن نوع العملية موجود في ملف Procfile
- تأكد من أن الحساب لديه حصة دينو متاحة
- تأكد من أن التطبيق ليس معلقاً
- راجع استخدام ساعات الدينو:
heroku ps --app=my-app
المشكلة: فشل البناء بانتهاء المهلة
الأعراض: عمليات البناء تتوقف أو تنتهي مهلتها بعد 30 دقيقة.
الحلول:
- تحسين اختيار حزمة البناء للغتك
- تخزين التبعيات مؤقتاً بشكل صحيح
- تقسيم عمليات البناء الكبيرة إلى عمليات نشر أصغر
- استخدم سلاغ مُبنية مسبقاً لنشر أسرع
المشكلة: تم تجاوز حد المعدل
الأعراض: تلقي استجابات HTTP 429.
الحلول:
- تطبيق قائمة انتظار الطلبات
- استخدم التراجع الأسي لإعادة المحاولة
- تجميع الطلبات حيثما أمكن ذلك
- مراقبة رؤوس حدود المعدل بشكل استباقي
// محدد معدل بسيط
class HerokuRateLimiter {
constructor(requestsPerMinute = 150) {
this.queue = [];
this.interval = 60000 / requestsPerMinute;
this.processing = false;
}
async add(requestFn) {
return new Promise((resolve, reject) => {
this.queue.push({ requestFn, resolve, reject });
this.process();
});
}
async process() {
if (this.processing || this.queue.length === 0) return;
this.processing = true;
while (this.queue.length > 0) {
const { requestFn, resolve, reject } = this.queue.shift();
try {
const result = await requestFn();
resolve(result);
} catch (error) {
reject(error);
}
if (this.queue.length > 0) {
await new Promise(r => setTimeout(r, this.interval));
}
}
this.processing = false;
}
}
قائمة التحقق لنشر الإنتاج
قبل النشر المباشر:
- [ ] استخدم رموز API طويلة الأمد لـ CI/CD
- [ ] قم بتخزين الرموز في إدارة الأسرار الآمنة (Vault, AWS Secrets Manager)
- [ ] طبق تحديد المعدل وقوائم انتظار الطلبات
- [ ] أضف معالجة شاملة للأخطاء
- [ ] قم بإعداد التسجيل لجميع استدعاءات API
- [ ] راقب استخدام ساعات الدينو
- [ ] قم بتكوين تصريف السجلات للتسجيل الخارجي
- [ ] قم بإعداد ترقيات خط الأنابيب لـ CI/CD
- [ ] قم بتمكين إدارة الشهادات التلقائية
- [ ] قم بتكوين استراتيجية النسخ الاحتياطي لقواعد البيانات
المراقبة والتنبيه
تتبع هذه المقاييس:
const metrics = {
apiCalls: {
total: 0,
successful: 0,
failed: 0,
rateLimited: 0
},
dynoHours: {
used: 0,
quota: 1000
},
deployments: {
successful: 0,
failed: 0,
avg_duration: 0
}
};
// تنبيه عند ارتفاع معدل الفشل
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;
if (failureRate > 0.05) {
sendAlert('معدل فشل Heroku API أعلى من 5%');
}
// تنبيه عند استخدام ساعات الدينو
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
sendAlert('استخدام ساعات الدينو أعلى من 80%');
}
حالات الاستخدام في العالم الحقيقي
خط أنابيب CI/CD مؤتمت
فريق SaaS يقوم بأتمتة عمليات النشر من GitHub:
- التحدي: عمليات النشر اليدوية تسببت في أخطاء وتأخيرات
- الحل: تكامل GitHub Actions + Heroku API
- النتيجة: عمليات نشر بدون توقف، إصدارات أسرع بنسبة 90%
تدفق التنفيذ:
- دفع GitHub يشغل سير العمل
- تُشغل الاختبارات في CI
- Heroku API ينشئ بناءً من كائن المصدر (source blob)
- الترقية عبر مرحلة التجريب إلى الإنتاج
- إبلاغ الفريق عند النجاح/الفشل
إدارة بيئات متعددة
شركة استشارية تدير أكثر من 50 تطبيقاً للعملاء:
- التحدي: مزامنة التكوين اليدوية عبر البيئات
- الحل: إدارة تكوين مركزية باستخدام Heroku API
- النتيجة: تكوينات متسقة، توفير 8 ساعات/أسبوع
نقاط التكامل الرئيسية:
- مزامنة متغيرات التكوين عبر بيئات التطوير/التجريب/الإنتاج
- توفير الإضافات تلقائياً
- عمليات مجمعة لضم العملاء الجدد
التوسيع التلقائي بناءً على حركة المرور
منصة تجارة إلكترونية تتعامل مع ذروات حركة المرور:
- التحدي: التوسيع اليدوي خلال أحداث المبيعات
- الحل: توسيع تلقائي يعتمد على الحمل باستخدام Heroku API
- النتيجة: عدم توقف الخدمة خلال ذروات حركة المرور بمعدل 10 أضعاف
منطق التوسيع التلقائي:
- مراقبة أوقات الاستجابة عبر Metrics API
- التوسيع عند تجاوز زمن الاستجابة p95 لـ 500 مللي ثانية
- التقليل خلال فترات حركة المرور المنخفضة
- التنبيه عند الاستخدام المرتفع المستمر
الخلاصة
توفر واجهة برمجة تطبيقات Heroku وصولاً شاملاً إلى وظائف المنصة. النقاط الرئيسية المستفادة:
- تتطلب مصادقة الرمز الحامل (Bearer token) تخزيناً آمناً وتدويراً
- تحديد المعدل (10 آلاف/ساعة) يتطلب مراقبة استباقية
- إدارة خطوط الأنابيب تمكن من سير عمل CI/CD قوي
- معالجة الأخطاء المناسبة تضمن موثوقية النشر
- يبسط Apidog اختبار API وتعاون الفريق لتكاملات Heroku
قسم الأسئلة الشائعة
ما هو استخدام واجهة برمجة تطبيقات Heroku؟
تُستخدم واجهة برمجة تطبيقات Heroku لإدارة التطبيقات، الدينو، الإضافات، والبنية التحتية برمجياً. تشمل حالات الاستخدام الشائعة أتمتة CI/CD، وأدوات إدارة التطبيقات المتعددة، وأنظمة التوسيع التلقائي، ولوحات معلومات مراقبة البنية التحتية.
كيف أحصل على مفتاح API لـ Heroku؟
قم بتثبيت Heroku CLI، ثم قم بتشغيل heroku login، ثم أنشئ ترخيصاً باستخدام heroku authorizations:create. قم بتخزين الرمز المسترد بأمان في متغيرات البيئة.
هل واجهة برمجة تطبيقات Heroku مجانية للاستخدام؟
نعم، واجهة برمجة تطبيقات Heroku مجانية. ومع ذلك، تدفع مقابل الموارد التي توفرها (الدينو، الإضافات، إلخ). حدود معدل API هي 10,000 طلب في الساعة لكل حساب.
ما هي طريقة المصادقة التي تستخدمها واجهة برمجة تطبيقات Heroku؟
تستخدم Heroku مصادقة الرمز الحامل (Bearer token). قم بتضمين رأس Authorization: Bearer {api_key} في كل طلب. يمكن أن تكون الرموز قصيرة الأمد (ساعة واحدة) أو طويلة الأمد (تصل إلى سنة واحدة).
كيف أتعامل مع حدود معدل Heroku API؟
راقب رأس RateLimit-Remaining وقم بتطبيق قائمة انتظار الطلبات. استخدم التراجع الأسي عند تلقي استجابات HTTP 429. حافظ على معدل أقل من 150 طلباً في الدقيقة لتشغيل آمن.
هل يمكنني النشر بدون Git؟
نعم. استخدم Builds API للنشر من عنوان URL لكائن مصدر (source blob). قم بتحميل الكود الخاص بك إلى التخزين السحابي (S3, GCS) وارجع إلى عنوان URL في طلب البناء الخاص بك.
كيف أقوم بأتمتة عمليات النشر؟
استخدم Pipeline API لإعداد CI/CD. قم بإنشاء عمليات بناء، وترقية السلاغات عبر المراحل، ودمجها مع GitHub أو أنظمة CI المخصصة.
ما الفرق بين الإصدار (Release) والبناء (Build)؟
البناء (Build) يقوم بتحويل الكود المصدري الخاص بك إلى سلاغ (slug). الإصدار (Release) يجمع السلاغ مع متغيرات التكوين لإنشاء نسخة قابلة للنشر من تطبيقك.
كيف أقوم بالعودة إلى إصدار سابق بعد نشر فاشل؟
استخدم Releases API لسرد الإصدارات الأخيرة، ثم قم بإرسال طلب POST إلى /releases مع rollback: <release_id>. ستنشئ Heroku إصداراً جديداً بالنسخة السابقة.
هل يمكنني إدارة حسابات Heroku متعددة؟
نعم. استخدم رموز API منفصلة لكل حساب وقم بالتبديل بينها عن طريق تغيير متغير البيئة HEROKU_API_KEY.
