Files
classic-models-agent-flows/deploy/flux-kustomization.yaml
T
Stéphane Tailland 2bb6faa121 refactor: an autonomous run is a machine identity, not a mandate
Withdrawn: the offline_access mandate built an hour ago. An agent running on its
own account acts for itself. Nobody asked for the 06:00 run, so naming a person
as its principal was a fiction — and choosing which person was arbitrary, as the
first implementation showed by picking whichever test user was to hand.

It also cost more than it was worth. An offline token has no exp, dies only
after 30 days unused, is not rotated on use, and is revocable only by killing
that user's offline session: a permanent bearer credential standing in for a
consent nobody gave.

Now client_credentials, with the service account carrying read_only — the least
privilege the job needs. That is not a convention the workflow observes: the MCP
server maps the role to a consumer group at discovery, so tools/list under this
identity returns get-product and list-products and nothing else. create-product
is invisible rather than merely unused.

Nothing downstream changes. azp still names the agent, audiences are still
per-server, and policy still reads roles — a service account has roles like
anyone else.

The mandate client stays in the realm, unused, for the case where a person's own
authority genuinely is in play: Recouvrement's dunning, which is human-validated
already.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 17:51:18 +02:00

46 lines
1.5 KiB
YAML

# This estate's n8n: the template from infra-n8n, with our values.
#
# Everything specific lives here rather than in that repo, so the same template
# deploys somebody else's n8n without carrying ours.
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: n8n
namespace: n8n
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: infra-n8n
path: ./k8s
prune: true
wait: true
timeout: 5m
postBuild:
substitute:
NAMESPACE: n8n
N8N_HOSTNAME: n8n.sttlab.local
N8N_IMAGE: docker.n8n.io/n8nio/n8n:2.37.4
POSTGRES_IMAGE: postgres:16.10-alpine
N8N_STORAGE: 2Gi
POSTGRES_STORAGE: 5Gi
TIMEZONE: Europe/Paris
INGRESS_CLASS: nginx
INGRESS_BODY_SIZE: "50m"
TLS_ISSUER_NAME: sttlab-local-ca
TLS_ISSUER_KIND: ClusterIssuer
VAULT_SERVER: https://vault.sttlab.eu
VAULT_MOUNT: secrets
VAULT_SECRET_PATH: n8n/instance
VAULT_STORE_NAME: vault-n8n
VAULT_APPROLE_SECRET: vault-approle-n8n
# The agents' Keycloak client secrets, so a workflow can exchange tokens
# as the agent it represents. Created by agent-secrets.yaml beside this.
EXTRA_ENV_SECRET: n8n-agent-secrets
EXTRA_CA_CONFIGMAP: sttlab-ca
# "false" so a workflow can read $env.<AGENT>_CLIENT_SECRET. It means any
# workflow on this instance can read any variable in the pod — acceptable
# while it runs only this estate's agents, and not a moment longer.
BLOCK_ENV_ACCESS: "false"
EXECUTIONS_MAX_AGE_HOURS: "336"