docker compose for django
version: '3.9'
services:
web_shop:
build: .
command: >
sh -c "
python manage.py makemigrations &&
python manage.py migrate --noinput &&
python manage.py collectstatic --noinput &&
daphne -b 0.0.0.0 -p 8000 backend.asgi:application
"
healthcheck:
test: ["CMD-SHELL", "curl -fs http://localhost:8000/ || exit 1"]
interval: 10s
timeout: 3s
retries: 5
start_period: 20s
expose:
- "8000"
container_name: django_app_shop
volumes:
- ./src:/app
- static_volume:/app/staticfiles
- media_volume:/app/media
depends_on:
pgbouncer_shop:
condition: service_healthy
rabbitmq_shop:
condition: service_healthy
redis_cache_shop:
condition: service_healthy
environment:
VARNISH_HOST: varnish_shop
VARNISH_PORT: 80
env_file:
- .env
varnish_shop:
image: varnish:7-alpine
container_name: varnish_shop
ports:
- "80:80"
environment:
VARNISH_SIZE: 256M
depends_on:
nginx_shop:
condition: service_started
volumes:
- ./varnish/default.vcl:/etc/varnish/default.vcl:ro
celery_worker_shop:
build: .
container_name: celery_worker_shop
command: celery -A backend worker -l info --concurrency=4
environment:
CELERY_BROKER_URL: amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq_shop:5672//
CHANNEL_RABBITMQ: amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq_shop:5672/
volumes:
- ./src:/app
env_file: .env
depends_on:
web_shop:
condition: service_healthy
rabbitmq_shop:
condition: service_healthy
celery_beat_shop:
build: .
container_name: celery_beat_shop
command: celery -A backend beat -l info
environment:
CELERY_BROKER_URL: amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq_shop:5672//
CHANNEL_RABBITMQ: amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq_shop:5672/
volumes:
- ./src:/app
env_file: .env
depends_on:
web_shop:
condition: service_healthy
rabbitmq_shop:
condition: service_healthy
redis_cache_shop:
image: redis:7
container_name: redis_cache_shop
command:
- redis-server
- --maxmemory
- 256mb
- --maxmemory-policy
- allkeys-lru
expose:
- "6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
retries: 5
rabbitmq_shop:
image: rabbitmq:3-management
container_name: rabbitmq_shop
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 10s
timeout: 5s
retries: 5
env_file:
- .env
nginx_shop:
image: nginx:alpine
container_name: nginx_shop
expose:
- "80"
volumes:
- ./config/nginx/django.conf:/etc/nginx/conf.d/default.conf:ro
- static_volume:/staticfiles:ro
- media_volume:/media:ro
depends_on:
web_shop:
condition: service_healthy
db_shop:
image: postgres:17
container_name: postgres_db_shop
volumes:
- postgres_db_shop:/var/lib/postgresql/data/
env_file:
- .env
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
start_period: 30s
timeout: 10s
retries: 5
pgbouncer_shop:
image: edoburu/pgbouncer:latest
container_name: pgbouncer_shop
restart: unless-stopped
depends_on:
db_shop:
condition: service_healthy
ports:
- "6432:6432"
env_file:
- .env
environment:
DB_HOST: db_shop
DB_PORT: 5432
DB_USER: ${POSTGRES_USER}
DB_PASSWORD: ${POSTGRES_PASSWORD}
POOL_MODE: transaction
MAX_CLIENT_CONN: 200
DEFAULT_POOL_SIZE: 20
IGNORE_STARTUP_PARAMETERS: "extra_float_digits"
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -p 6432 -U ${POSTGRES_USER}"]
interval: 10s
retries: 5
volumes:
- ./pgbouncer:/etc/pgbouncer
volumes:
postgres_db_shop:
static_volume:
media_volume: