Two commits, matched pair, per the FlowAgent MCP progress note's explicit sequencing requirement:
ai/ai.yaml — mcpo service only:
image: → git.bryanmail.net/homelab/flowagent-mcpo:916164714429 (the exact sha-tagged image built + smoke-tested clean in homelab/mcp-config pipeline #22 — both build-and-push-flowagent and smoke-test-flowagent-image succeeded). Pinned to commit-sha, not:latest, for reproducible deploys.
New secrets: block on mcpo referencing 3 Docker Swarm secrets: flowagent_azure_client_id, flowagent_azure_tenant_id, flowagent_azure_client_secret (Pattern C, _FILE convention — consumed by flowagent/entrypoint.sh via /run/secrets/flowagent_azure_*).
Those 3 secrets declared external: true at top level, mirroring the existing vaultwarden_admin_token_v2 pattern.
mcpo-critical is completely untouched — still stock ghcr.io/open-webui/mcpo:main, no secrets block, same as before.
.woodpecker/deploy.yml — surgical addition inside the existing case "ai)") block only:
3 new environment: entries (FLOWAGENT_AZURE_CLIENT_ID/TENANT_ID/CLIENT_SECRET via from_secret:).
Inside the ai) case, after the existing ai/ai.env rewrite, 3 new create_or_update_secret calls provisioning the same 3 values as native Docker Swarm secrets (Pattern C) — not written into ai/ai.env, since these are consumed via /run/secrets/*, not env vars.
A comment explaining why these 3 are Pattern C inside an otherwise Pattern-B stack case.
Every other line/case/comment in this ~26KB file is byte-for-byte unchanged — verified against current main before writing, given this file's documented incident history from prior full-file rewrites.
Current state (verified before opening this PR)
ai_mcpo on docker-2 is currently running stock mcpo:main, secrets=[] — this PR is what actually wires the image + secrets.
Deployed config.json already has the flowagent entry (via homelab/mcp-config's own pipeline) pointing at /app/flowagent/entrypoint.sh — currently a no-op inside the stock image, confirmed not crash-looping the container (docker service ps ai_mcpo shows stable Running for 17h+ before this PR).
Per progress note: Azure AD App Registration reported created, with real flowagent_* secrets already added to Woodpecker in both mcp-config and compose-files.
Explicitly NOT done here (deferred, per prior discussion)
Credential rotation of the 6 previously-exposed values (Proxmox token, Authentik JWT/token, UniFi password, 2× Gitea tokens) — unrelated to this PR, still pending.
Empirical verification of mcpo failure-isolation behavior — optional, lower priority.
Rollback
Revert this PR / redeploy ai.yaml from main — mcpo goes back to stock image with no secrets, mcpo-critical was never touched either way.
Merge checklist for reviewer
Confirm flowagent_azure_client_id / _tenant_id / _client_secret are real, non-placeholder values in Woodpecker (both repos)
After merge/deploy: docker service logs ai_mcpo --tail 100 -f — confirm flowagent entry authenticates via az login --service-principal (not just "doesn't crash")
Confirm mcpo-critical was not restarted/touched (docker service ps ai_mcpo-critical)
## What this does
Two commits, matched pair, per the FlowAgent MCP progress note's explicit sequencing requirement:
1. **`ai/ai.yaml`** — `mcpo` service only:
- `image:` → `git.bryanmail.net/homelab/flowagent-mcpo:916164714429` (the exact sha-tagged image built + smoke-tested clean in `homelab/mcp-config` pipeline #22 — both `build-and-push-flowagent` and `smoke-test-flowagent-image` succeeded). Pinned to commit-sha, **not** `:latest`, for reproducible deploys.
- New `secrets:` block on `mcpo` referencing 3 Docker Swarm secrets: `flowagent_azure_client_id`, `flowagent_azure_tenant_id`, `flowagent_azure_client_secret` (Pattern C, `_FILE` convention — consumed by `flowagent/entrypoint.sh` via `/run/secrets/flowagent_azure_*`).
- Those 3 secrets declared `external: true` at top level, mirroring the existing `vaultwarden_admin_token_v2` pattern.
- **`mcpo-critical` is completely untouched** — still stock `ghcr.io/open-webui/mcpo:main`, no secrets block, same as before.
2. **`.woodpecker/deploy.yml`** — surgical addition inside the existing `case "ai)")` block only:
- 3 new `environment:` entries (`FLOWAGENT_AZURE_CLIENT_ID/TENANT_ID/CLIENT_SECRET` via `from_secret:`).
- Inside the `ai)` case, after the existing `ai/ai.env` rewrite, 3 new `create_or_update_secret` calls provisioning the same 3 values as native Docker Swarm secrets (Pattern C) — **not** written into `ai/ai.env`, since these are consumed via `/run/secrets/*`, not env vars.
- A comment explaining why these 3 are Pattern C inside an otherwise Pattern-B stack case.
- **Every other line/case/comment in this ~26KB file is byte-for-byte unchanged** — verified against current `main` before writing, given this file's documented incident history from prior full-file rewrites.
## Current state (verified before opening this PR)
- `ai_mcpo` on docker-2 is currently running stock `mcpo:main`, `secrets=[]` — this PR is what actually wires the image + secrets.
- Deployed `config.json` already has the `flowagent` entry (via `homelab/mcp-config`'s own pipeline) pointing at `/app/flowagent/entrypoint.sh` — currently a no-op inside the stock image, confirmed **not** crash-looping the container (`docker service ps ai_mcpo` shows stable `Running` for 17h+ before this PR).
- Per progress note: Azure AD App Registration reported created, with real `flowagent_*` secrets already added to Woodpecker in both `mcp-config` and `compose-files`.
## Explicitly NOT done here (deferred, per prior discussion)
- Credential rotation of the 6 previously-exposed values (Proxmox token, Authentik JWT/token, UniFi password, 2× Gitea tokens) — unrelated to this PR, still pending.
- Empirical verification of `mcpo` failure-isolation behavior — optional, lower priority.
## Rollback
Revert this PR / redeploy `ai.yaml` from `main` — `mcpo` goes back to stock image with no secrets, `mcpo-critical` was never touched either way.
## Merge checklist for reviewer
- [ ] Confirm `flowagent_azure_client_id` / `_tenant_id` / `_client_secret` are real, non-placeholder values in Woodpecker (both repos)
- [ ] After merge/deploy: `docker service logs ai_mcpo --tail 100 -f` — confirm `flowagent` entry authenticates via `az login --service-principal` (not just "doesn't crash")
- [ ] Confirm `mcpo-critical` was not restarted/touched (`docker service ps ai_mcpo-critical`)
Image pinned to git.bryanmail.net/homelab/flowagent-mcpo:916164714429 —
the exact sha-tagged image built and smoke-tested clean in mcp-config
pipeline #22 (build-and-push-flowagent + smoke-test-flowagent-image both
success). NOT :latest, for reproducible deploys.
Adds a secrets: block to the mcpo service only, referencing the 3
flowagent_azure_* Docker Swarm secrets (Pattern C, _FILE convention,
consumed by flowagent/entrypoint.sh via /run/secrets/flowagent_azure_*).
Declares those 3 secrets as external at top level, mirroring the existing
vaultwarden_admin_token_v2 pattern in vaultwarden.yaml.
Companion secret-provisioning change lands in the same PR as a separate
commit in .woodpecker/deploy.yml's provision-secrets step (case "ai)").
mcpo-critical (lines defining Proxmox access) is completely untouched —
still stock ghcr.io/open-webui/mcpo:main, no secrets: block, unchanged.
Per FlowAgent MCP progress note: Azure AD App Registration is reported
created with real secrets already in Woodpecker (both mcp-config and
compose-files repos) as of this PR. This is a reviewed PR against a
feature branch, NOT auto-merged to main — deploy only happens after
manual review/merge, per user's explicit request for a manual-revert
safety net on this high-blast-radius shared stack (LiteLLM, Open WebUI,
n8n also live here).
Surgical addition to the existing case "ai)" block only — every other
case, comment, and line in this ~26KB pipeline file is byte-for-byte
unchanged from main. Given this file's documented incident history from
prior full-file rewrites (see header comment), this was hand-verified
against the current main content line-by-line before writing, not
generated fresh.
Adds:
- 3 new environment: entries (FLOWAGENT_AZURE_CLIENT_ID/TENANT_ID/
CLIENT_SECRET) via from_secret, alongside the existing ai_* secrets
- Inside the existing `ai)` case, after the ai.env rewrite block: three
create_or_update_secret calls provisioning flowagent_azure_client_id,
flowagent_azure_tenant_id, flowagent_azure_client_secret as native
Docker Swarm secrets (Pattern C, _FILE convention) — NOT written into
ai/ai.env, since mcpo's flowagent entry reads them via
/run/secrets/flowagent_azure_* per flowagent/entrypoint.sh, not env vars
- A short comment explaining why these three are Pattern C secrets
inside an otherwise Pattern-B (host .env) stack case
This is the matched-pair companion to the ai.yaml commit in this same PR,
per the FlowAgent progress note's explicit sequencing requirement (both
land together, reviewed, not auto-merged to main).
Bot
merged commit ac091999b4 into main2026-09-02 21:43:18 -07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What this does
Two commits, matched pair, per the FlowAgent MCP progress note's explicit sequencing requirement:
ai/ai.yaml—mcposervice only:image:→git.bryanmail.net/homelab/flowagent-mcpo:916164714429(the exact sha-tagged image built + smoke-tested clean inhomelab/mcp-configpipeline #22 — bothbuild-and-push-flowagentandsmoke-test-flowagent-imagesucceeded). Pinned to commit-sha, not:latest, for reproducible deploys.secrets:block onmcporeferencing 3 Docker Swarm secrets:flowagent_azure_client_id,flowagent_azure_tenant_id,flowagent_azure_client_secret(Pattern C,_FILEconvention — consumed byflowagent/entrypoint.shvia/run/secrets/flowagent_azure_*).external: trueat top level, mirroring the existingvaultwarden_admin_token_v2pattern.mcpo-criticalis completely untouched — still stockghcr.io/open-webui/mcpo:main, no secrets block, same as before..woodpecker/deploy.yml— surgical addition inside the existingcase "ai)")block only:environment:entries (FLOWAGENT_AZURE_CLIENT_ID/TENANT_ID/CLIENT_SECRETviafrom_secret:).ai)case, after the existingai/ai.envrewrite, 3 newcreate_or_update_secretcalls provisioning the same 3 values as native Docker Swarm secrets (Pattern C) — not written intoai/ai.env, since these are consumed via/run/secrets/*, not env vars.mainbefore writing, given this file's documented incident history from prior full-file rewrites.Current state (verified before opening this PR)
ai_mcpoon docker-2 is currently running stockmcpo:main,secrets=[]— this PR is what actually wires the image + secrets.config.jsonalready has theflowagententry (viahomelab/mcp-config's own pipeline) pointing at/app/flowagent/entrypoint.sh— currently a no-op inside the stock image, confirmed not crash-looping the container (docker service ps ai_mcposhows stableRunningfor 17h+ before this PR).flowagent_*secrets already added to Woodpecker in bothmcp-configandcompose-files.Explicitly NOT done here (deferred, per prior discussion)
mcpofailure-isolation behavior — optional, lower priority.Rollback
Revert this PR / redeploy
ai.yamlfrommain—mcpogoes back to stock image with no secrets,mcpo-criticalwas never touched either way.Merge checklist for reviewer
flowagent_azure_client_id/_tenant_id/_client_secretare real, non-placeholder values in Woodpecker (both repos)docker service logs ai_mcpo --tail 100 -f— confirmflowagententry authenticates viaaz login --service-principal(not just "doesn't crash")mcpo-criticalwas not restarted/touched (docker service ps ai_mcpo-critical)Surgical addition to the existing case "ai)" block only — every other case, comment, and line in this ~26KB pipeline file is byte-for-byte unchanged from main. Given this file's documented incident history from prior full-file rewrites (see header comment), this was hand-verified against the current main content line-by-line before writing, not generated fresh. Adds: - 3 new environment: entries (FLOWAGENT_AZURE_CLIENT_ID/TENANT_ID/ CLIENT_SECRET) via from_secret, alongside the existing ai_* secrets - Inside the existing `ai)` case, after the ai.env rewrite block: three create_or_update_secret calls provisioning flowagent_azure_client_id, flowagent_azure_tenant_id, flowagent_azure_client_secret as native Docker Swarm secrets (Pattern C, _FILE convention) — NOT written into ai/ai.env, since mcpo's flowagent entry reads them via /run/secrets/flowagent_azure_* per flowagent/entrypoint.sh, not env vars - A short comment explaining why these three are Pattern C secrets inside an otherwise Pattern-B (host .env) stack case This is the matched-pair companion to the ai.yaml commit in this same PR, per the FlowAgent progress note's explicit sequencing requirement (both land together, reviewed, not auto-merged to main).