Documentos de Decision Gate

Evaluación de puertas determinista, reproducible con decisiones auditables.

Documentación de Asset Core

Despliegue de Contenedores

Esta guía define el contrato del contenedor OSS de Decision Gate y proporciona pasos listos para el operador para construir y ejecutar la imagen del servidor MCP.

La imagen del contenedor es un artefacto del servidor. Se ejecuta decision-gate serve y está destinada a un despliegue de estilo de producción.

Resumen del Contrato (Autoritativo)

  • Punto de entrada: decision-gate
  • Comando por defecto: serve --config /etc/decision-gate/decision-gate.toml --allow-non-loopback
  • Montaje de configuración: /etc/decision-gate/decision-gate.toml
  • Transporte: HTTP (SSE opcional)
  • Autenticación: requerida (token de portador o encabezado de proxy mTLS)
  • TLS: terminado en upstream por defecto (server.tls_termination = "upstream")
  • Persistencia: sin estado por defecto; SQLite es explícito
  • Tiempo de ejecución: sin privilegios de root, privilegios mínimos, registros stdout/stderr
  • Rutas escribibles: /var/lib/decision-gate (solo cuando SQLite está habilitado)

Construir la Imagen

Construcción local:

docker build -t decision-gate:dev .

Construcción multi-arquitectura (amd64 + arm64):

IMAGE_REPO=ghcr.io/your-org/decision-gate IMAGE_TAG=dev \
  scripts/container/build_container.sh

Empujar multi-arquitectura:

IMAGE_REPO=ghcr.io/your-org/decision-gate IMAGE_TAG=dev PUSH=1 \
  scripts/container/build_container.sh

Notas:

  • IMAGE_REPO=ghcr.io/your-org/decision-gate is a placeholder. Replace your-org con tu organización o usuario de GitHub (por ejemplo, ghcr.io/decision-gate/decision-gate).
  • IMAGE_TAG=dev is a local/dev example. For releases, use a version tag (opcionalmente, publicar latest).

Etiquetas y Política de Lanzamiento

Local/dev:

  • decision-gate:dev para pruebas ad-hoc.
  • Las etiquetas Local/dev no son artefactos de lanzamiento de grado de política.

Lanzamiento:

  • ghcr.io/<org>/decision-gate:vX.Y.Z (etiqueta de lanzamiento inmutable).
  • ghcr.io/<org>/decision-gate:latest (apunta a la versión más reciente).
  • Release workflows emit supply-chain evidence including SPDX SBOMs, SLSA provenance statements, and Sigstore/cosign signatures for release asignaturas (Rust, Python, TypeScript y artefactos de contenedor).

Configuración

El contenedor espera un archivo de configuración en: /etc/decision-gate/decision-gate.toml.

Utiliza el preset de contenedor como base: configs/presets/container-prod.toml.

Requisitos clave:

  • server.bind debe ser no-loopback (por ejemplo, 0.0.0.0:8080).
  • server.auth.mode debe ser bearer_token o mtls.
  • server.tls_termination = "upstream" cuando TLS se termina fuera del contenedor.

Ejecutar el Contenedor

Ejecución mínima (autenticación de token portador, terminación TLS ascendente):

docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs/presets/container-prod.toml:/etc/decision-gate/decision-gate.toml:ro" \
  decision-gate:dev

Notas:

  • Reemplace el token de demostración en la configuración antes de usar en producción.
  • --allow-non-loopback is part of the default container command. If you override the command, include --allow-non-loopback or set DECISION_GATE_ALLOW_NON_LOOPBACK=1.

TLS en Contenedor (Opcional)

Si necesitas TLS dentro del contenedor, establece:

[server]
tls_termination = "server"

[server.tls]
cert_path = "/etc/decision-gate/tls/server.crt"
key_path = "/etc/decision-gate/tls/server.key"

Monta los certificados y actualiza tu entorno de ejecución de contenedores en consecuencia.

Modo Duradero (SQLite)

Por defecto, la configuración del contenedor utiliza almacenes en memoria.

Para habilitar la durabilidad de SQLite, actualiza la configuración:

[schema_registry]
type = "sqlite"
path = "/var/lib/decision-gate/schema-registry.db"

[run_state_store]
type = "sqlite"
path = "/var/lib/decision-gate/decision-gate.db"
journal_mode = "wal"
sync_mode = "full"
busy_timeout_ms = 5000

Ejecutar con un volumen escribible:

docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs/presets/container-prod.toml:/etc/decision-gate/decision-gate.toml:ro" \
  -v decision-gate-data:/var/lib/decision-gate \
  decision-gate:dev

Expectativas de Autenticación

Ejemplo de token de portador:

curl -sS -X POST http://127.0.0.1:8080/rpc \
  -H "Authorization: Bearer dg-container-demo-token" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Para el modo de proxy mTLS, establece:

[server.auth]
mode = "mtls"
mtls_subjects = ["CN=decision-gate-client,O=Example Corp"]

Luego haga que su proxy inyecte x-decision-gate-client-subject.

Puntos finales de salud

Decision Gate expone sondas estándar de Kubernetes:

  • GET /healthz para liveness
  • GET /readyz para disponibilidad

Estos puntos finales están intencionadamente no autenticados y devuelven un estado mínimo solamente. /readyz realiza comprobaciones de disponibilidad ligeras (almacenamiento de estado + registro de esquema) y devuelve HTTP 503 con {"status":"not_ready"} si las dependencias no están disponibles.

curl -sS http://127.0.0.1:8080/healthz
curl -sS http://127.0.0.1:8080/readyz

Ambos puntos finales devuelven HTTP 200 con una carga útil JSON.

Ejemplo de Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: decision-gate
spec:
  replicas: 1
  selector:
    matchLabels:
      app: decision-gate
  template:
    metadata:
      labels:
        app: decision-gate
    spec:
      containers:
        - name: decision-gate
          image: ghcr.io/your-org/decision-gate:latest
          ports:
            - containerPort: 8080
          securityContext:
            runAsNonRoot: true
            runAsUser: 10001
            readOnlyRootFilesystem: true
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /readyz
              port: 8080
            initialDelaySeconds: 2
            periodSeconds: 5
          volumeMounts:
            - name: config
              mountPath: /etc/decision-gate/decision-gate.toml
              subPath: decision-gate.toml
              readOnly: true
            - name: data
              mountPath: /var/lib/decision-gate
      volumes:
        - name: config
          configMap:
            name: decision-gate-config
        - name: data
          emptyDir: {}

Para la durabilidad de SQLite, reemplace emptyDir con una reclamación de volumen persistente.

Artefactos de la Cadena de Suministro

Los flujos de trabajo de liberación/publicación de Decision Gate ahora generan y verifican artefactos de la cadena de suministro directamente. Los comandos a continuación siguen siendo útiles para la verificación manual.

Contenedor SBOM (ejemplo usando syft):

syft packages decision-gate:dev -o spdx-json > decision-gate.sbom.spdx.json

Firma de blob o artefacto (cosign):

cosign sign-blob decision-gate.sbom.spdx.json

Declaración de firma de procedencia:

cosign sign-blob decision-gate.provenance.intoto.json

La política de lanzamiento bloquea cuando:

  • Cualquier vulnerabilidad Alta/Crítica está presente.
  • Cualquier CVE conocido y explotado está presente.
  • La verificación de firma o procedencia falla.