يصف Docker Compose حزمة متعددة الحاويات في ملف واحد ويشغّلها بأمر واحد. هذا دليل النشر؛ أولاً ثبّت Docker إن لم تكن قد فعلت. لحزمة خاصة بوكلاء الذكاء الاصطناعي (وكيل + قاعدة بيانات متجهات + Redis) راجع docker-compose لوكلاء الذكاء الاصطناعي.
1. حزمة: تطبيق + قاعدة بيانات + وكيل عكسي
# /opt/stack/docker-compose.yml
services:
app:
image: your/app:latest
restart: unless-stopped
env_file: [.env]
depends_on: [db]
# no ports: — reached only through the proxy below
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes: ["pg:/var/lib/postgresql/data"] # internal only
caddy: # HTTPS automatically
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443"] # the only public entrypoint
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
volumes: { pg: {}, caddy_data: {} }
تعيش الأسرار في .env، لا في ملف compose أبداً:
# /opt/stack/.env (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string
Caddyfile بسيط يوكّل نطاقك إلى التطبيق ويجلب HTTPS من تلقاء نفسه:
app.yourdomain.com {
reverse_proxy app:8080
}
2. شغّلها
cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app
restart: unless-stopped على كل خدمة + تفعيل Docker عند الإقلاع = تعود الحزمة من تلقاء نفسها بعد إعادة التشغيل.
3. أوامر يومية
docker compose pull && docker compose up -d # update images
docker compose down # stop the stack
docker compose restart app # restart one service
الجزء الذي يخطئ فيه الناس: المنافذ المكشوفة
ينشر Docker المنافذ عبر iptables، لذا فحاوية بها ports: ["5432:5432"] يمكن الوصول إليها من الإنترنت حتى خلف جدار حماية UFW ظننته مغلقاً. انشر فقط نقطة الدخول العامة (الوكيل على 80/443)؛ أبقِ قواعد البيانات والكاش على شبكة compose أو مربوطة بـ 127.0.0.1. كل ما يخدم حركة ويب يحتاج خطة IP مخصّص؛ اقرِنه بـ جدار حماية UFW.
لحزمة كاملة خلف IP واحد، راجع استضافة عدة خدمات ذاتياً. root في نحو دقيقة، NVMe، بلا KYC، والدفع بالعملات المشفّرة.
التعليقات
لا تعليقات بعد. كن الأول.