agrovision / .env.example
alexp97's picture
feat(seguridad): rate limiting en /api + cabeceras de hardening (Fase 10)
7afd4d9
Raw
History Blame Contribute Delete
6.18 kB
# ===================================================================================
# AgroVisión — variables de entorno (PLANTILLA)
# ===================================================================================
# Copia este archivo a `.env` para desarrollo local: cp .env.example .env
#
# REGLAS DE SEGURIDAD:
# - `.env.example` (versionado) lleva SOLO placeholders vacíos. NUNCA secretos reales.
# - `.env` (en .gitignore) lleva tus valores reales para local. No se versiona.
# - En PRODUCCIÓN, define los secretos en el panel de cada plataforma
# (Render, ShinyApps.io, Supabase), no en archivos.
# ===================================================================================
# -----------------------------------------------------------------------------------
# 1) General
# -----------------------------------------------------------------------------------
APP_ENV=development # development | production
LOG_LEVEL=info
# -----------------------------------------------------------------------------------
# 2) UI (Shiny) <-> Backend (FastAPI)
# -----------------------------------------------------------------------------------
SHINY_HOST=127.0.0.1
SHINY_PORT=8001
API_HOST=127.0.0.1
API_PORT=8000
API_BASE_URL=http://127.0.0.1:8000 # En prod: URL pública del backend en Render
ALLOWED_ORIGINS=http://127.0.0.1:8001,http://localhost:8001,https://<tu-app>.shinyapps.io
CONFIDENCE_THRESHOLD=0.25
MAX_UPLOAD_MB=50
# -----------------------------------------------------------------------------------
# 3) Despliegue -> Hugging Face Spaces (SDK Docker) [VÍA ACTIVA — ver docs/ejecucion.md §5]
# HF construye el Dockerfile de la raíz (gateway FastAPI: UI / + API /api).
# Token (write) en: https://huggingface.co/settings/tokens
# Crea el Space (una vez, web): https://huggingface.co/new-space -> SDK "Docker".
# Deploy: .\scripts\deploy_hf.ps1
# -----------------------------------------------------------------------------------
HF_SPACE_ID= # <usuario>/<space>, p. ej. alexprieto/agrovision
# (HF_TOKEN se define en la sección 5; sirve tanto para el Space como para el modelo.)
# -----------------------------------------------------------------------------------
# 3b) Alternativas de despliegue (opcionales):
# - Render (Docker, free): backend/Dockerfile + render.yaml. API en dashboard.render.com/u/settings
# - Posit Connect (de pago): rsconnect deploy fastapi (scripts/deploy_prod.ps1).
# OJO: shinyapps.io NO hospeda FastAPI (solo Shiny); estas vars solo aplican a Posit Connect.
# -----------------------------------------------------------------------------------
RENDER_API_KEY=
RENDER_SERVICE_ID=
SHINYAPPS_ACCOUNT=
SHINYAPPS_TOKEN=
SHINYAPPS_SECRET=
# -----------------------------------------------------------------------------------
# 5) Modelo de conteo + Hugging Face Hub
# Token HF en: https://huggingface.co/settings/tokens (write si vas a publicar)
# -----------------------------------------------------------------------------------
COUNTING_ENABLED=false # true para activar el conteo (mock o real)
MODEL_BACKEND=mock # mock (datos falsos para probar) | onnx (modelo real)
MODEL_PATH=/app/models/agrovision-plantcount-v2.0.0.onnx
MODEL_VERSION=2.0.0
MODEL_ARCHITECTURE=yolo26n # yolo26n | rfdetr_nano (define el adaptador de decode)
HF_MODEL_REPO=<org>/agrovision-plantcount
HF_TOKEN=
# -----------------------------------------------------------------------------------
# 6) Telemetría de UI (Fase 9)
# Los eventos siempre se loguean en stdout y se guardan en un buffer en memoria
# (GET /api/events/recent). EVENTS_PERSIST=true además los persiste en la tabla
# `events` de Supabase (best-effort; requiere DATABASE_URL). Nunca contiene secretos.
# -----------------------------------------------------------------------------------
EVENTS_PERSIST=false # true para volcar la telemetría a la tabla events
# -----------------------------------------------------------------------------------
# 7) Seguridad / hardening
# Rate limiting en memoria sobre /api (anti-abuso/DDoS). 0 = desactivado.
# -----------------------------------------------------------------------------------
RATE_LIMIT_PER_MIN=120 # peticiones/min por IP a /api (0 desactiva)
# -----------------------------------------------------------------------------------
# 6) Supabase (BD PostGIS + Storage + Queues) — PLATAFORMA COMPLETA
# Project Settings -> API / Database. SERVICE_ROLE es SECRETO (solo backend, nunca UI).
# -----------------------------------------------------------------------------------
SUPABASE_URL= # https://<proyecto>.supabase.co
SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
SUPABASE_STORAGE_BUCKET=drone-images
DATABASE_URL= # postgresql+asyncpg://postgres:<pwd>@<host>:5432/postgres
# -----------------------------------------------------------------------------------
# 7) Groq — modelo BYOK ("Trae tu propia llave")
# En PRODUCCIÓN estas llaves NO se guardan en el servidor: el usuario las inyecta
# por sesión (cabeceras X-User-*) y se descartan. Las DEV_* de abajo son SOLO para
# pruebas locales sin el flujo BYOK.
# - Groq (agente RAG / Llama 3): https://console.groq.com/keys
# -----------------------------------------------------------------------------------
DEV_GROQ_API_KEY=
# -----------------------------------------------------------------------------------
# 8) APIs satelitales — modelo BYOK ("Trae tu propia llave")
# En PRODUCCIÓN estas llaves NO se guardan en el servidor: el usuario las inyecta
# por sesión (cabeceras X-User-*) y se descartan. Las DEV_* de abajo son SOLO para
# pruebas locales sin el flujo BYOK.
# - Copernicus CDSE (Sentinel-2): https://dataspace.copernicus.eu/
# - Open-Meteo: sin llave. NASA POWER: acceso público por coordenadas.
# -----------------------------------------------------------------------------------
DEV_COPERNICUS_CLIENT_ID=
DEV_COPERNICUS_CLIENT_SECRET=