R Academy · درس

نشر Plumber APIs في بيئة الإنتاج

حوّل Plumber APIs إلى حاويات وانشرها باستخدام Docker والمنصات السحابية

الدرس 4 من 413 خطوة

نشر Plumber APIs في بيئة الإنتاج درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

خيارات النشر في بيئة الإنتاج

يمكن نشر Plumber API بعدة طرق:

  • حاوية Docker — محمولة وقابلة لإعادة الإنتاج وتعمل في أي مكان
  • Posit Connect — نشر بنقرة واحدة مع الجدولة
  • Digital Ocean / EC2 — جهاز Linux افتراضي عادي يشغّل R

يُعد Docker الخيار الأكثر قابلية للنقل والمعيار المتبع في المجال لواجهات R API الإنتاجية.

نقطة دخول Plumber API

أنشئوا ملف api.R على المستوى الأعلى لبدء تشغيل خادم Plumber. استخدموا Sys.getenv('PORT', unset='8000') حتى يتمكن منسق الحاويات من ضبط المنفذ من دون تغيير الشفرة.

# api.R
# library(plumber)
#
# pr <- plumb('routes.R')
# port <- as.integer(Sys.getenv('PORT', unset = '8000'))
# pr$run(host = '0.0.0.0', port = port)
#
# Listening on 0.0.0.0 is required inside Docker
# (127.0.0.1 is only reachable inside the container)

صورة Docker الأساسية — rocker/r-ver

توفر صورة rocker/r-ver بيئة R بسيطة ومثبتة الإصدار. ثبّتوا دائمًا إصدارًا محددًا من R (مثل rocker/r-ver:4.3.2) لضمان عمليات بناء قابلة لإعادة الإنتاج. تجنبوا :latest في الإنتاج.

# Dockerfile
# FROM rocker/r-ver:4.3.2
#
# Alternatively use rocker/plumber which pre-installs plumber:
# FROM rstudio/plumber:latest
#
# rocker/r-ver is more minimal and gives you full control
# over which packages are installed.

تثبيت حزم R في Dockerfile

استخدموا RUN Rscript -e "install.packages(...)" لتثبيت الحزم أثناء بناء الصورة. ثبّتوا تبعيات النظام أولًا (مثل libssl-dev اللازمة لـ httr2) باستخدام apt-get.

# FROM rocker/r-ver:4.3.2
#
# RUN apt-get update && apt-get install -y \
#     libssl-dev \
#     libcurl4-openssl-dev \
#  && rm -rf /var/lib/apt/lists/*
#
# RUN Rscript -e "install.packages(c('plumber', 'jsonlite', 'httr2'), repos='https://cloud.r-project.org')"

نسخ الملفات وضبط المنفذ

انسخوا ملفات مصدر R إلى الحاوية باستخدام COPY. صرّحوا عن المنفذ باستخدام EXPOSE حتى يعرف Docker المنفذ الذي تستمع إليه الحاوية. هذا توثيق فقط — ولا ينشر المنفذ.

# FROM rocker/r-ver:4.3.2
# ...
# WORKDIR /app
# COPY routes.R .
# COPY api.R .
#
# EXPOSE 8000
#
# CMD ["Rscript", "api.R"]

بناء صورة Docker وتشغيلها

ابنوا الصورة باستخدام docker build، ثم شغّلوا حاوية تربط منفذ المضيف بمنفذ الحاوية. تُمرر العلامة -e متغيرات البيئة الخاصة بالأسرار.

# Build the image:
# docker build -t my-r-api:1.0 .
#
# Run a container:
# docker run -d \
#   -p 8000:8000 \
#   -e API_SECRET_KEY='my_secret' \
#   -e DATABASE_URL='postgres://...' \
#   --name r-api \
#   my-r-api:1.0
#
# Test:
# curl http://localhost:8000/ping

قراءة الأسرار باستخدام Sys.getenv()

في بيئة الإنتاج، لا تضعوا الأسرار مطلقًا في Dockerfile أو في الشفرة المصدرية. اقرؤوها أثناء التشغيل باستخدام Sys.getenv(). مرروها عبر علامات Docker -e، أو أسرار Kubernetes، أو أنظمة إدارة متغيرات البيئة مثل AWS Secrets Manager.

