Commit Graph
32 Commits
Author SHA1 Message Date
infinito-nexus-updater[bot] d1f5847f04 update(images): update Docker image versions (web-app-openbao) 2026-10-27 12:56:05 +00:00
infinito-nexus-updater[bot] 3808a2b7a8 update(images): update Docker image versions (web-app-openbao) 2026-10-26 20:54:11 +00:00
evangelostsak 8ec3d1792f feat(web-app-openbao): let a deployment put its hosts into meshes 2026-10-16 03:40:19 +02:00
kevinveenbirkenbachandClaude Opus 5.5 c925150848 fix(web-app-openbao): ship the LDAP auth method as an external plugin
OpenBao 2.7 removed the builtin LDAP auth engine from the server binary
(openbao/openbao GH-3882). `bao auth enable ldap` answered
"plugin not found in the catalog: ldap" and the deploy stopped there.

The role now builds its own image. A multi-stage Dockerfile copies the
openbao-plugin-auth-ldap binary out of the image declared as the
`auth-ldap` service entry into /opt/openbao/plugins. A second server
config file, plugins.hcl, names that directory and registers the plugin
declaratively. It sets plugin_auto_register = true explicitly: the image
starts the server with a config directory, and on that path 2.7.1 does
not apply the documented default, so without the line the catalog stays
empty. The Dockerfile sets the file mode in a helper stage instead of
COPY --chmod, which only BuildKit accepts.

The mount is enabled with -plugin-version=latest, so it follows whichever
plugin version the image ships. A mount created by the former builtin
engine is tuned and reloaded onto the plugin, which needs `update` on
sys/plugins/reload/backend in the ansible-admin policy.

The LDAP tasks move into tasks/addons/auth-ldap.yml and the plugin is
declared under meta/addons as a required addon bridged to `ldap`. Its
Playwright spec logs in through the mount and asserts that sys/auth
reports an external running plugin version.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 13:25:17 +02:00
infinito-nexus-updater[bot] 44f57c82da update(images): update Docker image versions (web-app-openbao) 2026-10-02 20:09:27 +00:00
kevinveenbirkenbach 61af700d96 autoformat 2026-09-23 15:03:07 +02:00
evangelostsak 6a01b190b0 chore(openbao): promote the role to beta
Twelve of twelve deploy jobs green across compose and swarm, clearnet and
tor, on every distro in the rotation.
2026-09-21 17:45:34 +02:00
evangelostsak e06a62e19b style(openbao): drop the narrative exception comments
Review had these removed across the role once already, and the 11 September
pass cleared every file that was flagged. The seal-key pin and the
recovery-key work then reintroduced the same pattern in nine new places.

Also removes two that predate the review and were never flagged: the
healthcheck note in meta/services.yml and the entrypoint note in
compose.yml.j2. Both are the same narrative-exception shape.

Param docs, file headers and the plain contract notes in the Playwright specs
stay: separate categories, none of them objected to. What the deleted
comments recorded lives in the role README.
2026-09-21 00:29:15 +02:00
evangelostsak 2b51f1cb62 fix(openbao): pin the seal key out of the per-deploy rotation
The static seal carries one generation. Rotating the key on every deploy
spends that slack continuously, so a run that skips a generation, or dies
between the two AppRole pins, leaves the raft store readable only from a
volume backup plus the key that wrapped it -- and the recovery keys that
would authorise a rekey are discarded at init.

Frequent rotation buys little here in return. The key lives in the
vault-encrypted inventory either way, and whoever holds that inventory holds
the AppRole too, so they reach the data without needing the seal key. An
operator now rotates it deliberately by changing the inventory value; the
previous_key path stays in place to carry that.

The AppRole keeps rotating per deploy. It is the live authentication path,
and the fallback login exists to absorb exactly that.
2026-09-19 20:58:05 +02:00
evangelostsak 912b6cda39 Merge infinito-nexus/core#454 (feature/ai-agent-employees) into feature/web-app-openbao
Only two files were touched by both sides. env.js merged automatically: the
incoming side owns recordVideoOptions and this branch had cherry-picked that
same function from it, so the result carries one definition. README.md is the
generated roles index and both sides append rows; resolved as a union, taking
the incoming side for the three rows it edits (OnlyOffice, Open WebUI, OpenClaw)
and keeping ours only for OpenBao, then re-sorted.

The incoming side adds lint rules and resources that this role then violated.
Five fixes, each the remedy the failing rule names:

* services.openbao.ports.local.http 8081 -> 8093; svc-ai-litellm now holds 8081.
* meta/networks.yml subnet 192.168.221.0/24 -> 192.168.222.0/24; svc-ai-mcp-adapter
  now holds 221, and the suggester only sub-allocates inside occupied /24s, so
  the next free block was taken directly.
* services.email bond 1 -> 0; the entry is disabled and the resource model skips
  it before reading the weight.
* README Quick Setup regenerated from the template it had drifted from.
* Credits link the implementer, matching how they are credited elsewhere.
* docs/requirements/035-mcp-proxy-expansion.md disposes of web-app-openbao as
  privileged_control_plane, which is what a secrets manager is, and the list
  count follows.

