alawadi.cloudمستندات
الانطلاق

متطلّبات حزمة Docker

تعرّف على شروط حزمة Docker اللازمة لتشغيل تطبيقك بأمان على استضافة مُدارة في alawadi.cloud.

متطلّبات بيئة التشغيل

يعمل تطبيقك كتطبيق Docker مُدار على Kubernetes، لا كخادم VPS. تفرض المنصّة سياسة أمان مقيّدة (restricted Pod Security)، لذلك يجب أن تلتزم حزمة تطبيقك ببضع قواعد. والخبر الجيّد: لست بحاجة لضبط أي من هذا يدوياً. عند إعداد النشر (Deployment)، تولّد لك البوابة ملف Dockerfile جاهزاً للإنتاج وملف GitHub Actions مناسبَين لبيئة عملك، يحقّقان كل القواعد أدناه.

  • استمع على المنفذ 8080. المنصّة توجّه دائماً إلى 8080. اربط العنوان 0.0.0.0 واقرأ متغيّر البيئة (environment variable) PORT (قيمته 8080). لا يوجد حقل للمنفذ عند إنشاء تطبيق Docker. المنفذ ثابت.
  • شغّل التطبيق بمستخدم غير root. سياسة الأمان المقيّدة ترفض التطبيقات التي تعمل بصلاحية root. أضِف مستخدماً غير root في ملف Dockerfile وفعّله عبر USER، واكتب الملفّات المؤقّتة في /tmp.
  • ثبّت وسماً غير قابل للتغيير أو بصمة digest. الوسم :latest والحزم بلا وسم مرفوضة برسالة 400 BAD_IMAGE ولا يُنشَر شيء. يستخدم النشر بصمة الـ commit‏ (...:${{ github.sha }}) أو بصمة @sha256:...، حتى تبقى كل عملية نشر قابلة للتكرار والتدقيق.
  • ارفع الحزمة إلى مستودعك (Registry) على alawadi.cloud. يجب أن تأتي الحزم المنشورة من registry.alawadi.cloud/.... الحزم العامّة الاعتباطية (مثل nginx:1.27 من Docker Hub) غير مقبولة كهدف للنشر؛ ويُرفَض النشر برسالة 400 BAD_IMAGE.
  • ابقَ بلا صلاحيات مرتفعة. لا يحتاج التطبيق إلى privileged mode أو host networking أو hostPath أو الوصول إلى Docker socket. تفرض المنصة هذا عند القبول وتعيد التحقق منه بشكل مستقل عبر كل حمل عمل؛ راجع الأمان والعزل.
  • اكشف نقطة نهاية (endpoint) للفحص الصحّي كي تستطيع المنصّة فحص تطبيقك. يعتمد المسار الدقيق على بيئة عملك (مثلاً /healthz لـ Node وGo وFastAPI وRust؛ و/api/health لـ Next.js؛ و/up لـ Laravel؛ و/actuator/health لـ Spring).

لست مضطراً لكتابة هذه الملفّات من الصفر

في البوابة، افتح مستودعك من لوحة التحكم ← Registries. تتيح لك بطاقة CI workflow templates اختيار بيئة عملك (Node/Express أو Next.js أو Python FastAPI/Django أو Go أو PHP Laravel أو Java Spring أو Rust أو Vite الثابتة)، وتمنحك، مع أزرار نسخ:

  • ملف Supporting Dockerfile لتلك البيئة، جاهز بمستخدم غير root، وبسطر EXPOSE 8080، وبحزمة أساس (base image) مثبّتة على إصدار رئيسي (دون latest متغيّر)؛ و
  • ملف .github/workflows/deploy.yml يبني الحزمة ويرفعها عبر OIDC وينشرها، وهو معبّأ مسبقاً بعنوان مستودعك وقيمة الـ audience ومعرّف التطبيق وقيمة deploy audience.

استخدم الملفّات المولّدة. عُرض ملف Dockerfile أدناه فقط لتعرف كيف تبدو الحزمة المطابقة للشروط؛ والبوابة تنتج ملفاً مكافئاً (متعدّد المراحل، جاهزاً للإنتاج) لبيئة العمل التي تختارها.

# syntax=docker/dockerfile:1
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci --omit=dev

FROM node:22-alpine AS runner
ENV NODE_ENV=production PORT=8080
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# node:alpine ships a non-root "node" user.
USER node
EXPOSE 8080
# Bind 0.0.0.0 and read PORT:
#   app.listen(process.env.PORT || 8080, "0.0.0.0")
CMD ["node", "server.js"]

من أين تأتي الحزمة

تبني الحزمة في GitHub Actions وترفعها إلى مستودعك على alawadi.cloud. لا تُستخدَم أي كلمة مرور ثابتة للمستودع؛ تسجيل الدخول عبر OIDC فقط. راجع النشر عبر GitHub Actions لمسار البناء ← الرفع ← النشر كاملاً.

في هذه الصفحة