
تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker
تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker
تعلم كيفية توليد وتكوين شهادات SSL مجانية لتطبيقك الكامل باستخدام Certbot داخل Docker. يغطي هذا الدليل خطوة بخطوة إعداد HTTPS باستخدام Nginx، متطلبات المنافذ، تهيئة النطاق، وتجديد الشهادات.
في الجزء الأول من سلسلة النشر، قمنا بإعداد Nginx كوكيل عكسي لتطبيقك الكامل (NestJS + Next.js) باستخدام Docker. إذا لم تقرأه بعد، يمكنك الاطلاع عليه هنا: فهم Nginx لتطبيقات Fullstack.
دعنا نبدأ خطوة بخطوة بإنشاء وتطبيق شهادة SSL مجانية باستخدام Let's Encrypt + Certbot داخل Docker.
📌 المتطلبات الأساسية
قبل البدء بإعداد HTTPS، تأكد من توفر ما يلي:
- ✅ لديك اسم نطاق (مثل
example.com
) تم شراؤه من مزود نطاقات. - ✅ النطاق يحتوي على سجل A يشير إلى عنوان IP العام لسيرفرك.
- ✅ المنفذ 80 (HTTP) مفتوح في السيرفر وغير محجوب بجدار الحماية.
- ✅ Docker وDocker Compose مثبتين على السيرفر.
مثال: إذا كان نطاقك هوexample.com
وIP السيرفر هو192.0.2.1
، يجب أن يكون سجل A:example.com → 192.0.2.1
🔒 الخطوة 1: تشغيل Certbot في حاوية مؤقتة
Certbot يحتاج إلى التحقق من ملكية النطاق من خلال تحدي HTTP على المنفذ 80. سنقوم بتشغيل Certbot داخل حاوية Docker لمرة واحدة لتوليد الشهادة.
أنشئ مجلدات لتخزين الشهادات:
mkdir -p ./certbot/conf mkdir -p ./certbot/www
ثم شغّل Certbot:
docker run --rm \ -v $(pwd)/certbot/www:/var/www/certbot \ -v $(pwd)/certbot/conf:/etc/letsencrypt \ certbot/certbot certonly \ --webroot -w /var/www/certbot \ -d example.com -d www.example.com
استبدلexample.com
بنطاقك. سيقوم Certbot بإنشاء الشهادات داخل./certbot/conf
🔍 لماذا نستخدم --webroot
؟
Certbot سيضع ملفًا داخل /var/www/certbot/.well-known/...
، ويجب أن تكون Let's Encrypt قادرة على الوصول إليه من خلال HTTP لإثبات أنك تملك النطاق.
⚙️ الخطوة 2: إضافة إعدادات SSL إلى Nginx
بعد الحصول على ملفات الشهادة، سنقوم بتحديث إعدادات Nginx لدعم HTTPS.
تحديث ملف nginx/default.conf
ليصبح:
server { listen 80; server_name example.com www.example.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location /api/ { proxy_pass http://backend:5000/; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_cache_bypass $http_upgrade; } location / { proxy_pass http://frontend:3000/; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_cache_bypass $http_upgrade; } }
لا تنسَ استبدال example.com
بنطاقك الفعلي.
هل تحتاج لفهم أفضل لهذا الإعداد؟ راجع الجزء الأول من السلسلة: فهم Nginx لتطبيقات Fullstack
🐳 الخطوة 3: ربط مجلدات Certbot في Docker Compose
حدث ملف docker-compose.yml
:
nginx: image: nginx:alpine container_name: nginx_proxy ports: - "80:80" - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./certbot/conf:/etc/letsencrypt - ./certbot/www:/var/www/certbot depends_on: - frontend - backend
ثم أعد تشغيل الخدمات:
docker compose up -d --build
الآن موقعك يعمل على https://example.com
🎉
🔁 الخطوة 4: إعداد تجديد تلقائي للشهادات
شهادات Let's Encrypt تنتهي كل 90 يومًا. لذلك سنقوم بإنشاء Cron Job لتجديدها تلقائيًا.
أنشئ سكربت باسم renew_cert.sh
:
#!/bin/bash docker run --rm \ -v $(pwd)/certbot/www:/var/www/certbot \ -v $(pwd)/certbot/conf:/etc/letsencrypt \ certbot/certbot renew docker exec nginx_proxy nginx -s reload
اجعله قابلًا للتنفيذ:
chmod +x renew_cert.sh
ثم أضف المهمة إلى crontab:
crontab -e
وأضف السطر التالي لتشغيل السكربت يوميًا منتصف الليل:
0 0 * * * /path/to/your/renew_cert.sh >> /var/log/cert_renew.log 2>&1
هذا يضمن أن شهادات SSL لا تنتهي صلاحيتها أبدًا.
🧠 الملخص
في هذا المقال تعلمت:
- كيفية الحصول على شهادة SSL مجانية باستخدام Certbot
- كيفية إعداد Nginx لدعم HTTPS داخل Docker
- كيفية ربط مجلدات الشهادات وإعادة تحميل Nginx
- كيفية إنشاء تجديد تلقائي للشهادات باستخدام Cron
👉 تطبيقك الآن آمن وجاهز للإنتاج ✅
📘 لا تزال تتعلم Docker؟ راجع هذا المقال أولًا: Dockerize NestJS – Dockerfile & Compose
📘 تريد مراجعة إعداد Nginx؟ اقرأ الجزء الأول هنا: فهم Nginx لتطبيقات Fullstack
هل لديك أسئلة؟ تواصل معي من خلال kaisalhusrom.com أو راسلني على LinkedIn.