mirror of
https://github.com/yogeshojha/rengine.git
synced 2026-10-20 07:11:28 +02:00
Proxy observations are written as endpoint rows with source proxy into the target's covering scan; a target without a census scan gets a Browsing run, and finalize replays recorded shapes into a new census scan. "Seen by a scan" is host plus path shape (new endpoints.shape column, backfilled), with parameter differences reported as their own notice and unseen claimed only when a settled scan covers the target. Removed the scan trigger, sessions and coverage surfaces. The jar is served from binaries/, the setup dialog derives the endpoint from the browser origin, scans dispatch one run per target with the chosen scan context, and manual findings mask credential headers. Endpoints page gains Browsed and Not browsed filters; the Burp tab gains a host line, a notices table with Open in reNgine, and a report dialog with notes and a result. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMmqqNaMMjCJWzGG49Xc1i
235 lines
6.4 KiB
YAML
235 lines
6.4 KiB
YAML
services:
|
|
db:
|
|
image: postgres:16-alpine
|
|
shm_size: ${POSTGRES_SHM_SIZE:-1gb}
|
|
env_file:
|
|
- .env
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
ports:
|
|
- "5432:5432"
|
|
command: >
|
|
postgres
|
|
-c shared_buffers=${POSTGRES_SHARED_BUFFERS:-2GB}
|
|
-c effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-6GB}
|
|
-c work_mem=${POSTGRES_WORK_MEM:-32MB}
|
|
-c maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-512MB}
|
|
-c random_page_cost=1.1
|
|
-c effective_io_concurrency=200
|
|
-c max_parallel_workers_per_gather=4
|
|
-c jit=off
|
|
-c max_connections=${POSTGRES_MAX_CONNECTIONS:-150}
|
|
-c shared_preload_libraries=pg_stat_statements
|
|
-c pg_stat_statements.max=5000
|
|
-c pg_stat_statements.track=top
|
|
-c track_io_timing=on
|
|
-c log_min_duration_statement=${POSTGRES_LOG_MIN_DURATION:-2000}
|
|
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
|
|
- ./reports:/app/reports
|
|
- ./interest:/app/interest
|
|
- ./mcp:/app/mcp
|
|
- ./connectors:/app/connectors
|
|
- ./toolbox:/app/toolbox
|
|
- ./binaries:/app/binaries:ro
|
|
- ./alembic:/app/alembic
|
|
- ./alembic.ini:/app/alembic.ini
|
|
- ./tests:/app/tests
|
|
- ./pyproject.toml:/app/pyproject.toml
|
|
# read-only, so the tests can check a frontend mirror has not drifted
|
|
- ./frontend/src/lib/config:/app/frontend-config:ro
|
|
- ./scan_media:/app/scan_media
|
|
- vuln_templates:/app/vuln-templates
|
|
- wordlists:/app/wordlists
|
|
- reports_out:/app/reports-out
|
|
- report_fonts:/app/report-fonts
|
|
- /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:
|
|
init: true
|
|
build:
|
|
context: .
|
|
dockerfile: worker/Dockerfile
|
|
target: development
|
|
volumes:
|
|
- ./worker/app:/app/app
|
|
- ./shared:/app/shared
|
|
- ./tools:/app/tools
|
|
- ./stages:/app/stages
|
|
- ./reports:/app/reports
|
|
- ./interest:/app/interest
|
|
- ./toolbox:/app/toolbox
|
|
- ./scan_media:/app/scan_media
|
|
- vuln_templates:/app/vuln-templates
|
|
- wordlists:/app/wordlists
|
|
- reports_out:/app/reports-out
|
|
- report_fonts:/app/report-fonts
|
|
- /app/shared/build
|
|
- /app/shared/rengine_shared.egg-info
|
|
- /app/tools/build
|
|
- /app/tools/rengine_tools.egg-info
|
|
env_file:
|
|
- .env
|
|
# one scan now holds up to 5 slots at its widest — 3 gating stages plus the 2 that
|
|
# run beside them — so 8 covered a single scan and queued the moment two overlapped
|
|
command: >
|
|
uv run celery -A app.celery worker
|
|
--loglevel=DEBUG
|
|
--concurrency=${CELERY_SCAN_CONCURRENCY:-12}
|
|
--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:
|
|
init: true
|
|
build:
|
|
context: .
|
|
dockerfile: worker/Dockerfile
|
|
target: development
|
|
volumes:
|
|
- ./worker/app:/app/app
|
|
- ./shared:/app/shared
|
|
- ./tools:/app/tools
|
|
- ./stages:/app/stages
|
|
- ./reports:/app/reports
|
|
- ./interest:/app/interest
|
|
- ./toolbox:/app/toolbox
|
|
- ./scan_media:/app/scan_media
|
|
- vuln_templates:/app/vuln-templates
|
|
- wordlists:/app/wordlists
|
|
- reports_out:/app/reports-out
|
|
- report_fonts:/app/report-fonts
|
|
- /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
|
|
- ./reports:/app/reports
|
|
- ./interest:/app/interest
|
|
- ./toolbox:/app/toolbox
|
|
- ./scan_media:/app/scan_media
|
|
- vuln_templates:/app/vuln-templates
|
|
- wordlists:/app/wordlists
|
|
- reports_out:/app/reports-out
|
|
- report_fonts:/app/report-fonts
|
|
- /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:
|
|
wordlists:
|
|
reports_out:
|
|
report_fonts:
|