دليل Docker Compose: إدارة تطبيقات متعددة الحاويات
تعريف وإدارة التطبيقات متعددة الحاويات باستخدام Docker Compose: تبعيات الخدمات، متغيرات البيئة، فحوصات الصحة، التوسع والنشر في بيئة الإنتاج. دليل شامل.
تثبيت خادم ويب Caddy، تكوين Caddyfile، SSL تلقائي من Let's Encrypt، بروكسي عكسي، استضافة المواقع الثابتة، تكامل PHP-FPM وإعدادات الأداء.
Caddy خادم ويب حديث يتميز بإدارة شهادات HTTPS التلقائية. بفضل تكامله مع Let's Encrypt، يحصل على شهادات SSL ويجددها ويكوّنها تلقائياً.
الميزات البارزة لـ Caddy:
يتطلب Caddy صلاحيات root لاستخدام المنفذين 80 و443. يُدار هذا تلقائياً عند التشغيل كخدمة systemd.
# إضافة مفتاح GPG ومستودع Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# تثبيت Caddy
sudo apt update
sudo apt install caddy -y
# التحقق من حالة الخدمة
sudo systemctl status caddy
# تنزيل أحدث إصدار
VERSION=$(curl -s https://api.github.com/repos/caddyserver/caddy/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -L "https://github.com/caddyserver/caddy/releases/download/${VERSION}/caddy_${VERSION#v}_linux_amd64.tar.gz" -o caddy.tar.gz
# فك الضغط والتثبيت
tar -xzf caddy.tar.gz
sudo mv caddy /usr/local/bin/
sudo chmod +x /usr/local/bin/caddy
# التحقق من الإصدار
caddy version
# تثبيت xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
# البناء مع وحدات إضافية
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--with github.com/greenpau/caddy-security
# موقع واحد
example.com {
root * /var/www/html
file_server
}
# مواقع متعددة
example.com {
respond "مرحباً example.com!"
}
api.example.com {
reverse_proxy localhost:3000
}
# الإعدادات العامة في بداية Caddyfile
{
# منفذ Admin API
admin localhost:2019
# البريد الإلكتروني (لـ Let's Encrypt)
email admin@example.com
# خادم ACME (staging للاختبار)
# acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
# منفذ HTTP
http_port 80
# منفذ HTTPS
https_port 443
# تنسيق السجل
log {
output file /var/log/caddy/access.log
format json
}
}
يحصل Caddy تلقائياً على شهادة Let's Encrypt لنطاقك:
# فقط اكتب اسم النطاق - HTTPS تلقائي!
example.com {
root * /var/www/html
file_server
encode gzip
}
# إعادة توجيه www
www.example.com {
redir https://example.com{uri} permanent
}
# شهادة Wildcard (تتطلب DNS challenge)
*.example.com {
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
@api host api.example.com
handle @api {
reverse_proxy localhost:3000
}
}
يجدد Caddy الشهادات تلقائياً. لا يلزم تدخل يدوي. تُخزَّن الشهادات في ~/.local/share/caddy/ أو /var/lib/caddy/.
app.example.com {
reverse_proxy localhost:3000
}
# عدة upstreams (موازنة التحميل)
api.example.com {
reverse_proxy {
to localhost:3001 localhost:3002 localhost:3003
lb_policy round_robin
health_uri /health
health_interval 30s
health_timeout 5s
}
}
app.example.com {
reverse_proxy localhost:3000 {
# إعادة توجيه الترويسات
header_up Host {upstream_hostport}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# المهل الزمنية
transport http {
dial_timeout 5s
response_header_timeout 30s
}
# إعادة المحاولة
lb_retries 3
lb_try_duration 5s
}
# ترويسات الأمان
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy strict-origin-when-cross-origin
-Server
}
}
static.example.com {
root * /var/www/static
file_server {
# قائمة المجلدات
browse
# إخفاء الملفات المخفية
hide .git .env
}
encode gzip zstd
# ترويسات التخزين المؤقت
header /assets/* Cache-Control "public, max-age=31536000, immutable"
header /*.html Cache-Control "no-cache"
# صفحات الخطأ
handle_errors {
rewrite * /errors/{err.status_code}.html
file_server
}
}
# SPA (تطبيق صفحة واحدة)
app.example.com {
root * /var/www/app
encode gzip
try_files {path} /index.html
file_server
}
php.example.com {
root * /var/www/php
encode gzip
# توجيه ملفات PHP إلى PHP-FPM
php_fastcgi unix//run/php/php8.2-fpm.sock
# أو عبر TCP
# php_fastcgi localhost:9000
file_server
# لـ WordPress
@notStatic {
not path /wp-content/* /wp-includes/*
not file
}
rewrite @notStatic /index.php
}
# docker-compose.yml
services:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
- ./html:/var/www/html:ro
environment:
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
app:
build: ./app
expose:
- "3000"
volumes:
caddy_data:
caddy_config:
# Docker Caddyfile
example.com {
reverse_proxy app:3000
}
يدعم Caddy التكوين الديناميكي عبر REST API:
# عرض التكوين الحالي
curl http://localhost:2019/config/
# تحديث التكوين
curl -X POST http://localhost:2019/load \
-H "Content-Type: application/json" \
-d @caddy.json
# إعادة تحميل Caddy (بدون توقف)
caddy reload --config /etc/caddy/Caddyfile
# التحقق من التكوين
caddy validate --config /etc/caddy/Caddyfile
# تنسيق Caddyfile
caddy fmt --overwrite /etc/caddy/Caddyfile
{
servers {
max_header_size 1MB
timeouts {
read_body 10s
read_header 10s
write 30s
idle 2m
}
}
}
example.com {
# الضغط
encode {
gzip 6
zstd
minimum_length 1024
}
reverse_proxy localhost:3000
}
يلبي Caddy متطلبات خادم الويب الحديث بإدارة HTTPS التلقائية والتكوين البسيط. يتطلب تكويناً أقل بكثير مقارنة بـ Nginx أو Apache مع تقديم جميع الميزات اللازمة لبيئات الإنتاج. إنه الخيار المثالي خاصة لمن يريد أتمتة إدارة شهادات Let's Encrypt.
يخزن Caddy الشهادات افتراضياً في '/var/lib/caddy/.local/share/caddy/' على Linux. يُنشأ هذا المجلد تلقائياً عند التشغيل كخدمة systemd. عند استخدام Docker، تحتاج إلى تثبيت حجم 'caddy_data' بشكل دائم، وإلا سيُطلب شهادة جديدة عند كل إعادة تشغيل.
يطبق Let's Encrypt حداً بـ 5 شهادات أسبوعياً لنفس النطاق. أثناء الاختبار، استخدم بيئة staging مع 'acme_ca https://acme-staging-v02.api.letsencrypt.org/directory'. تُعلَّم شهادات staging كغير موثوقة من المتصفحات لكن لا يوجد حد للمعدل. أزل سطر staging عند التبديل إلى الإنتاج.
يوفر Caddy إدارة HTTPS تلقائية وتكويناً أبسط بكثير. يمتلك Nginx خيارات تخصيص أكثر ودعم مجتمعي أوسع. Caddy مكتوب بـ Go ويأتي مع دعم HTTP/3 افتراضياً. Nginx مكتوب بـ C وقد يؤدي أداءً أفضل تحت حركة مرور عالية جداً.
يمكنك إعادة التحميل بدون توقف باستخدام 'sudo systemctl reload caddy' أو 'caddy reload --config /etc/caddy/Caddyfile'. يُنصح بالتحقق من التكوين أولاً مع 'caddy validate'. إذا تم تحميل تكوين غير صالح، يعود Caddy إلى التكوين السابق.
تتطلب شهادات Wildcard DNS challenge. إذا كنت تستخدم Cloudflare، أضف وحدة 'caddy-dns/cloudflare' وعيّن رمز API الخاص بك. استخدم التوجيه 'tls { dns cloudflare {env.CF_API_TOKEN} }' في Caddyfile. قد تحتاج إلى إنشاء بناء مخصص مع xcaddy يتضمن وحدة مزود DNS.
افتراضياً، يستمع Admin API فقط على localhost:2019. لا تفتح هذا المنفذ للخارج في الإنتاج. إذا كانت الإدارة عن بُعد مطلوبة، استخدم نفق SSH بدلاً من 'admin 0.0.0.0:2019'. بديلاً، يمكنك تعطيل API بالكامل مع 'admin off'.
تعريف وإدارة التطبيقات متعددة الحاويات باستخدام Docker Compose: تبعيات الخدمات، متغيرات البيئة، فحوصات الصحة، التوسع والنشر في بيئة الإنتاج. دليل شامل.
إنشاء CI/CD pipelines مع GitHub Actions: بناء ونشر Docker، النشر على الخادم عبر SSH، أتمتة الاختبارات، إدارة الأسرار وتحسين سير العمل.
تثبيت Ansible، ملف الجرد، كتابة playbook، هيكل الأدوار، المتغيرات، vault المشفر، أوامر ad-hoc وأتمتة تكوين الخادم. دليل خطوة بخطوة.