الرئيسية / المدونة / تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker
تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker

تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker

مميز

تأمين تطبيقك الكامل باستخدام HTTPS عبر Certbot وDocker

a

admin

المؤلف

30 دقيقة قراءة
47 المشاهدات
09 يوليو 2025

تعلم كيفية توليد وتكوين شهادات SSL مجانية لتطبيقك الكامل باستخدام Certbot داخل Docker. يغطي هذا الدليل خطوة بخطوة إعداد HTTPS باستخدام Nginx، متطلبات المنافذ، تهيئة النطاق، وتجديد الشهادات.

في الجزء الأول من سلسلة النشر، قمنا بإعداد Nginx كوكيل عكسي لتطبيقك الكامل (NestJS + Next.js) باستخدام Docker. إذا لم تقرأه بعد، يمكنك الاطلاع عليه هنا: فهم Nginx لتطبيقات Fullstack.

الآن، حان الوقت لجعل تطبيقك آمنًا باستخدام HTTPS، وهو المعيار الأساسي في تطبيقات الويب الحديثة.

دعنا نبدأ خطوة بخطوة بإنشاء وتطبيق شهادة 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.

شارك هذا المنشور

تم نسخ الرابط