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-gateis a placeholder. Replaceyour-orgamb la teva organització o usuari de GitHub (per exemple,ghcr.io/decision-gate/decision-gate).IMAGE_TAG=devis a local/dev example. For releases, use a version tag (per exemple,vX.Y.Z) i opcionalment publicarlatest.
Etiquetes i Política de Lliberament
Local/dev:
decision-gate:devper 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.bindha de ser no-loopback (per exemple,0.0.0.0:8080).server.auth.modeha de serbearer_tokenomtls.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-loopbackis part of the default container command. If you override the command, include--allow-non-loopbackor setDECISION_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 /healthzper a la vivacitatGET /readyzper 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.