Desplegament de contenidors

Desplegar Decision Gate en un entorn de contenidor limitat.

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

La imatge del contenidor és un artefacte del servidor. S’executa decision-gate serve i és adequada per a treball d’integració i qualificació semblant a producció. No és evidència que el compromís permanent, la recuperació o el perfil d’assignació de múltiples nodes estigui qualificat per al llançament.

Contracte Actual del Contenidor

  • Punt d’entrada: decision-gate
  • Comandament per defecte: serve --config CONFIG_PATH --allow-non-loopback, on el preset del contenidor utilitza /etc/decision-gate/decision-gate.toml
  • Muntatge de configuració: /etc/decision-gate/decision-gate.toml
  • Transport: HTTP (SSE opcional)
  • Auth: s’exigeix autenticació bearer; els certificats controlats pel cridant o els encapçalaments de subjecte de proxy mai són autoritats d’identitat.
  • TLS: terminat per defecte per l’upstream (server.tls_termination = "upstream")
  • Persistència: no hi ha emmagatzematge d’estat d’execució durable per defecte; SQLite és una configuració d’ persistència local explícita
  • 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)

L’absència d’una botiga local no fa que les mutacions de l’evaluador siguin sense estat o segures per al ruteig de múltiples escriptors amb el mateix RunKey. El codi actual té mecanismes d’exact-head/idempotència, però no s’han refinat contra el model d’execució acceptada PF-03 i el perfil de vida del procés no té cap reclam de durabilitat de reinici. Un desplegament allotjat ha de rutar la mutació per un RunKey(namespace, run_id) a través d’un procés resolt i fixar bytes de llei de scenario idèntics per a aquella identitat. Aquesta és una restricció de l’operador, no una transferència d’autoritat durable o un failover. Fixar un espai de noms sencer a un procés és un ruteig conservador actual, no la clau de serialització permanent. L’objectiu estable d’assignació ruteja cada RunKey a una autoritat d’evaluador/execució acceptada co-locada i consumeix testimonis externs exactes; vegeu l’estàndard d’integració de desplegament.

La configuració actual del perfil inicial no pot representar l’adquisició d’evidència de xarxa, fonts d’evidència MCP remotes, execució de subprocessos/custom, o avaluació remota. El transport del servidor HTTP/SSE porta sol·licituds d’eines al node DG i no habilita aquelles famílies d’adquisició excloses.

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 és un marcador de posició. Substitueix your-org pel teu org o usuari de GitHub (per exemple, ghcr.io/decision-gate/decision-gate).
  • IMAGE_TAG=dev és un exemple local/dev. Per a les publicacions, utilitza una etiqueta de versió (per exemple, vX.Y.Z) i opcionalment publica 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:

  • Actualment no s’ha publicat cap imatge oficial de GHCR d’aquest repositori.
  • Els operadors que vulguin una imatge de registre haurien de construir i pujar la seva pròpia imatge a un registre controlat per l’org i mantenir el seu propi rastre de procedència.
  • Els fluxos de treball de publicació encara emeten proves de la cadena de subministrament per a les etiquetes de publicació etiquetades com a font-primer i la validació de paritat de publicació local.

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 és part del comandament per defecte del contenidor. Si sobrescribes el comandament, inclou --allow-non-loopback o estableix 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"

[accepted_run_store]
type = "sqlite"
path = "/var/lib/decision-gate/decision-gate.db"
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"}'

Els encapçalaments de certificat-subjecte afirmats pel cridant no són intencionadament compatibles. Quan un proxy o ingress termina TLS, ha d’eliminar els encapçalaments de reenvio no fiables i passar la credencial de portador revisada sense canvis. El TLS terminat pel servidor també protegeix la connexió però no crea un mecanisme d’identitat d’aplicació separat.

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:your-tag
          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ó de Decision Gate generen i verifiquen artefactes de la cadena de subministrament per a etiquetes de prioritat de font i comprovacions de paritat locals. Els comandos a continuació segueixen sent útils per a la verificació manual d’imatges construïdes per l’operador.

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.