version: "3.9" services: db: image: postgres:16-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: djangoforge POSTGRES_USER: djangoforge POSTGRES_PASSWORD: djangoforge healthcheck: test: ["CMD-SHELL", "pg_isready -U djangoforge"] interval: 10s timeout: 5s retries: 5 ports: - "5432:5432" redis: image: redis:7-alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 ports: - "6379:6379" web: build: . command: > sh -c "python manage.py migrate --no-input && python manage.py collectstatic --no-input && gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 2 --reload" volumes: - .:/app - static_files:/app/staticfiles - media_files:/app/mediafiles ports: - "8000:8000" env_file: - .env environment: - DJANGO_SETTINGS_MODULE=config.settings.local depends_on: db: condition: service_healthy redis: condition: service_healthy worker: build: . command: celery -A config worker -l info --concurrency 2 volumes: - .:/app env_file: - .env environment: - DJANGO_SETTINGS_MODULE=config.settings.local depends_on: db: condition: service_healthy redis: condition: service_healthy beat: build: . command: celery -A config beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler volumes: - .:/app env_file: - .env environment: - DJANGO_SETTINGS_MODULE=config.settings.local depends_on: db: condition: service_healthy redis: condition: service_healthy flower: build: . command: celery -A config flower --port=5555 volumes: - .:/app ports: - "5555:5555" env_file: - .env environment: - DJANGO_SETTINGS_MODULE=config.settings.local depends_on: - redis volumes: postgres_data: static_files: media_files: