agentleFS
ambient-codeambient-code/platform/skills/deployments/ambient-ui/SKILL.md

deploy

Skill131 starsChanged 6 months agoMITView on GitHub

Deploy, update manifests, and troubleshoot the ambient-ui component. Use when creating or modifying deployment manifests, adding ambient-ui to a new overlay, building images, or debugging cluster issues.

  • Installs packages

155 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use pm-discovery, qa-phase and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • ww-w-aiSkill

    pm-discovery

    PM Agent Team - Automated product discovery, strategy, and PRD generation. Runs PM analysis workflow to produce comprehensive PRD before PDCA Plan phase.

    Also in 3 projects that use this

  • ww-w-aiSkill

    qa-phase

    Run QA tests at various levels (L1-L5) for features under PDCA management. Integrates with MCP tools to execute structured test plans.

    Also in 3 projects that use this

  • +10 more from ww-w-ai

The file

We split this skill into the rules it gives an agent

5 rules. 0 are common, 4 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 139 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    No sidecar proxy. The BFF IS the confidential OIDC client.

    line 35
  2. Very specific:

    Add image entries for quay.io/ambient_code/vteam_ambient_ui

    line 176
  3. Distinctive:

    If auth: create OIDC client and secrets per Prerequisites

    line 178
  4. Distinctive:

    If OpenShift with HTTPS to ambient-api-server: trust the service-ca bundle.

    line 179
  5. Distinctive:

    Add a Route if external access is needed

    line 183

“Common” is measured: kept by at least 6 in 10 of the 139 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Ambient UI Deployment

Instructions for deploying the ambient-ui component across environments.

User Input

$ARGUMENTS

Architecture

The ambient-ui is a Next.js BFF (Backend-for-Frontend) that handles OIDC authentication as a confidential client, manages server-side sessions, and proxies API requests to the ambient-api-server with JWT relay.

Route (port 443, TLS edge termination)
  → Service (port 3000)
    → Next.js BFF (port 3000)
      ├── OIDC auth (Authorization Code Flow + PKCE against Red Hat SSO)
      ├── Server-side session (iron-session, httpOnly cookie)
      ├── JWT relay to ambient-api-server (Authorization: Bearer <jwt>)
      └── ambient-api-server (port 8000, HTTPS, validates JWT against same issuer)

No sidecar proxy. The BFF IS the confidential OIDC client. The browser never receives a raw JWT — only an httpOnly session cookie.

Manifest File Map

FilePurpose
components/manifests/base/core/ambient-ui-deployment.yamlBase Deployment, ServiceAccount, Service
components/manifests/overlays/kind/kustomization.yamlKind overlay (Quay images, no auth)
components/manifests/overlays/kind-local/kustomization.yamlKind-local overlay (localhost images)
components/ambient-ui/DockerfileMulti-stage Docker build
.github/workflows/components-build-deploy.ymlCI build matrix entry
components/manifests/overlays/hcmais/kustomization.yamlHCMAIS overlay (ambient-api namespace, Keycloak SSO)

Production overlay files exist (ambient-ui-oauth-patch.yaml, etc.) but are disabled — they used origin-oauth-proxy which can't produce JWTs. See Auth section.

Docker Build

Build context is ./components (not ./components/ambient-ui), because the Dockerfile references ambient-sdk/ts-sdk as a sibling.

Critical details

  1. SDK dist/ is gitignored. The Dockerfile must build it:
    COPY ambient-sdk/ts-sdk /ambient-sdk/ts-sdk
    RUN cd /ambient-sdk/ts-sdk && npm install --ignore-scripts && npm run build
  2. Standalone output path. outputFileTracingRoot: ../.. in next.config.js resolves to / in Docker (WORKDIR /app), so standalone nests under app/:
    cp -r .next/standalone/app/. /app-output/
    Locally it nests under components/ambient-ui/. Always verify with:
    find .next/standalone -name server.js -not -path '*/node_modules/*'
  3. Webpack, not Turbopack. The build script is next build --webpack. Turbopack cannot resolve file: linked dependencies.
  4. OpenShift permissions. The builder stage must run:
    chmod -R g=u /app-output && chgrp -R 0 /app-output
    The runner image (Red Hat Hardened Image) is distroless — no shell at runtime.

Local build & test

podman build -t ambient-ui-test -f components/ambient-ui/Dockerfile components/
podman run --rm ambient-ui-test node -e 'require("fs").statSync("/app/server.js"); console.log("server.js found")'
podman run -d --name ambient-ui-test -e HOSTNAME=0.0.0.0 ambient-ui-test
podman exec ambient-ui-test node -e "require('http').get('http://localhost:3000/', r => { console.log(r.statusCode); r.on('data',()=>{}); r.on('end',()=>process.exit(0)); })"
podman stop ambient-ui-test && podman rm ambient-ui-test

Environment Configuration

Env Varkind / localProduction
API_SERVER_URLhttp://ambient-api-server:8000https://ambient-api-server:8000
NODE_EXTRA_CA_CERTS(unset)/etc/ssl/service-ca/service-ca.crt (from service-ca ConfigMap)
SSO_ISSUER_URLKeycloak realm URL (auto-generated by make dev COMPONENT=ambient-ui)https://sso.redhat.com/auth/realms/redhat-external
SSO_CLIENT_IDambient-frontend (Kind Keycloak)OIDC client ID
SSO_CLIENT_SECRETdev-secret-do-not-use-in-prod (Kind Keycloak)OIDC client secret (from Secret)
SESSION_SECRETauto-generated from cluster nameRandom 32+ byte string (from Secret)
NEXT_PUBLIC_PREVIEW_ALLOWED_HOSTS(unset, defaults localhost:*)target domains

Authentication

Native SSO (target architecture)

