FlowAgent MCP cutover: point ai.yaml's mcpo at flowagent-mcpo image + wire Azure secrets (matched pair) #14

Merged
Bot merged 2 commits from flowagent-ai-cutover into main 2026-09-02 21:43:18 -07:00
Owner

What this does

Two commits, matched pair, per the FlowAgent MCP progress note's explicit sequencing requirement:

  1. ai/ai.yamlmcpo 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 mainmcpo 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`)
Bot added 2 commits 2026-09-02 16:53:46 -07:00
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 main 2026-09-02 21:43:18 -07:00
Sign in to join this conversation.