Verified against a worktree of #454 alone so the baseline is measured rather
than assumed: lint 501 passed with only the branch-name rule failing, which
fails identically on that baseline because the worktree branch is named
merge/*; unit 5665 passed with the same three host-environment failures the
baseline has; integration 324 passed, 0 failed.
2026-09-14 16:59:39 +02:00
evangelostsak 1a54f10e0e test(web-app-openbao): deploy LAM in variant 0 so the RBAC rotation has an admin UI 2026-09-12 10:22:35 +02:00
evangelostsak 0053b07f2c fix(web-app-openbao): drop the dedicated RBAC tier accounts
baooperator and baoreader existed only to hold one RBAC group each, and a
role-declared account has no stable password until the inventory pins one, so
they needed a workaround to be logged in as at all. Moving biber through the
groups covers the same three tiers with an account whose password was never
broken, and additionally proves the grant and the revoke rather than a steady
state.
2026-09-12 00:17:07 +02:00
evangelostsak ef4b83014d fix(web-app-openbao): give the RBAC tier accounts ansible_become_password
Matches user-administrator and web-app-semaphore, the only other roles that
set a password in meta/users.yml, and the key the meta lint allow-lists. It
adds no exposure: user-administrator already assigns that password to the
administrator account, which holds the OpenBao administrator policy through
the same LDAP groups, so both accounts are strictly less privileged than one
that already shares the secret.
2026-09-11 23:28:58 +02:00
evangelostsak 85bd62de30 Revert "feat(web-app-openbao): generate the RBAC tier account passwords as role credentials"
meta/*.yml is static schema, not a runtime template, and a lookup into the
applications tree from there was the most runtime-dependent expression in any
meta file. The accounts take ansible_become_password instead.
2026-09-11 23:28:26 +02:00
evangelostsak 6e96d45e66 fix(web-app-openbao): keep the RBAC tier accounts role-local with a stable password
The password resolves to the role's generated credential when OpenBao is
deployed and falls back to the previous random default otherwise, so no other
deployment changes.
2026-09-11 21:16:00 +02:00
evangelostsak dbb8503eeb feat(web-app-openbao): generate the RBAC tier account passwords as role credentials
A user with no explicit password inherits the strong_password fallback, which
is re-evaluated on every render with nothing persisted, so ldap_passwd and
playwright.env can receive different strings and the bind returns 403. Same
mechanism web-app-zammad uses for api_bot_password.
2026-09-11 21:15:53 +02:00
evangelostsak 484ebb31ac fix(web-app-openbao): move the RBAC test accounts to the inventory so they can log in
Declaring baooperator and baoreader in the role's meta/users.yml provisioned
them correctly into LDAP and Keycloak, but every login returned 403: a user
with no explicit password inherits "{{ 42 | strong_password }}", which is
re-evaluated through secrets.choice on each render with nothing persisted, so
the password written by ldap_passwd and the one rendered into playwright.env
were different strings.
2026-09-11 20:54:38 +02:00
evangelostsak c2620a7087 style(web-app-openbao): drop the narrative comment from meta/server.yml 2026-09-11 18:36:31 +02:00
evangelostsak 8dcfed33c3 feat(web-app-openbao): declare dedicated operator and reader RBAC accounts 2026-09-11 18:35:27 +02:00
evangelostsak b2fb57ef63 style(web-app-openbao): apply autoformat to the credential descriptions 2026-09-08 05:36:02 +02:00
evangelostsak 3c29f8bb61 feat(web-app-openbao): add sso, ldap and pki variant matrix 2026-09-07 00:27:51 +02:00
evangelostsak 970ae41b48 feat(web-app-openbao): add descriptive role metadata 2026-09-07 00:27:05 +02:00
evangelostsak af59d181ee feat(web-app-openbao): add role-local user map 2026-09-07 00:26:47 +02:00
evangelostsak ad097bf598 feat(web-app-openbao): add seal key and AppRole credential schema 2026-09-07 00:25:03 +02:00
evangelostsak 299dd1955c feat(web-app-openbao): declare administrator, operator and reader RBAC roles 2026-09-07 00:24:48 +02:00
evangelostsak e82e9e1326 fix(web-app-openbao): accept the 307 redirect in the webserver health check 2026-09-07 00:24:32 +02:00
evangelostsak 1f9fc80437 feat(web-app-openbao): add CSP flags for the Ember UI 2026-09-07 00:24:16 +02:00
evangelostsak 1963fbd6d0 feat(web-app-openbao): allocate role-local subnet 2026-09-07 00:23:45 +02:00
evangelostsak f172f59741 feat(web-app-openbao): add canonical domain 2026-09-07 00:23:31 +02:00
evangelostsak fd8fdea14f feat(web-app-openbao): declare raft, logs and policy volumes 2026-09-07 00:23:16 +02:00
evangelostsak bec1de3692 feat(web-app-openbao): declare service entity, image pin and deploy modes 2026-09-07 00:23:01 +02:00
evangelostsak ddabb3c9db feat(web-app-openbao): add galaxy metadata 2026-09-07 00:22:45 +02:00