71 lines
2.5 KiB
Bash
71 lines
2.5 KiB
Bash
# Servidor
|
|
SERVER_HOST=127.0.0.1
|
|
SERVER_PORT=8080
|
|
FRONTEND_ORIGIN=http://localhost:5173
|
|
DATABASE_URL=postgres://leads:leads@127.0.0.1:5432/leads_extractor
|
|
MEDIA_DIR=../data/media
|
|
RUST_LOG=backend=info
|
|
|
|
# Autenticação. Defina uma senha forte no backend/.env local.
|
|
AUTH_USERNAME=
|
|
AUTH_PASSWORD=
|
|
AUTH_SESSION_TTL_SECS=43200
|
|
AUTH_COOKIE_SECURE=false
|
|
AUTH_COOKIE_SAME_SITE=strict
|
|
|
|
# Rate limiting (proteção contra abuso/DoS/força bruta), aplicado por IP.
|
|
# Limite geral: rajada de RATE_LIMIT_BURST_SIZE requisições, repondo 1 a cada
|
|
# RATE_LIMIT_PERIOD_MS. Padrão: rajada de 120, repõe 1 a cada 200ms (~5 req/s
|
|
# sustentado por IP).
|
|
RATE_LIMIT_ENABLED=true
|
|
RATE_LIMIT_BURST_SIZE=120
|
|
RATE_LIMIT_PERIOD_MS=200
|
|
# Limite adicional e mais restrito, aplicado somente a /api/auth/login, para
|
|
# dificultar força bruta de credenciais. Padrão: rajada de 5, repõe 1 a cada 30s.
|
|
RATE_LIMIT_LOGIN_BURST_SIZE=5
|
|
RATE_LIMIT_LOGIN_PERIOD_SECS=30
|
|
|
|
# OpenAI
|
|
OPENAI_API_KEY=
|
|
OPENAI_MODEL=gpt-5.6-luna
|
|
OPENAI_BASE_URL=https://api.openai.com/v1
|
|
OPENAI_TIMEOUT_SECS=120
|
|
OPENAI_MAX_RETRIES=6
|
|
# Custo em dólares por 1.000.000 de tokens (consulte a tabela de preços do modelo).
|
|
OPENAI_INPUT_COST_PER_1M_USD=0.15
|
|
OPENAI_OUTPUT_COST_PER_1M_USD=0.60
|
|
# Teto de gasto mensal em dólares. Ao ser atingido, novas execuções são
|
|
# bloqueadas e execuções em andamento são canceladas automaticamente.
|
|
OPENAI_MONTHLY_BUDGET_USD=50.00
|
|
|
|
# DataImpulse. Nunca comite valores reais.
|
|
DATAIMPULSE_PROXY_ENABLED=true
|
|
DATAIMPULSE_PROXY_SCHEME=http
|
|
DATAIMPULSE_PROXY_HOST=gw.dataimpulse.com
|
|
DATAIMPULSE_PROXY_PORT=823
|
|
DATAIMPULSE_PROXY_USERNAME=
|
|
DATAIMPULSE_PROXY_PASSWORD=
|
|
DATAIMPULSE_PROXY_COUNTRY=br
|
|
# O gateway sempre opera com IP rotativo; sessão fixa não é suportada.
|
|
|
|
# Concorrência, retry e limites de segurança operacional
|
|
WORKER_CONCURRENCY=8
|
|
BROWSER_CONCURRENCY=4
|
|
JOB_POLL_INTERVAL_MS=750
|
|
REQUEST_TIMEOUT_SECS=45
|
|
BROWSER_TIMEOUT_SECS=75
|
|
# Use true somente em container isolado que não ofereça user namespaces.
|
|
BROWSER_NO_SANDBOX=false
|
|
# Pacing do Chromium: cada sessão usa um perfil limpo, aquece a origem e
|
|
# espera um intervalo aleatório. As macro-pausas evitam rajadas em crawls longos.
|
|
BROWSER_MIN_NAVIGATION_DELAY_MS=2500
|
|
BROWSER_MAX_NAVIGATION_DELAY_MS=15000
|
|
BROWSER_MACRO_PAUSE_EVERY_MIN=15
|
|
BROWSER_MACRO_PAUSE_EVERY_MAX=20
|
|
BROWSER_MACRO_PAUSE_MIN_SECS=30
|
|
BROWSER_MACRO_PAUSE_MAX_SECS=90
|
|
CRAWL_MAX_DEPTH=5
|
|
CRAWL_MAX_PAGES_PER_INTERVIEWEE=250
|
|
# 0 processa todos; use 100 para uma execução externa controlada.
|
|
MAX_INTERVIEWEES_PER_RUN=0
|