Docker Compose یک استک چندکانتینری را در یک فایل توصیف میکند و آن را با یک فرمان اجرا میکند. این راهنمای استقرار است؛ اگر هنوز نکردهای اول Docker را نصب کن. برای یک استک ویژهٔ عامل هوش مصنوعی (عامل + پایگاه دادهٔ برداری + Redis) docker-compose برای عاملهای هوش مصنوعی را ببین.
۱. یک استک: اپ + پایگاه داده + reverse proxy
# /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
}
۲. بالا بیاورش
cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app
restart: unless-stopped روی هر سرویس + Docker فعالشده هنگام بوت = استک خودش پس از ریبوت برمیگردد.
۳. فرمانهای روزمره
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، پرداخت با ارز دیجیتال.
نظرات
هنوز نظری نیست. اولین نفر باشید.