# In routes.R:
# db_url   <- Sys.getenv('DATABASE_URL', unset = '')
# api_key  <- Sys.getenv('API_SECRET_KEY', unset = '')
#
# if (nchar(db_url) == 0)  stop('DATABASE_URL is required')
# if (nchar(api_key) == 0) stop('API_SECRET_KEY is required')
#
# Fail fast at startup rather than failing silently at request time
cat('Validate all required env vars at startup with stop()
')

نقطة نهاية فحص الصحة

تتيح نقطة نهاية /ping أو /health لموازنات التحميل والمنسقات (Kubernetes وECS) التأكد من أن API تعمل. وينبغي أن تعيد الحالة 200 بسرعة ومن دون مصادقة، ويمكنها اختياريًا فحص الاتصال بقاعدة البيانات.

# #* Health check
# #* @preempt auth
# #* @get /ping
# function() {
#   list(
#     status  = 'ok',
#     version = '1.0.0',
#     time    = format(Sys.time(), '%Y-%m-%dT%H:%M:%SZ')
#   )
# }
#
# Docker HEALTHCHECK:
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1

مثال كامل على Dockerfile

جمع كل العناصر معًا — Dockerfile جاهز للإنتاج لواجهة Plumber API:

# FROM rocker/r-ver:4.3.2
# RUN apt-get update && apt-get install -y libssl-dev libcurl4-openssl-dev \
#  && rm -rf /var/lib/apt/lists/*
# RUN Rscript -e "install.packages(c('plumber','jsonlite'), repos='https://cloud.r-project.org')"
# WORKDIR /app
# COPY routes.R api.R ./
# EXPOSE 8000
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1
# CMD ["Rscript", "api.R"]

التسجيل في بيئة الإنتاج

يساعد التسجيل المنظم على تشخيص المشكلات في بيئة الإنتاج. استخدموا cat() أو الحزمة logger لكتابة سجلات تتضمن طوابع زمنية إلى stdout — يلتقط Docker ومعظم المنصات stdout تلقائيًا ويوجهه إلى مجمّع السجلات.

# Log format: ISO timestamp + level + message
log_info <- function(msg) {
  cat(format(Sys.time(), '%Y-%m-%dT%H:%M:%S'), '[INFO]', msg, '
')
}

log_info('API starting up')
log_info(paste('Port:', Sys.getenv('PORT', '8000')))

الوكيل العكسي باستخدام Nginx

في بيئة الإنتاج، ضعوا وكيل Nginx عكسيًا أمام Plumber ليتولى إنهاء TLS وتحديد معدل الطلبات وتخزين الطلبات مؤقتًا. يمرر Nginx الطلبات إلى Plumber على localhost، بينما يتصل العالم الخارجي بـ Nginx عبر المنفذ 443.

# Nginx config snippet (nginx.conf):
# server {
#   listen 443 ssl;
#   ssl_certificate     /etc/letsencrypt/.../fullchain.pem;
#   ssl_certificate_key /etc/letsencrypt/.../privkey.pem;
#
#   location /api/ {
#     proxy_pass         http://127.0.0.1:8000/;
#     proxy_set_header   Host $host;
#     proxy_set_header   X-Real-IP $remote_addr;
#   }
# }

تحقق سريع: Docker EXPOSE

ماذا يفعل التعليمة EXPOSE 8000 في Dockerfile فعليًا؟

مراجعة نشر Plumber APIs

الخطوات الأساسية لنشر Plumber في بيئة الإنتاج:

  • استمعوا على 0.0.0.0 واقرؤوا PORT من البيئة
  • استخدموا rocker/r-ver:X.Y.Z (مثبت الإصدار) بوصفه الصورة الأساسية
  • ثبّتوا الحزم في Dockerfile؛ وانسخوا ملفات المصدر فقط
  • مرروا الأسرار عبر متغيرات البيئة باستخدام -e — وليس في المصدر أو Dockerfile
  • أضيفوا نقطة نهاية صحة /ping (مع #* @preempt auth)
  • استخدموا Nginx وكيلًا عكسيًا لـ TLS وتحديد معدل الطلبات
البدء مجانًا

تعلم R مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
43
الدروس
159

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

هل درس «نشر Plumber APIs في بيئة الإنتاج» مجاني؟

نعم — نص درس «نشر Plumber APIs في بيئة الإنتاج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «نشر Plumber APIs في بيئة الإنتاج»؟

حوّل Plumber APIs إلى حاويات وانشرها باستخدام Docker والمنصات السحابية تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «نشر Plumber APIs في بيئة الإنتاج»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى Plumber وREST
  2. إنشاء نقاط نهاية GET وPOST
  3. المصادقة وأمان API
  4. نشر Plumber APIs في بيئة الإنتاج
← العودة إلى R Academy