متطلّبات حزمة 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 لمسار البناء ← الرفع ← النشر كاملاً.