Configuración
Todas las variables son opcionales y se ponen en .env (copia de .env.example). Tras cambiarlas: docker compose up -d. python -m pitangus check-config (o make cli ARGS=check-config) las revisa todas; el servidor y el worker lo hacen al arrancar y se detienen con un mensaje claro si alguna no es válida. En otras plataformas, mira despliegue.md.
| Variable | Por defecto | Para qué |
|---|---|---|
PITANGUS_HOST_BIND / PITANGUS_HOST_PORT |
127.0.0.1 / 8766 |
Dónde se publica el panel en el host. |
PITANGUS_PUBLIC_URL |
http://127.0.0.1:8766 |
URL con la que se abre el panel; decide cookies Secure, HSTS y la Setup URL de la App. |
PITANGUS_ALLOWED_ORIGINS |
127.0.0.1 y localhost | Orígenes aceptados (Host y CSRF). |
PITANGUS_DEFAULT_LOCALE |
en |
en o es. Idioma de los comentarios en PRs, los avisos, las incidencias de Jira, los informes y la salida de la CLI cuando nadie pide uno en persona. El panel no lo usa: sigue el idioma del navegador y cada persona puede cambiarlo desde la barra lateral o la pantalla de inicio de sesión. |
PITANGUS_MASTER_KEY |
se genera en config/ |
Clave maestra (openssl rand -base64 32): cifra todos los secretos de la base. Obligatoria donde no hay disco persistente; la misma en la API y en cada worker. |
PITANGUS_SESSION_KEY |
se genera, sellada en la base | Clave que firma las cookies de sesión (32 bytes en base64). Solo para fijarla desde un gestor de secretos. |
PITANGUS_REQUIRE_TOTP |
admins |
admins, all o none. |
PITANGUS_NVD_API_KEY |
— | API key de NVD: descarga de CVE más rápida. Va en cabecera y nunca se registra. |
PITANGUS_DB_PASSWORD |
(generada) | Contraseña de PostgreSQL; make setup la crea en .env. |
PITANGUS_DATABASE_URL |
(compose) | Conexión a PostgreSQL. compose.yaml la arma con la contraseña; fuera de compose, p. ej. postgresql://pitangus:…@localhost:5432/pitangus (las URL postgres:// que dan las bases gestionadas valen tal cual). |
PITANGUS_DATA_DIR |
data (CLI) o una carpeta temporal (ASGI) |
Cachés reconstruibles, carpetas de trabajo y logs opcionales en archivo. Compose la fija en /data; el estado de la aplicación sigue en PostgreSQL. |
PITANGUS_CONFIG_DIR |
la carpeta de configuración del usuario en la plataforma | Carpeta de master.key cuando no defines PITANGUS_MASTER_KEY. Compose la fija en /config. |
PITANGUS_EMBEDDED_WORKER |
1 |
1: el servidor también ejecuta los análisis (un solo proceso). En compose el API usa 0 y el servicio worker los ejecuta. |
PITANGUS_BIND |
127.0.0.1 |
Interfaz que usa pitangus serve. Compose la cambia dentro del contenedor; usa PITANGUS_HOST_BIND para controlar la publicación en el host. |
PITANGUS_CVE_SYNC |
on |
off desactiva la copia local de NVD. |
PITANGUS_EUVD |
on |
off no consulta EUVD (ENISA) cuando NVD no puntúa un CVE. Solo sale el identificador del CVE. |
PITANGUS_PR_POLL_SECONDS |
300 |
Cada cuánto se consultan los PRs vigilados. |
PITANGUS_BRANCH_MIN_MINUTES |
60 |
Pausa mínima entre dos reanálisis automáticos de la rama principal de un mismo repositorio (mínimo 10). |
PITANGUS_ADVISORY_WATCH_HOURS |
24 |
Cada cuántas horas se contrastan las dependencias ya analizadas con los avisos nuevos (sin conexión). 0 lo apaga. |
PITANGUS_ALLOW_PRIVATE_WEBHOOKS |
vacío | 1 permite avisos a webhooks de la red interna (por defecto se bloquean: SSRF). |
PITANGUS_ALLOW_PRIVATE_REGISTRIES |
— | 1 permite analizar imágenes de registros con IP privada (tu red interna). Por defecto se bloquean para evitar SSRF. |
PITANGUS_TLS_CERT / PITANGUS_TLS_KEY |
— | Archivos de certificado y clave privada para TLS sin proxy. Debes definir los dos. |
PITANGUS_ALLOW_INSECURE_HTTP |
vacío (apagado) | 1 deja arrancar el servidor cuando PITANGUS_PUBLIC_URL es http:// en claro en una dirección que no sea 127.0.0.1/localhost, algo que si no rechaza. Contraseñas, cookies de sesión y tokens viajan entonces sin cifrar por la red: solo en una red de confianza y bajo tu responsabilidad. Mejor usa HTTPS. |
PITANGUS_DOWNLOAD_TIMEOUT |
900 |
Segundos que puede tardar la descarga del archivo de un repositorio desde GitHub antes de que el análisis se rinda (mínimo 60). Súbelo para repositorios muy grandes o conexiones lentas. |
PITANGUS_API_MEMORY, PITANGUS_WORKER_MEMORY |
1g, 2g (4g para el worker en deploy/compose.yaml, donde los motores corren dentro) |
Topes de memoria de los contenedores de la API y del worker en Compose, para que un proceso desbocado no deje sin memoria al host ni a Postgres. Los contenedores de los motores tienen los suyos (3 GB, 2 CPU). |
DOCKER_SOCKET_GID |
lo detecta make |
Grupo dueño del socket de Docker en Linux y en WSL con Docker nativo (stat -Lc %g /var/run/docker.sock), para que el worker pueda arrancar los motores. Lo lee Compose, no la app; ponlo solo si arrancas directamente con docker compose. No hace falta en Docker Desktop ni OrbStack (grupo 0, que siempre se añade). |
GITHUB_APP_ID + GITHUB_APP_SLUG + GITHUB_APP_PRIVATE_KEY_FILE |
— | Alternativa al formulario: montar la App como secreto del despliegue. Manda sobre el almacén. |
GITHUB_TOKEN / GITLAB_TOKEN |
— | Tokens entregados por el despliegue para fuentes de código. La conexión por token de GitHub funciona; el proveedor de GitLab está declarado pero desactivado a propósito hasta que se pruebe, así que GITLAB_TOKEN no habilita GitLab hoy. Para GitHub, prefiere la GitHub App. |
OPENAI_API_KEY / ANTHROPIC_API_KEY |
— | Claves que quien opera puede listar y validar con la CLI. El análisis con IA no está implementado y estas claves no reciben código ni hallazgos. |
PITANGUS_HOST_CONFIG_DIR |
./config |
Carpeta del host para la clave maestra, cuando no se define PITANGUS_MASTER_KEY. |
PITANGUS_HOST_DATA_DIR / PITANGUS_HOST_RULES_DIR |
las detecta Compose | Rutas absolutas del host que se montan en los contenedores hermanos de los motores. Defínelas solo cuando la detección automática no pueda resolver los bind mounts. |
PITANGUS_FORWARDED_ALLOW_IPS |
vacío | Detrás de un proxy inverso que sea el único camino hasta la API: las direcciones del proxy cuyo X-Forwarded-For se cree (* = cualquiera). Sin ella, el límite de intentos de inicio de sesión y los logs ven la dirección del proxy para todo el mundo. compose.prod.yaml la pone para Caddy. |
PITANGUS_ENGINE_RUNNER |
auto |
docker: cada motor en un contenedor hermano a través del socket de Docker. local: los motores instalados en la imagen del worker (pitangus-worker), sin socket. auto: Docker si responde; si no, los motores instalados. |
PITANGUS_PERIODIC |
leader |
leader: un worker ejecuta las tareas periódicas con su propio reloj. external: las dispara un programador con pitangus periodic o GET /api/cron (despliegue.md). |
PITANGUS_CRON_TOKEN / CRON_SECRET |
vacío (apagado) | Token bearer para GET /api/cron, solo con PITANGUS_PERIODIC=external. Mínimo 32 caracteres. CRON_SECRET es el que envía Vercel Cron. |
PITANGUS_LOG_FORMAT |
text |
json: un objeto JSON por línea en la salida del proceso. |
PITANGUS_LOG_LEVEL |
INFO |
DEBUG, INFO, WARNING o ERROR. Los logs de depuración también pasan por el filtro de secretos. |
PITANGUS_LOG_FILE |
vacío (Compose: logs/app.log) |
Escribe además los registros en JSON en este archivo, rotado a 10 MB × 5; una ruta relativa va dentro de la carpeta de datos. |
PITANGUS_METRICS_TOKEN |
vacío (apagado) | Activa /api/metrics (Prometheus) para peticiones con Authorization: Bearer <token>. Mínimo 32 caracteres: openssl rand -hex 32. |
PITANGUS_IMPORT_TOKEN |
vacío (apagado) | Activa POST /api/ci/sarif, con el que la CI importa el SARIF 2.1.0 de otra herramienta en un activo existente usando Authorization: Bearer <token> (sin sesión). Mínimo 32 caracteres: openssl rand -hex 32. También es lo que envía pitangus import-sarif --server, leído del entorno. |
Servidor con dominio (despliegue-vps.md). Las lee Compose, no la app; make setup DOMAIN=… [PREBUILT=1] [SOCKET=1] las escribe (make setup PREBUILT=1, sin dominio, solo COMPOSE_FILE y PITANGUS_IMAGE).
| Variable | Por defecto | Para qué |
|---|---|---|
PITANGUS_DOMAIN |
— | Dominio para el que Caddy pide el certificado (compose.prod.yaml). La URL pública y los orígenes permitidos pasan a ser https://<dominio>. |
COMPOSE_FILE |
compose.yaml |
Ficheros de Compose que usan todos los comandos, p. ej. compose.yaml:compose.prod.yaml:compose.no-socket.yaml:compose.images.yaml:compose.images.no-socket.yaml. make setup conserva compose.backup-age.yaml si lo añadiste. |
PITANGUS_IMAGE |
— | Imagen publicada que se ejecuta en lugar de construirla (compose.images.yaml), p. ej. ghcr.io/pitangus-dev/pitangus. |
PITANGUS_IMAGE_TAG |
la versión del código | Etiqueta de esa imagen; admite digest (0.12@sha256:…). |
PITANGUS_WORKER_IMAGE_TAG |
la versión del código | Lo mismo para <PITANGUS_IMAGE>-worker, el worker con los motores dentro (sin socket). make up fija las dos al digest que comprobó. |
COMPOSE_PROFILES |
— | backup activa el servicio de copias programadas. |
PITANGUS_BACKUP_DIR |
./backups |
Dónde escribe el servicio de copias. |
PITANGUS_BACKUP_INTERVAL_HOURS / _KEEP_DAYS |
24 / 14 |
Cada cuánto copia y cuántos días guarda sus propias copias. |
PITANGUS_BACKUP_AGE_RECIPIENT |
— | Claves públicas de age (age1… o ssh-ed25519 …, separadas por comas) con las que se cifra cada copia, clave maestra incluida; también la lee make backup (necesita age en el host). El servicio necesita compose.backup-age.yaml en COMPOSE_FILE. Vacía: sin cifrar y sin la clave maestra. |
Concesión consciente: con el compose.yaml del repositorio, para no instalar nada más que Docker, el worker lanza los motores como contenedores hermanos por el socket de Docker, y eso equivale a root en el host. En un servidor, make setup DOMAIN=… (compose.no-socket.yaml) y deploy/compose.yaml usan en cambio la imagen del worker con los motores dentro, sin socket. Qué aísla cada opción.