services: db: image: postgres:16-alpine env_file: - .env volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U rengine"] interval: 5s timeout: 5s retries: 5 redis: image: redis:8-alpine ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 command: > redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru api: build: context: . dockerfile: api/Dockerfile target: development volumes: - ./api/app:/app/app - ./shared:/app/shared - ./tools:/app/tools - ./stages:/app/stages - ./alembic:/app/alembic - ./alembic.ini:/app/alembic.ini - ./scan_media:/app/scan_media - vuln_templates:/app/vuln-templates - /app/shared/build - /app/shared/rengine_shared.egg-info - /app/tools/build - /app/tools/rengine_tools.egg-info ports: - "8000:8000" env_file: - .env environment: - WATCHFILES_FORCE_POLLING=true depends_on: db: condition: service_healthy redis: condition: service_healthy # default workers for handling regular tasks like imports, whois etc worker-default: build: context: . dockerfile: worker/Dockerfile target: development volumes: - ./worker/app:/app/app - ./shared:/app/shared - ./tools:/app/tools - ./stages:/app/stages - ./scan_media:/app/scan_media - vuln_templates:/app/vuln-templates - /app/shared/build - /app/shared/rengine_shared.egg-info - /app/tools/build - /app/tools/rengine_tools.egg-info env_file: - .env command: > uv run celery -A app.celery worker --loglevel=DEBUG --concurrency=${CELERY_DEFAULT_CONCURRENCY:-4} --queues=critical,default,scans --hostname=worker-default@%h --max-tasks-per-child=100 depends_on: db: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD-SHELL", "/app/.venv/bin/celery -A app.celery inspect ping -d worker-default@$$HOSTNAME || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s # beat scheduler: emits the schedule tick that fires due scan schedules worker-beat: build: context: . dockerfile: worker/Dockerfile target: development volumes: - ./worker/app:/app/app - ./shared:/app/shared - ./tools:/app/tools - ./stages:/app/stages - ./scan_media:/app/scan_media - vuln_templates:/app/vuln-templates - /app/shared/build - /app/shared/rengine_shared.egg-info - /app/tools/build - /app/tools/rengine_tools.egg-info env_file: - .env command: > uv run celery -A app.celery beat --loglevel=INFO --schedule=/tmp/celerybeat-schedule depends_on: db: condition: service_healthy redis: condition: service_healthy flower: build: context: . dockerfile: worker/Dockerfile target: development volumes: - ./worker/app:/app/app - ./shared:/app/shared - ./tools:/app/tools - ./stages:/app/stages - ./scan_media:/app/scan_media - vuln_templates:/app/vuln-templates - /app/shared/build - /app/shared/rengine_shared.egg-info - /app/tools/build - /app/tools/rengine_tools.egg-info ports: - "5555:5555" env_file: - .env environment: - FLOWER_UNAUTHENTICATED_API=true command: > uv run celery -A app.celery flower --port=5555 --broker=redis://${REDIS_HOST:-redis}:${REDIS_PORT:-6379}/${REDIS_DB:-0} --basic-auth=${FLOWER_USER:-admin}:${FLOWER_PASSWORD:-admin} depends_on: redis: condition: service_healthy frontend: build: context: . dockerfile: frontend/Dockerfile.dev volumes: - ./frontend/src:/app/src - ./frontend/vite.config.ts:/app/vite.config.ts ports: - "5173:5173" environment: - NODE_ENV=development depends_on: - api volumes: postgres_data: redis_data: celery_beat_data: vuln_templates: