docker compose for django

Django -- Posted on Aug. 14, 2025

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:
                  
   
            

Related Posts