ملخص سريع
تدير واجهات برمجة تطبيقات DigitalOcean القطرات (droplets)، ووحدات التخزين (volumes)، وجدران الحماية (firewalls)، وموازنات التحميل (load balancers)، ومجموعات Kubernetes، والمزيد. قم بالمصادقة باستخدام رموز الوصول الشخصية (personal access tokens)، واستدعاء api.digitalocean.com/v2، وتعامل مع حدود المعدل (rate limits). للاختبار، استخدم Apidog للتحقق من صحة التكوينات، واختبار توفير البنية التحتية، وتوثيق سير عمل الأتمتة الخاص بك.
مقدمة
تبسط DigitalOcean الحوسبة السحابية. بينما تقدم AWS و GCP مئات الخدمات، يركز DigitalOcean على الأساسيات: الحوسبة (droplets)، التخزين (volumes)، الشبكات (عناوين IP العائمة، جدران الحماية)، Kubernetes المدارة، ومنصة التطبيقات. تتطابق واجهة برمجة التطبيقات (API) مع هذه البساطة.
يستخدم المطورون واجهة برمجة تطبيقات DigitalOcean من أجل:
- إنشاء بيئات التطوير تلقائيًا
- إدارة مجموعات Kubernetes
- البنية التحتية كتعليمات برمجية باستخدام Terraform أو Pulumi
- توفير مسارات CI/CD
- عمليات النشر متعددة المناطق
المصادقة
رموز الوصول الشخصية
- انتقل إلى لوحة تحكم DigitalOcean ← API ← إنشاء رمز جديد
- سمِّ الرمز وحدد تاريخ انتهاء الصلاحية
- انسخ الرمز وخزّنه بأمان
استخدام الرمز:
curl -X GET "https://api.digitalocean.com/v2/account" \
-H "Authorization: Bearer YOUR_TOKEN"
تنسيق الاستجابة
{
"account": {
"droplet_limit": 25,
"email": "you@example.com",
"name": "Your Name",
"uuid": "abc123xyz",
"email_verified": true,
"status": "active"
}
}
القطرات (Droplets) (الأجهزة الافتراضية)
سرد جميع القطرات (droplets)
curl -X GET "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN"
إنشاء قطرة (droplet)
curl -X POST "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-droplet",
"region": "nyc1",
"size": "s-2vcpu-4gb",
"image": "ubuntu-20-04-x64",
"ssh_keys": ["ssh-rsa AAAA..."],
"backups": false,
"ipv6": true,
"tags": ["web", "production"]
}'
الأحجام الشائعة:
s-1vcpu-1gb- 1 وحدة معالجة مركزية افتراضية، 1 جيجابايت ذاكرة وصول عشوائي (5 دولارات شهريًا)s-2vcpu-2gb- 2 وحدة معالجة مركزية افتراضية، 2 جيجابايت ذاكرة وصول عشوائي (10 دولارات شهريًا)s-2vcpu-4gb- 2 وحدة معالجة مركزية افتراضية، 4 جيجابايت ذاكرة وصول عشوائي (20 دولارًا شهريًا)s-4vcpu-8gb- 4 وحدات معالجة مركزية افتراضية، 8 جيجابايت ذاكرة وصول عشوائي (40 دولارًا شهريًا)
المناطق:
nyc1,nyc3- نيويوركsfo3- سان فرانسيسكوams3- أمستردامsgp1- سنغافورة
الحصول على تفاصيل القطرة (droplet)
curl -X GET "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
حذف قطرة (droplet)
curl -X DELETE "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
إجراءات القطرة (droplet)
إعادة التشغيل:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "reboot"
}'
تغيير الحجم:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "resize",
"size": "s-4vcpu-8gb"
}'
لقطة (Snapshot):
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "snapshot",
"name": "my-snapshot"
}'
وحدات التخزين (Volumes) (تخزين الكتل)
إنشاء وحدة تخزين (volume)
curl -X POST "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"size_gigabytes": 100,
"name": "my-volume",
"region": "nyc1",
"description": "Data volume for web servers"
}'
إرفاق وحدة تخزين بقطرة (droplet)
curl -X POST "https://api.digitalocean.com/v2/volumes/VOLUME_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "attach",
"droplet_id": DROPLET_ID
}'
سرد وحدات التخزين (volumes)
curl -X GET "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN"
الشبكات
سرد عناوين IP العائمة
curl -X GET "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN"
تعيين عنوان IP عائم
curl -X POST "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"droplet_id": DROPLET_ID,
"region": "nyc1"
}'
إنشاء جدار حماية
curl -X POST "https://api.digitalocean.com/v2/firewalls" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "web-firewall",
"inbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "443",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "22",
"sources": {
"addresses": ["your-ip/32"]
}
}
],
"outbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"destinations": {
"addresses": ["0.0.0.0/0"]
}
}
],
"droplet_ids": [DROPLET_ID]
}'
موازنات التحميل
إنشاء موازن تحميل
curl -X POST "https://api.digitalocean.com/v2/load_balancers" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-lb",
"region": "nyc1",
"algorithm": "round_robin",
"health_check": {
"protocol": "http",
"port": 80,
"path": "/",
"check_interval_seconds": 10,
"response_timeout_seconds": 5,
"healthy_threshold": 3,
"unhealthy_threshold": 3
},
"forwarding_rules": [
{
"entry_protocol": "http",
"entry_port": 80,
"target_protocol": "http",
"target_port": 80
},
{
"entry_protocol": "https",
"entry_port": 443,
"target_protocol": "https",
"target_port": 443,
"tls_passthrough": true
}
],
"droplet_ids": [DROPLET_ID_1, DROPLET_ID_2]
}'
مجموعات Kubernetes
إنشاء مجموعة Kubernetes
curl -X POST "https://api.digitalocean.com/v2/kubernetes/clusters" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-cluster",
"region": "nyc1",
"version": "1.28",
"node_pools": [
{
"name": "worker-pool",
"size": "s-2vcpu-4gb",
"count": 3,
"auto_scale": true,
"min_nodes": 2,
"max_nodes": 6
}
]
}'
سرد تجمعات العقد (node pools)
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools" \
-H "Authorization: Bearer YOUR_TOKEN"
توسيع تجمع العقد (node pool)
curl -X PUT "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools/POOL_ID" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"count": 5
}'
حذف المجموعة
curl -X DELETE "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
الاختبار باستخدام Apidog
توفير البنية التحتية مكلف. اختبر بدقة قبل إنشاء الموارد.

