Decision Gate Docs

Avaluació de portes determinista, reproduïble amb decisions auditable.

Asset Core docs

Desplegament de contenidors

Aquesta guia defineix el contracte del contenidor OSS de Decision Gate i proporciona passos preparats per a l’operador per construir i executar la imatge del servidor MCP.

La imatge del contenidor és un artifacte del servidor. S’executa decision-gate serve i està destinada a un desplegament de tipus producció.

Resum del Contracte (Autoritzat)

  • Punt d’entrada: decision-gate
  • Comandament per defecte: serve --config /etc/decision-gate/decision-gate.toml --allow-non-loopback
  • Configurar muntatge: /etc/decision-gate/decision-gate.toml
  • Transport: HTTP (SSE opcional)
  • Auth: requerit (token de portador o capçalera de proxy mTLS)
  • TLS: terminat per defecte per l’upstream (server.tls_termination = "upstream")
  • Persistència: sense estat per defecte; SQLite és explícit
  • Temps d’execució: sense permisos d’administrador, privilegis mínims, registres stdout/stderr
  • Rutes escriables: /var/lib/decision-gate (només quan SQLite està habilitat)

Construir la Imatge

Construcció local:

docker build -t decision-gate:dev .

Construcció multi-arc (amd64 + arm64):

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

Push multi-arch:

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

Notes:

  • IMAGE_REPO=ghcr.io/your-org/decision-gate is a placeholder. Replace your-org amb la teva organització o usuari de GitHub (per exemple, ghcr.io/decision-gate/decision-gate).
  • IMAGE_TAG=dev is a local/dev example. For releases, use a version tag (per exemple, vX.Y.Z) i opcionalment publicar latest.

Etiquetes i Política de Lliberament

Local/dev:

  • decision-gate:dev per a proves ad-hoc.
  • Les etiquetes Local/dev no són artefactes de llançament de grau de política.

Llançament:

  • ghcr.io/<org>/decision-gate:vX.Y.Z (etiqueta de versió immutable).
  • ghcr.io/<org>/decision-gate:latest (apunta a l’última versió disponible).
  • Release workflows emit supply-chain evidence including SPDX SBOMs, SLSA provenance statements, and Sigstore/cosign signatures for release matèries (Rust, Python, TypeScript i artefactes de contenidor).

Configuració

El contenidor espera un fitxer de configuració a: /etc/decision-gate/decision-gate.toml.

Utilitzeu la preset de contenidor com a base: configs/presets/container-prod.toml.

Requisits clau:

  • server.bind ha de ser no-loopback (per exemple, 0.0.0.0:8080).
  • server.auth.mode ha de ser bearer_token o mtls.
  • server.tls_termination = "upstream" quan TLS es termina fora del contenidor.

Executar el contenidor

Execució mínima (autenticació de token portador, terminació TLS ascendent):

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

Notes:

  • Substituïu el token de demostració a la configuració abans de l’ús en producció.
  • --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 dins del contenidor (Opcional)

Si necessiteu TLS dins del contenidor, configureu:

[server]
tls_termination = "server"

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

Munta els certificats i actualitza el teu entorn d’execució de contenidors en conseqüència.

Mode Durable (SQLite)

Per defecte, la configuració del contenidor utilitza emmagatzematges en memòria.

Per habilitar la durabilitat de SQLite, actualitzeu la configuració:

[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

Executa amb un volum escrivible:

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

Expectatives d’Autenticació

Exemple de token 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"}'

Per al mode de proxy mTLS, estableix:

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

A continuació, feu que el vostre proxy injecti x-decision-gate-client-subject.

Health Endpoints

Decision Gate exposa probes estàndard de Kubernetes:

  • GET /healthz per a la vivacitat
  • GET /readyz per a la disponibilitat

Aquests punts finals són intencionadament no autenticats i només retornen un estat mínim. /readyz realitza comprovacions de disponibilitat lleugeres (magatzem d’estat + registre d’esquema) i retorna HTTP 503 amb {"status":"not_ready"} si les dependències no estan disponibles.

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

Ambdós punts finals retornen HTTP 200 amb una càrrega útil JSON.

Exemple 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: {}

Per a la durabilitat d’SQLite, substituïu emptyDir per una reclamació de volum persistent.

Artefactes de la cadena de subministrament

Els fluxos de treball de publicació/llicència de Decision Gate ara generen i verifiquen directament els artefactes de la cadena de subministrament. Els comandaments a continuació segueixen sent útils per a la verificació manual.

Container SBOM (exemple utilitzant syft):

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

Signatura de blobs o artefactes (cosign):

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

Declaració de procedència signada:

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

La política de publicació bloqueja quan:

  • Hi ha una vulnerabilitat Alta/Critical present.
  • Hi ha alguna CVE coneguda i explotada present.
  • La verificació de la signatura o la procedència falla.