# Website Analyzer - Docker Compose Configuration # This file orchestrates all services required for the application version: '3.9' services: # ========================================================================== # PostgreSQL Database # ========================================================================== db: image: postgres:16-alpine container_name: analyzer_db restart: unless-stopped environment: POSTGRES_USER: analyzer POSTGRES_PASSWORD: analyzer_password POSTGRES_DB: website_analyzer volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U analyzer -d website_analyzer"] interval: 10s timeout: 5s retries: 5 # ========================================================================== # Redis - Message Broker & Cache # ========================================================================== redis: image: redis:7-alpine container_name: analyzer_redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # ========================================================================== # Django Web Application # ========================================================================== web: build: context: ./backend dockerfile: Dockerfile container_name: analyzer_web restart: unless-stopped command: > sh -c "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn core.wsgi:application --bind 0.0.0.0:8000 --workers 4 --threads 2" volumes: - ./backend:/app - static_volume:/app/staticfiles ports: - "8000:8000" env_file: - ./backend/.env depends_on: db: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/health/"] interval: 30s timeout: 10s retries: 3 # ========================================================================== # Celery Worker - Background Task Processing # ========================================================================== celery_worker: build: context: ./backend dockerfile: Dockerfile container_name: analyzer_celery_worker restart: unless-stopped command: celery -A core worker -l INFO --concurrency=2 volumes: - ./backend:/app env_file: - ./backend/.env depends_on: - db - redis - web # ========================================================================== # Celery Beat - Scheduled Tasks (Optional) # ========================================================================== celery_beat: build: context: ./backend dockerfile: Dockerfile container_name: analyzer_celery_beat restart: unless-stopped command: celery -A core beat -l INFO volumes: - ./backend:/app env_file: - ./backend/.env depends_on: - db - redis - celery_worker # ========================================================================== # OWASP ZAP - Security Scanner # ========================================================================== zap: image: ghcr.io/zaproxy/zaproxy:stable container_name: analyzer_zap restart: unless-stopped command: zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.key=zap-api-key-change-me -config api.addrs.addr.name=.* -config api.addrs.addr.regex=true ports: - "8081:8080" volumes: - zap_data:/home/zap/.ZAP healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/JSON/core/view/version/?apikey=zap-api-key-change-me"] interval: 30s timeout: 10s retries: 5 # ========================================================================== # Lighthouse Scanner Service (Node.js) # ========================================================================== lighthouse: build: context: ./lighthouse dockerfile: Dockerfile container_name: analyzer_lighthouse restart: unless-stopped ports: - "3001:3001" volumes: - lighthouse_reports:/app/reports healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] interval: 30s timeout: 10s retries: 3 volumes: postgres_data: redis_data: static_volume: zap_data: lighthouse_reports: networks: default: name: analyzer_network