1. إعداد البيئة
DIGITALOCEAN_TOKEN: your_token
BASE_URL: https://api.digitalocean.com/v2
DEFAULT_REGION: nyc1
DEFAULT_SIZE: s-2vcpu-4gb
2. التحقق من صحة الاستجابات
pm.test('Droplet created successfully', () => {
const response = pm.response.json()
pm.expect(response.droplet).to.have.property('id')
pm.expect(response.droplet.status).to.eql('new')
})
pm.test('Token is valid', () => {
const response = pm.response.json()
pm.expect(response.account).to.exist
pm.expect(response.account.status).to.eql('active')
})
3. مفاهيم التشغيل التجريبي (Dry Run)
لا يقدم DigitalOcean تشغيلًا تجريبيًا حقيقيًا، ولكن يمكنك التحقق من صحة المدخلات:
const validRegions = ['nyc1', 'sfo3', 'ams3', 'sgp1']
const validSizes = ['s-1vcpu-1gb', 's-2vcpu-2gb', 's-2vcpu-4gb']
pm.test('Region is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validRegions).to.include(requestBody.region)
})
pm.test('Size is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validSizes).to.include(requestBody.size)
})
اختبر واجهات برمجة تطبيقات البنية التحتية لـ DigitalOcean باستخدام Apidog - مجانًا
الأخطاء الشائعة والإصلاحات
401 غير مصرح به (Unauthorized)
السبب: رمز غير صالح أو منتهي الصلاحية.
الإصلاح: أعد إنشاء الرمز الخاص بك من لوحة التحكم. تحقق من تنسيق رأس المصادقة (Authorization header).
422 كيان غير قابل للمعالجة (Unprocessable Entity)
السبب: معلمات غير صالحة (منطقة خاطئة، حجم، صورة، إلخ).
الإصلاح: تحقق من وثائق API الخاصة بـ DigitalOcean للقيم الصالحة. المشكلات الشائعة:
- المنطقة لا تدعم الحجم المطلوب
- معرف الصورة غير موجود
- تم الوصول إلى الحد الأقصى للقطرات (droplet limit)
429 طلبات كثيرة جدًا (Too Many Requests)
السبب: تجاوز حد المعدل (الافتراضي 2000 طلب/ساعة).
الإصلاح: قم بتنفيذ استراتيجية التراجع (backoff):
async function doRequest(url, options, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await fetch(url, options)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
continue
}
return response
}
throw new Error('Rate limited')
}
تم الوصول إلى الحد الأقصى للقطرات (Droplet limit reached)
السبب: يحتوي الحساب على عدد كبير جدًا من القطرات (droplets).
الإصلاح: احذف القطرات غير المستخدمة أو اطلب زيادة الحد من الدعم الفني.
البدائل والمقارنات
| الميزة | DigitalOcean | AWS | GCP |
|---|---|---|---|
| أحجام القطرات | ثابتة | مخصصة | مخصصة |
| Kubernetes | DOKS مُدار | EKS | GKE |
| تخزين الكائنات | Spaces | S3 | Cloud Storage |
| تخزين الكتل | Volumes | EBS | Persistent Disk |
| موازنات التحميل | مدمجة | ELB | Cloud Load Balancing |
| الطبقة المجانية | رصيد 200 دولار | محدودة | رصيد 300 دولار |
| بساطة API | ★★★★★ | ★★☆☆☆ | ★★★☆☆ |
يتفوق DigitalOcean في البساطة. واجهة برمجة التطبيقات (API) مباشرة، وتعمل معظم العمليات دون التعامل مع عشرات الخدمات المتداخلة.
حالات الاستخدام الواقعية
بيئات التطوير. تقوم شركة ناشئة بإنشاء بيئات تطوير معزولة لكل فرع. كل طلب سحب (PR) يؤدي إلى استدعاءات API لإنشاء قطرة (droplet) بأحدث التعليمات البرمجية. بعد الدمج، يتم تدمير القطرة. يختبر المطورون في بيئات شبيهة بالإنتاج دون إعداد يدوي.
خوادم الويب ذات التوسع التلقائي. يراقب تطبيق ويب الحمل. عندما يتجاوز استخدام وحدة المعالجة المركزية 70%، تقوم واجهة برمجة التطبيقات (API) بإنشاء قطرات (droplets) جديدة وإضافتها إلى موازن التحميل. عندما ينخفض الحمل، يتم تدمير القطرات. تظل التكاليف منخفضة بينما يظل الأداء مرتفعًا.
مجموعات قواعد البيانات. توفر خدمة قواعد بيانات مُدارة وحدات تخزين رئيسية ونسخ متماثلة عبر المناطق. تتعامل واجهة برمجة التطبيقات (API) مع تكوين النسخ المتماثل، وجدولة النسخ الاحتياطي، وإعداد تجاوز الفشل تلقائيًا.
الخاتمة
إليك ما تعلمته:
- المصادقة باستخدام رموز الوصول الشخصية
- إنشاء وإدارة القطرات (droplets) برمجياً
- العمل مع وحدات التخزين (volumes) للتخزين الدائم
- تكوين جدران الحماية وموازنات التحميل
- إدارة مجموعات Kubernetes
- اختبار البنية التحتية باستخدام Apidog قبل التوفير
الأسئلة الشائعة
كم تكلفة القطرة (droplet)؟ تبدأ الأسعار من 5 دولارات شهريًا لوحدة معالجة مركزية افتراضية واحدة / 1 جيجابايت. تحقق من صفحة الأسعار للحصول على الأسعار الحالية. تتوفر الفوترة بالساعة.
هل يمكنني استخدام مفاتيح SSH مع القطرات التي تم إنشاؤها عبر API؟ نعم. قم بتضمين بصمة مفتاح SSH في مصفوفة ssh_keys عند إنشاء القطرات.
ما الفرق بين وحدات التخزين (volumes) و Spaces؟ وحدات التخزين (Volumes) هي تخزين كتل (block storage) يتم إرفاقها بالقطرات. Spaces هو تخزين كائنات (object storage) (مثل S3). استخدم وحدات التخزين لقواعد البيانات، و Spaces للملفات.
كيف أحصل على تكوين Kubernetes؟
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/kubeconfig" \
-H "Authorization: Bearer YOUR_TOKEN"
هل يمكنني تغيير حجم القطرة (droplet)؟ نعم، استخدم إجراء تغيير الحجم. تتطلب عمليات التخفيض إيقاف التشغيل. يمكن إجراء الترقيات أثناء التشغيل.
ما الفرق بين النسخ الاحتياطية (backups) واللقطات (snapshots)؟ النسخ الاحتياطية هي نسخ تلقائية أسبوعية/يومية تديرها DigitalOcean. اللقطات (Snapshots) هي صور يدوية عند الطلب تقوم بإنشائها.
كم يستغرق إنشاء القطرات (droplets)؟ عادةً ما بين 30-60 ثانية. قد تستغرق بعض المناطق والأحجام وقتًا أطول.
هل يمكنني استخدام Terraform مع DigitalOcean؟ نعم. لدى DigitalOcean موفر Terraform رسمي. إنه ممتاز للبنية التحتية كتعليمات برمجية.
