مستوى المقال: مبتدئ — لو شغّلت موقع PHP أو Node.js مرة واحدة على VPS وتعرف تفتح ssh، الكلام ده يهمّك مباشرة.
لو لسه بتكتب 47 سطر nginx config علشان تشغّل HTTPS على دومين واحد، Caddy بيعمل نفس الشغل في سطرين وبشهادة Let's Encrypt مجانية بتتجدّد لوحدها كل 60 يوم بدون cron job ولا تنبيهات منسية.
Caddy Server للمبتدئ: HTTPS أوتوماتيكي بسطرين بدل nginx المعقد
المشكلة باختصار
nginx ممتاز، لكن منهك في الإعداد. لإطلاق موقع واحد بـ HTTPS على VPS صغير، لازم تعمل التالي بالترتيب: تنزّل certbot، تعمل cron job للتجديد كل أسبوعين، تفتح port 80 و443 في الـ firewall، تكتب server block فيه ssl_certificate و ssl_certificate_key و ssl_protocols و ssl_ciphers، وبعدين تـ reload الـ service. متوسط الإعداد الأول: 38 دقيقة لو كل حاجة مظبوطة من أول مرة.
لو نسيت سطر واحد أو الـ cron job توقف بدون تنبيه، بعد 90 يوم Chrome بيعرض شاشة "Your connection is not private" أمام عميلك. ده مش سيناريو نظري — حصل في 1 من كل 6 مشاريع شخصية بشوفها بدون monitoring جاد.
Caddy 2.7+ بياخد كل الجزء ده ويحوّله لسطرين فقط، وبيدير شهادات Let's Encrypt تلقائيًا من اللحظة الأولى.
المثال أولاً: مطعم بيقدّم أكل ومعاه عسكري على الباب
تخيّل مطعم في مول. الـ web server هو الشيف اللي بيطبخ ويقدّم الأكل (الصفحات والـ API). الـ HTTPS هو العسكري على الباب اللي بيتأكّد إن اللي داخل من الباب الصح، ومفيش حد بيتنصّت على الكلام بين الزبون والنادل في الطريق.
في حالة nginx، انت جبت شيف ممتاز بس سبت الباب مفتوح، ولازم تتعاقد مع شركة حراسة منفصلة (certbot)، توقّع معاهم عقد تجديد، وتفتكر تجدّد العقد كل شهرين بنفسك. لو سهيت أو الراجل اللي عند الشركة سافر، الباب بيقفل والزبون بيقف بره.
Caddy جاب الشيف والـ security معاه في حزمة واحدة. اتعاقدت معاه مرة، وهو بياخد كل المسؤولية: التجديد، المتابعة، حتى لو الشهادة وقعت بيرفعها قبل ما تتنبه أنت أصلاً.
التعريف العلمي بدقة
Caddy هو HTTP/1.1 و HTTP/2 و HTTP/3 web server مكتوب بلغة Go (نفس لغة Docker و Kubernetes)، ومدمج فيه ACME client بشكل أصلي. الـ ACME (Automatic Certificate Management Environment) protocol معرّف رسميًا في RFC 8555 من IETF سنة 2019، وهو المعيار اللي Let's Encrypt بتستخدمه لإصدار الشهادات.
Caddy بيعمل challenge من نوع HTTP-01 أو TLS-ALPN-01 تلقائيًا — يعني بيثبت لـ Let's Encrypt إنه هو فعلاً مالك الدومين، وبعدين يستلم الشهادة ويحفظها في `/var/lib/caddy/.local/share/caddy` على Linux. التجديد بيحصل تلقائيًا قبل انتهاء الشهادة بـ 30 يوم.
السطرين فعليًا — Caddyfile شغّال
اعمل ملف اسمه `Caddyfile` في `/etc/caddy/Caddyfile` على VPS Ubuntu 22.04 أو 24.04:
ahmedhaies.com {
reverse_proxy localhost:3000
}