پیشنیاز: Docker Engine و افزونهی Compose نصب باشد (نصب Docker).
۱. ساختار پروژه
mkdir -p ~/stacks/app && cd ~/stacks/appیک فایل .env برای رمزها (این فایل را در git قرار ندهید):
POSTGRES_PASSWORD=change-me-strong۲. فایل compose
# compose.yaml
services:
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_DB: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
retries: 5
cache:
image: redis:7-alpine
restart: unless-stopped
web:
image: ghcr.io/example/app:1.4.2
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app
REDIS_URL: redis://cache:6379
ports:
- "127.0.0.1:8080:8080"
volumes:
db-data:نکتهها:
- پایگاه داده و کش هیچ پورتی منتشر نکردهاند؛ فقط از داخل شبکهی compose در دسترساند.
- پورت برنامه فقط روی
127.0.0.1باز است. دسترسی بیرونی را از طریق Nginx (reverse proxy) بدهید. پورتهای منتشرشده در Docker قوانین UFW را دور میزنند. - همیشه نسخهی مشخص ایمیج را بنویسید، نه
latest.
۳. اجرا و مدیریت
docker compose up -d
docker compose ps
docker compose logs -f webبهروزرسانی به نسخهی جدید ایمیج:
docker compose pull
docker compose up -d
docker image prune -f۴. پشتیبانگیری از پایگاه داده
docker compose exec -T db pg_dump -U app -Fc app > app-$(date +%F).dump۵. توقف کامل
docker compose down # volumeها باقی میمانند
docker compose down -v # volumeها هم پاک میشوند (داده از بین میرود)