The BFF handles OIDC directly using Authorization Code Flow with PKCE:

  1. User visits ambient-ui → BFF redirects to SSO issuer authorize endpoint
  2. User authenticates at Red Hat SSO → redirected back with auth code
  3. BFF exchanges code for tokens (access token = JWT, refresh token, ID token)
  4. BFF stores tokens in an iron-session encrypted httpOnly cookie
  5. On API requests, BFF extracts JWT from session and forwards as Authorization: Bearer
  6. ambient-api-server validates JWT against sso.redhat.com JWKS endpoint

This is already implemented in:

  • src/lib/oidc.ts — OIDC discovery, auth URL, code exchange, token refresh
  • src/lib/session.ts — iron-session storage, token expiry, auto-refresh
  • src/lib/auth.ts — resolveAccessToken() extracts JWT from session
  • src/app/api/auth/sso/login/route.ts — initiates OIDC flow
  • src/app/api/auth/sso/callback/route.ts — handles callback, stores tokens
  • src/app/api/auth/sso/logout/route.ts — destroys session

What's needed to enable native SSO

An OIDC confidential client on sso.redhat.com/auth/realms/redhat-external:

  • Client protocol: openid-connect, access type: confidential
  • Valid redirect URI: https://<ambient-ui-route>/api/auth/sso/callback
  • Scopes: openid, email, profile

Then set the env vars: SSO_ISSUER_URL, SSO_CLIENT_ID, SSO_CLIENT_SECRET, SESSION_SECRET, and AUTH_MODE=native-sso.

Why origin-oauth-proxy doesn't work

The OpenShift origin-oauth-proxy issues opaque sha256~ tokens, not JWTs. The ambient-api-server requires Red Hat SSO JWTs (--enable-jwt=true). Confirmed via source code audit: origin-oauth-proxy has zero JWT support. The upstream OIDC id_token is decoded for claims and permanently discarded by the OpenShift OAuth server. No configuration can change this.

Production overlay files for oauth-proxy exist as reference but are disabled.

Prerequisites (Manual Steps)

1. Quay.io repository

quay.io/ambient_code/vteam_ambient_ui with push access for vteamrobbit.

2. OIDC client (REQUIRED for production)

Create on sso.redhat.com/auth/realms/redhat-external:

  • Client protocol: openid-connect, access type: confidential
  • Redirect URI: https://<route>/api/auth/sso/callback
  • Scopes: openid, email, profile

3. Secrets

oc create secret generic ambient-ui-config \
  --from-literal=sso-client-id=<client-id> \
  --from-literal=sso-client-secret=<client-secret> \
  --from-literal=session-secret="$(openssl rand -base64 32)"

4. Route + TLS

OpenShift Route with TLS edge termination, targeting the ambient-ui Service on port 3000.

Adding ambient-ui to a New Overlay

  1. Include base: resources: [../../base] (ambient-ui-deployment.yaml is in base/core)
  2. Add image entries for quay.io/ambient_code/vteam_ambient_ui
  3. Apply environment patches (auth mode, API URL, SSO config)
  4. If auth: create OIDC client and secrets per Prerequisites
  5. If OpenShift with HTTPS to ambient-api-server: trust the service-ca bundle. The API server TLS cert is signed by OpenShift service-ca, not the default SA CA. Create a ConfigMap with inject-cabundle annotation, mount it into the ambient-ui container, and set NODE_EXTRA_CA_CERTS=/etc/ssl/service-ca/service-ca.crt
  6. Add a Route if external access is needed
  7. Verify: kustomize build overlays/<target> | grep -A5 "name: ambient-ui"

HCMAIS Environment (ambient-api namespace)

The hcmais overlay deploys to ambient-api namespace on the HCMAIS ROSA cluster. It includes only: ambient-api-server, ambient-api-server-db, ambient-control-plane, ambient-ui, and postgresql.

Prerequisites

  1. Keycloak client — create ambient-ui client in the ambient-code realm at https://keycloak-ambient-keycloak.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com/admin:
    • Client authentication: ON (confidential)
    • Root URL: https://ambient-ui-ambient-api.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com
    • Valid redirect URIs: https://ambient-ui-ambient-api.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com/api/auth/sso/callback
    • Valid post logout redirect URIs: https://ambient-ui-ambient-api.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com/*
  2. Secrets (create in ambient-api namespace):
    # SSO credentials for ambient-ui
    oc create secret generic sso-credentials -n ambient-api \
      --from-literal=SSO_ISSUER_URL=https://keycloak-ambient-keycloak.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com/realms/ambient-code \
      --from-literal=SSO_CLIENT_ID=ambient-ui \
      --from-literal=SSO_CLIENT_SECRET=<from-keycloak> \
      --from-literal=SESSION_SECRET=$(head -c 32 /dev/urandom | base64 | head -c 32)
  3. Deploy:
    kustomize build components/manifests/overlays/hcmais | oc apply -n ambient-api -f -
  4. Verify:
    oc get pods -n ambient-api
    curl -s https://ambient-ui-ambient-api.apps.rosa.hcmais01ue1.s9m2.p3.openshiftapps.com/api/healthz

Troubleshooting

SymptomFix
Cannot find module '/app/server.js'Copy from .next/standalone/app/
Can't resolve 'ambient-sdk'Build SDK dist in Dockerfile deps stage
Liveness probe 401Use /api/healthz, not /
Client sent HTTP request to HTTPS serverUse https:// in API_SERVER_URL
401 text/plain from API serverToken format mismatch — ensure JWT, not opaque token
Turbopack build failsUse next build --webpack

Verification

  • kustomize build overlays/<target> valid YAML
  • Image references consistent across kustomization, CI, Makefile
  • Pod starts with 0 restarts
  • /api/healthz returns 200
  • API proxy returns data

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.