[{"data":1,"prerenderedAt":179},["ShallowReactive",2],{"seo-verification":3,"blog-اسرار-docker-في-الانتاج-حماية-بيانات-الاعتماد-على-vps-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-اسرار-docker-في-الانتاج-حماية-بيانات-الاعتماد-على-vps-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":118,"ctaBody":119,"ctaButton":120,"ctaUrl":121,"relatedPosts":122},369,"اسرار-docker-في-الانتاج-حماية-بيانات-الاعتماد-على-vps",{"fr":12,"en":13,"ar":10,"es":14},"docker-secrets-securite-vps-production","docker-secrets-production-protecting-credentials-on-vps","docker-secrets-produccion-proteger-credenciales-vps","أسرار Docker في الإنتاج: حماية بيانات الاعتماد على VPS","إدارة أسرار Docker في الإنتاج دون كشفها في ‎docker-compose.yml‎. Docker Secrets بدون Swarm و‎.env.vault‎ وSOPS: المنهج والمقارنة.",7,0,false,"2026-09-20T00:00:00+00:00","2026-09-20T21:13:51+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"الأمان والمراقبة","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdocker-secrets-securite-vps-production-poster.svg","ملف ‎docker-compose.yml‎ يحتوي على مفاتيح API بنص صريح هو تسريب ينتظر أول ماسح ضوئي. تشرح هذه المقالة كيفية القضاء على هذا الخطر على خادم VPS بصلاحيات root: Docker Secrets الأصلي (بدون Swarm منذ الإصدار Compose v2.24)، و‎.env.vault‎، وSOPS — كل طريقة مع أوامرها الدقيقة وقيودها الحقيقية.",[35,39,48,51,70,105,108,112,115],{"type":36,"title":37,"body":38},"h2","الخطر الحقيقي: أسرارك تنتقل داخل صورك","في عام 2024، رصد GitGuardian أكثر من 12,8 مليون سر مكشوف في مستودعات GitHub العامة — بزيادة 28% مقارنة بالعام السابق وفق تقرير **State of Secrets Sprawl 2025**. وتُعدّ صور Docker Hub من أكثر المتجهات التي يُقلَّل من شأنها.\n\nعندما تكتب ‎`ARG API_KEY`‎ في ‎`Dockerfile`‎ أو تمرر ‎`-e DB_PASSWORD=hunter2`‎ عند بدء الحاوية، لا يبقى هذا السر محصوراً في وقت التشغيل. بل قد ينتهي به المطاف:\n\n- في **طبقات الصورة** (قابل للفحص بـ‎`docker history --no-trunc`‎)؛\n- في **بيانات وصف الصورة** المُصدَّرة على Docker Hub (‎`docker inspect`‎)؛\n- في ملف ‎`‎.env`‎ **المُضاف عن طريق الخطأ** خلال ‎`git add .`‎ المتسرّع.\n\nتجوب الماسحات الآلية (‎Trivy‎، ‎Grype‎، ‎GitGuardian‎) Docker Hub باستمرار. مستودع عام يحوي سراً بنص صريح يُفهرَس في غضون دقائق. نافذة الكشف تكاد تكون معدومة.",{"type":40,"title":41,"items":42},"ul","5 أخطاء في الضبط تكشف أسرارك",[43,44,45,46,47],"**متغيرات البيئة بنص صريح في ‎`docker-compose.yml`‎** — ‎`environment: DB_PASSWORD: hunter2`‎ يقرأه كل من يصل إلى الملف أو الصورة.","**ملف ‎`‎.env`‎ مُودَع في المستودع** — خطأ واحد في ‎`.gitignore`‎ يُدخل السر في تاريخ git للأبد (حتى بعد ‎`git rm`‎، لا يزال متاحاً عبر ‎`git log`‎).","**‎`ARG`‎ مُمرَّر عند البناء ثم مُدمَج في الصورة** — تُخزَّن قيم ‎`ARG`‎ في بيانات طبقة الصورة ويمكن قراءتها بـ‎`docker history`‎.","**الأسرار في السجلات** — تطبيق يسجّل متغيرات بيئته عند الإقلاع (Spring Boot وRails في وضع debug وبعض خوادم Node) يطبع بيانات الاعتماد في ‎`docker logs`‎.","**وحدات تخزين bind-mount على ‎`\u002Froot`‎ أو دليل المشروع** — ملف ‎`‎.env`‎ مُثبَّت من المضيف يظل في متناول أي عملية داخل الحاوية بصلاحيات root.",{"type":36,"title":49,"body":50},"المتطلبات الأساسية","لمتابعة هذه المقالة، تحتاج إلى:\n\n- خادم **VPS Linux** (‎Debian 12‎ أو ‎Ubuntu 22.04+‎) بصلاحيات root.\n- **‏Docker Engine ≥ 24** و**Docker Compose ≥ 2.24** (تحقق بـ‎`docker compose version`‎).\n- لـSOPS: تثبيت ‎`age`‎ (حزمة ‎`age`‎ على ‎Debian\u002FUbuntu‎، أو ثنائي من \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage\u002Freleases\">‏github.com\u002FFiloSottile\u002Fage\u003C\u002Fa>).\n- لـ‎.env.vault‎: ‏Node.js ≥ 18 وواجهة سطر الأوامر ‎dotenvx‎ (‎`npm install -g @dotenvx\u002Fdotenvx`‎).\n\nلا يُشترط وجود مجموعة Swarm لأيٍّ من الطرق المقدَّمة هنا.",{"type":52,"title":53,"steps":54},"steps","الطريقة الأولى — Docker Secrets في Compose بدون Swarm (خطوة بخطوة)",[55,58,61,64,67],{"title":56,"body":57},"التحقق من إصدار Compose","يعمل Docker Secrets بدون Swarm منذ **Docker Compose v2.24.0** (إصدار 11 يناير 2024). تحقق:\n\n```bash\ndocker compose version\n# Docker Compose version v2.27.1\n```\n\nإن كنت أدنى من ‎v2.24‎، حدِّث Compose قبل المتابعة (‎`apt-get install docker-compose-plugin`‎ على ‎Debian\u002FUbuntu‎).",{"title":59,"body":60},"إنشاء ملفات الأسرار","أسرار Docker Compose في وضع غير Swarm هي **ملفات على المضيف**، مُثبَّتة كـ‎tmpfs‎ داخل الحاوية. أنشئها خارج دليل المشروع:\n\n```bash\nmkdir -p \u002Fetc\u002Fmyapp\u002Fsecrets\necho -n 'strong-db-password' > \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password\necho -n 'stripe-api-key-xxxxx' > \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fstripe_key\nchmod 600 \u002Fetc\u002Fmyapp\u002Fsecrets\u002F*\nchown root:root \u002Fetc\u002Fmyapp\u002Fsecrets\u002F*\n```\n\nالخيار ‎`-n`‎ في ‎`echo`‎ يمنع إضافة سطر جديد في النهاية — بعض التطبيقات تقرأ الملف بأكمله بما في ذلك السطر الجديد، مما يُبطل المفتاح.",{"title":62,"body":63},"الإعلان عن الأسرار في docker-compose.yml","```bash\nservices:\n  app:\n    image: myapp:latest\n    secrets:\n      - db_password\n      - stripe_key\n    environment:\n      # نُشير إلى المسار، لا إلى القيمة\n      DB_PASSWORD_FILE: \u002Frun\u002Fsecrets\u002Fdb_password\n      STRIPE_KEY_FILE: \u002Frun\u002Fsecrets\u002Fstripe_key\n\nsecrets:\n  db_password:\n    file: \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password\n  stripe_key:\n    file: \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fstripe_key\n```\n\nلاحظ استخدام اصطلاح ‎`*_FILE`‎: يجب أن يقرأ تطبيقك المتغير ‎`DB_PASSWORD_FILE`‎، ويفتح الملف المُشار إليه ويقرأ محتواه. الصور الرسمية لـ‎PostgreSQL‎ و‎MySQL‎ و‎Redis‎ ومعظم صور Bitnami **تدعم هذا الاصطلاح بشكل أصلي** — راجع توثيق صورتك.",{"title":65,"body":66},"التحقق من التثبيت داخل الحاوية","بعد ‎`docker compose up -d`‎، افحص التثبيت:\n\n```bash\ndocker compose exec app ls -la \u002Frun\u002Fsecrets\u002F\n# -r-------- 1 root root 20 Sep 20 08:12 db_password\n# -r-------- 1 root root 28 Sep 20 08:12 stripe_key\n\ndocker inspect myapp_app_1 | grep -A5 Mounts\n# \"Type\": \"tmpfs\",\n# \"Destination\": \"\u002Frun\u002Fsecrets\",\n```\n\nnوع التثبيت هو **‎tmpfs‎**: المحتوى يعيش في الذاكرة العشوائية، ولا يُكتب على قرص الحاوية. يختفي عند إيقاف الحاوية.",{"title":68,"body":69},"ما لا يفعله Docker Secrets — افهم ذلك قبل المتابعة","Docker Secrets ليس خزنة محكمة الإغلاق. ما **لا يحمي منه**:\n\n- الملف المصدر (‎`\u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password`‎) يبقى على **قرص المضيف** بنص صريح — root على الخادم لديه دائماً وصول إليه.\n- أي **عملية داخل الحاوية** (‎PID 1‎ أو عملية فرعية أطلقها التطبيق) يمكنها قراءة ‎`\u002Frun\u002Fsecrets\u002F*`‎.\n- **متغير بيئة مشتق** من السر (‎`DB_PASSWORD=$(cat \u002Frun\u002Fsecrets\u002Fdb_password)`‎ في نقطة دخول) يُعيد السر إلى البيئة، مرئياً عبر ‎`docker inspect`‎.\n\nيحمي Docker Secrets من التسرب في طبقات الصورة وفي ‎`docker-compose.yml`‎. لا يحمي من عملية مخترقة داخل الحاوية.",{"type":71,"title":72,"headers":73,"rows":78},"comparison","‏Docker Secrets مقابل ‎.env.vault مقابل SOPS — أي طريقة لأي سياق",[74,75,76,77],"المعيار","‏Docker Secrets (Compose)‏","‎.env.vault (dotenvx)‎","‎SOPS + age‎",[79,83,87,91,95,100],[80,81,82,82],"‏Swarm مطلوب","لا (منذ Compose v2.24)","لا",[84,85,86,86],"السر مُخزَّن بنص صريح على المضيف","نعم (الملف المصدر)","لا (مشفَّر في المستودع)",[88,82,89,90],"‏KMS عن بُعد مطلوب","لا (مفتاح محلي متماثل ممكن)","لا (‎age‎ يعمل بلا اتصال)",[92,93,94,94],"التدوير بلا إعادة نشر","لا (إعادة تشغيل ضرورية)","لا (إعادة بناء ‎.env‎)",[96,97,98,99],"‏CI\u002FCD: الحقن في خط الأنابيب","معقد (ملفات للتوفير)","بسيط (متغير ‎`DOTENV_PRIVATE_KEY`‎)","متوسط (مفتاح ‎age‎ كسر CI)",[101,102,103,104],"منحنى التعلم","منخفض (أصلي في Compose)","منخفض (واجهة ‎dotenvx‎)","متوسط (صياغة ‎YAML‎ + مفاتيح ‎age\u002FGPG‎)",{"type":36,"title":106,"body":107},"الضبط التكميلي: التدوير والتشفير أثناء الراحة","**تدوير أسرار Docker Compose.** لا يدعم Docker Compose بدون Swarm التدوير الساخن (خلافاً لـSwarm الذي يمكنه تحديث السر دون إيقاف الخدمة). لتغيير سر:\n\n```bash\n# 1. كتابة القيمة الجديدة\necho -n 'new-password' > \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password\n# 2. إعادة تشغيل الخدمة المعنية\ndocker compose restart app\n```\n\n**تشفير الملفات المصدر بـ‎age‎.** إن أردت تشفير الملفات على المضيف (لمواجهة سرقة لقطة أو نسخة احتياطية مخترقة)، يتيح لك ‎SOPS + age‎ تخزين ملفات مشفَّرة وفكّ تشفيرها عند الإقلاع:\n\n```bash\n# توليد مفتاح age\nage-keygen -o \u002Froot\u002F.config\u002Fsops\u002Fage\u002Fkeys.txt\n# تشفير ملف السر\nsops --encrypt --age $(age-keygen -y \u002Froot\u002F.config\u002Fsops\u002Fage\u002Fkeys.txt) \\\n  \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password > \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password.enc\n# في سكريبت الإقلاع، فكّ التشفير قبل docker compose up\nsops --decrypt \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password.enc > \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password\n```\n\n**مراجعة الوصول.** فعِّل سجلات Docker مع ‎`journald`‎ (‎`--log-driver=journald`‎ في ‎`\u002Fetc\u002Fdocker\u002Fdaemon.json`‎) للاحتفاظ بسجل من أطلق أي حاويات ومتى.",{"type":109,"title":110,"body":111},"tip","ما لا يحميه Docker Secrets","يُثبِّت Docker Secrets السر كـ**‎tmpfs‎ في ‎`\u002Frun\u002Fsecrets\u002F`‎**: إنه شبكة أمان ضد التسريب في الصور وملفات Compose، لا ضد عملية مخترقة داخل الحاوية. أي عملية تعمل داخل الحاوية — بما فيها shell حُصل عليه عبر RCE — يمكنها قراءة ‎`\u002Frun\u002Fsecrets\u002F*`‎. وroot على المضيف يصل دائماً إلى الملف المصدر.\n\nإن كان نموذج التهديد لديك يشمل حاوية مخترقة، فالجواب الصحيح هو مدير أسرار خارجي (‎HashiCorp Vault‎ أو ‎AWS Secrets Manager‎ أو ‎Infisical‎ المستضاف ذاتياً) يُسلِّم الأسرار عبر ‎API‎ مع مصادقة، دون كتابتها على قرص الحاوية أبداً.",{"type":36,"title":113,"body":114},"استكشاف الأخطاء وإصلاحها — أخطاء شائعة","**‎`unknown shorthand flag: 's' in -s`‎** أثناء ‎`docker compose up`‎\nأنت تستخدم الأمر القديم ‎`docker-compose`‎ (‎v1‎، ‎Python‎). انتقل إلى ‎`docker compose`‎ (‎v2‎، إضافة Go) بـ‎`apt-get install docker-compose-plugin`‎.\n\n**‎`secrets are only supported when deploying to a swarm`‎**\nإصدار Docker Compose لديك أقل من ‎v2.24‎. تحقق بـ‎`docker compose version`‎ وحدِّث.\n\n**الحاوية تبدأ لكن ‎`\u002Frun\u002Fsecrets\u002Fdb_password`‎ فارغ**\nتحقق من وجود الملف المصدر وعدم فراغه: ‎`cat \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password | wc -c`‎. ملف فارغ يُنشئ تثبيت ‎tmpfs‎ فارغاً دون رسالة خطأ.\n\n**‎`permission denied`‎ عند قراءة ‎`\u002Frun\u002Fsecrets\u002F`‎**\nتُثبَّت الملفات بأذونات الملف المصدر. إن كانت عمليتك تعمل بمستخدم غير root داخل الحاوية، اضبط أذونات الملف على المضيف: ‎`chmod 640 \u002Fetc\u002Fmyapp\u002Fsecrets\u002Fdb_password`‎ وتحقق من GID العملية.\n\n**‎`docker inspect`‎ لا يزال يُظهر متغير البيئة بنص صريح**\nلقد أعلنت السر لكنك مررت القيمة أيضاً في ‎`environment:`‎. احذف الإدخال بالقيمة المباشرة واستخدم اصطلاح ‎`*_FILE`‎ فقط في ‎`environment:`‎.",{"type":36,"title":116,"body":117},"أسرارك تحت السيطرة — والخطوات التالية","يُزيل Docker Secrets في وضع Compose غير Swarm السبب الرئيسي للتسريب: بيانات الاعتماد بنص صريح في ملفات الإعداد وطبقات الصورة. تنحصر الطريقة في خمس خطوات، وتعمل بلا بنية تحتية خارجية، وتندمج في أي سير عمل قائم.\n\nللمزيد:\n\n- **قائمة التحقق للإنتاج**: \u003Ca href=\"\u002Fblog\u002Fdocker-compose-production-checklist\">‏10 نقاط لا غنى عنها لملف ‎docker-compose.yml‎ جاهز للإنتاج\u003C\u002Fa>.\n- **البداية مع Docker على VPS**: \u003Ca href=\"\u002Fblog\u002Fdemarrer-avec-docker-vps\">الشروع في استخدام Docker على VPS\u003C\u002Fa> إن كنت تبني بيئتك الأولى.\n- **تصليب نظام التشغيل**: \u003Ca href=\"\u002Fblog\u002Flinux-hardening-vps-checklist\">قائمة تحقق تصليب Linux\u003C\u002Fa> لتأمين طبقة المضيف التي يعمل عليها Docker.","تحكم في مكدسك البرمجي، تحكم في أسرارك","خادم VPS بصلاحيات root وصول كامل إلى Docker: أنت من يقرر إدارة الأسرار، وسطح الهجوم، وكل طبقة في بنيتك التحتية.","النشر على VPS Cloud","\u002Fvps-cloud",[123,142,163],{"id":124,"slug":125,"slugs":126,"title":130,"excerpt":131,"readTime":23,"views":18,"isPinned":19,"publishedAt":132,"updatedAt":133,"category":134,"categories":139,"featuredImage":30,"bgImage":31,"posterImage":141,"relatedSolution":30},229,"docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط",{"fr":127,"en":128,"ar":125,"es":129},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","checklist-docker-compose-en-produccion","Docker Compose في الإنتاج: قائمة التحقق من 10 نقاط","‎10 إعدادات Docker Compose يجب التحقق منها قبل أي نشر إنتاجي: إعادة التشغيل والفحوص الصحية والحدود والأسرار والسجلات.","2026-08-06T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":135,"name":136,"slug":137,"color":138,"icon":137},3,"النشر","deploiement","bg-success\u002F10 text-success",[140],{"id":135,"name":136,"slug":137,"color":138,"icon":137},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":143,"slug":144,"slugs":145,"title":149,"excerpt":150,"readTime":135,"views":18,"isPinned":19,"publishedAt":151,"updatedAt":133,"category":152,"categories":158,"featuredImage":30,"bgImage":31,"posterImage":160,"relatedSolution":161},136,"تثبيت-docker-على-vps-قاعدة-نظيفة-لتطبيقاتك",{"fr":146,"en":147,"ar":144,"es":148},"demarrer-avec-docker-vps","installing-docker-on-a-vps-a-clean-base-for-your-apps","instalar-docker-en-un-vps","تثبيت Docker على VPS: قاعدة نظيفة لتطبيقاتك","جهّز VPS موثوقًا بـ Docker: العزل، وCompose، والأحجام (volumes)، والشبكة، وأفضل الممارسات للنشر دون ارتجال.","2026-02-10T00:00:00+00:00",{"id":153,"name":154,"slug":155,"color":156,"icon":157},4,"التطوير","developpement","bg-warning\u002F10 text-warning","dev",[159],{"id":153,"name":154,"slug":155,"color":156,"icon":157},"\u002Fblog\u002Fcovers\u002Fdemarrer-avec-docker-vps-poster.svg",{"categorySlug":157,"appSlug":162},"docker-starter",{"id":164,"slug":165,"slugs":166,"title":170,"excerpt":171,"readTime":172,"views":173,"isPinned":19,"publishedAt":174,"updatedAt":133,"category":175,"categories":176,"featuredImage":30,"bgImage":31,"posterImage":178,"relatedSolution":30},317,"قائمة-تصليب-خادم-لينكس-للوكالات-بعد-التسليم",{"fr":167,"en":168,"ar":165,"es":169},"linux-hardening-vps-checklist","linux-vps-hardening-checklist-for-agencies","hardening-linux-vps-checklist-para-agencias-tras-la-entrega","قائمة تصليب خادم لينكس للوكالات بعد التسليم","قائمة تدقيق لتصليب لينكس قابلة للتكرار للوكالات: auditd وsudo ومفتاح SSH وUFW وfail2ban وإلغاء تفعيل root — مع إمكانية التتبع لكل عميل.",11,1,"2026-08-30T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[177],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Flinux-hardening-vps-checklist-poster.svg",1789939062238]