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-gateis a placeholder. Replaceyour-orgcon tu organización o usuario de GitHub (por ejemplo,ghcr.io/decision-gate/decision-gate).IMAGE_TAG=devis a local/dev example. For releases, use a version tag (opcionalmente, publicarlatest).
Etiquetas y Política de Lanzamiento
Local/dev:
decision-gate:devpara 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.binddebe ser no-loopback (por ejemplo,0.0.0.0:8080).server.auth.modedebe serbearer_tokenomtls.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-loopbackis part of the default container command. If you override the command, include--allow-non-loopbackor setDECISION_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 /healthzpara livenessGET /readyzpara 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.