لماذا Docker Compose؟
عندما تبدأ الاستضافة الذاتية، تجد نفسك سريعاً أمام عشرات الخدمات: Nextcloud للملفات، Immich للصور، وUptime Kuma للمراقبة. تشغيل كل خدمة يدوياً بأمر docker run طويل يصبح غير قابل للإدارة خلال أسبوع. يعطيك Docker Compose ملفاً واحداً يصف كل شيء: الحاويات، والشبكات، والتخزين، ومتغيرات البيئة.
في هذا الشرح نبني مجموعة خدمات صغيرة على سيرفر منزلي يعمل بنظام Ubuntu Server 24.04 LTS، ونتحقق من أن كل خدمة تعمل قبل الانتقال إلى التالية.
المتطلبات
- جهاز يعمل بلينكس (جربنا على Ubuntu Server 24.04 وDebian 12) بذاكرة 4 GB على الأقل.
- صلاحية
sudoواتصال بالإنترنت. - اسم نطاق اختياري إن أردت الوصول من خارج الشبكة المنزلية.
- نسخة احتياطية حديثة لأي بيانات موجودة على الجهاز.
الخطوة 1: تثبيت Docker
ثبّت Docker من المستودع الرسمي بدلاً من حزم التوزيعة؛ فهي غالباً أقدم. نفّذ الأوامر التالية على الجهاز:
# إزالة أي نسخ قديمة
sudo apt-get remove -y docker docker-engine docker.io containerd runc
# إضافة مفتاح المستودع الرسمي
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# إضافة المستودع وتثبيت الحزم
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# تشغيل Docker بدون sudo (يتطلب تسجيل خروج ودخول)
sudo usermod -aG docker "$USER"تحقق من التثبيت:
docker --version
docker compose versionالخطوة 2: تنظيم المجلدات
اعتمد بنية ثابتة منذ اليوم الأول. كل خدمة في مجلد، وكل مجلد يحوي ملف compose.yaml وملف .env ومجلد data:
mkdir -p ~/homelab/{proxy,nextcloud,immich,monitoring}
tree -L 2 ~/homelabملف البيئة
لا تكتب كلمات المرور داخل compose.yaml. ضعها في .env واستثنِ الملف من أي مستودع Git:
# ~/homelab/nextcloud/.env
MYSQL_ROOT_PASSWORD=غيّرني-إلى-كلمة-قوية
MYSQL_PASSWORD=غيّرني-أيضاً
NEXTCLOUD_TRUSTED_DOMAINS=cloud.home.arpaالخطوة 3: أول ملف Compose
هذا مثال لخدمة Nextcloud مع قاعدة بيانات MariaDB وذاكرة Redis:
services:
db:
image: mariadb:11
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
volumes:
- ./data/db:/var/lib/mysql
redis:
image: redis:7-alpine
restart: unless-stopped
app:
image: nextcloud:30
restart: unless-stopped
ports:
- "8080:80"
depends_on: [db, redis]
environment:
MYSQL_HOST: db
REDIS_HOST: redis
NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_TRUSTED_DOMAINS}
volumes:
- ./data/app:/var/www/html./data هو مكان كل ملفاتك. لا تنفّذ docker compose down -v أبداً على خدمة فيها بيانات حقيقية؛ الخيار -v يحذف وحدات التخزين المسماة.شغّل الخدمة وراقب السجلات:
cd ~/homelab/nextcloud
docker compose up -d
docker compose logs -f appالخطوة 4: وكيل عكسي بشهادات تلقائية
بدلاً من تذكّر المنافذ، ضع Caddy أمام كل الخدمات. مثال لملف Caddyfile:
cloud.example.com {
reverse_proxy nextcloud-app-1:80
encode gzip
}
photos.example.com {
reverse_proxy immich-server:2283
}وإن كنت تفضّل Nginx:
server {
listen 443 ssl http2;
server_name cloud.example.com;
ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
client_max_body_size 10G;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
}مقارنة سريعة: خيارات الوكيل العكسي
جدول عريض لاختبار التمرير داخل الجدول دون تمرير الصفحة:
| الأداة | الترخيص | شهادات تلقائية | واجهة رسومية | ملف الإعداد | الذاكرة التقريبية | مناسب لـ |
|---|---|---|---|---|---|---|
| Caddy | Apache-2.0 | نعم، مدمجة | لا | Caddyfile | ~40 MB | البداية السريعة |
| Nginx | BSD-2 | عبر certbot | لا | nginx.conf | ~10 MB | التحكم الدقيق |
| Traefik | MIT | نعم، مدمجة | لوحة متابعة | YAML / labels | ~80 MB | بيئات Docker الكبيرة |
| Nginx Proxy Manager | MIT | نعم | نعم | قاعدة بيانات | ~150 MB | من يفضّل الواجهات |
التحقق من النجاح
- افتح
http://IP-السيرفر:8080وأكمل معالج إعداد Nextcloud. - نفّذ
docker compose psوتأكد أن الحالةrunning (healthy)لكل الحاويات. - أعد تشغيل الجهاز وتحقق أن الخدمات عادت تلقائياً بفضل
restart: unless-stopped.

الأخطاء الشائعة
- permission denied على المقبس: لم تسجّل خروجاً بعد إضافة مستخدمك إلى مجموعة docker.
- Nextcloud يرفض النطاق: أضف النطاق إلى
NEXTCLOUD_TRUSTED_DOMAINSأو عبرocc config:system:set trusted_domains. - رفع الملفات الكبيرة يفشل: ارفع
client_max_body_sizeفي الوكيل العكسي.
ابدأ بخدمة واحدة، وثّق ما فعلت، ثم أضف التالية. الاستضافة الذاتية ماراثون لا سباق سرعة.