Skip to main content

Deployment

Boundary statement​

A deployment is healthy only when the exact pinned artifact, configuration, secrets, persistence, and dependency path pass functional checks in the target environment. A local build, tag, image name, chart render, or liveness result alone is insufficient.

For supervised workstation/server installation, use the native service guides: macOS, Linux, or Windows. Those packages install the release binary and this React application directly; the container and cluster paths below remain separate deployment contracts.

Diagram in words​

A verified immutable image and operator configuration start the server. The server connects to its application persistence, optional memory store, and configured model provider. /healthz proves the process is alive. /readyz checks configured dependencies. A representative authenticated workflow and genuine model response establish the application path; the probes do not.

Immutable pin​

Prefer the digest recorded in the verified release manifest:

ghcr.io/prometheus-ags/universal-agent-runtime@sha256:<verified-digest>

Never deploy a floating latest tag as the production identity. The committed SurrealDB Compose file names v1.0.0, but the operator must still verify that the tag exists and resolve it to a reviewed digest before deployment.

Docker Compose​

docker-compose.prod.yaml defines UAR, remote SurrealDB, and Redis with persistent volumes. It exposes HTTP on 1906, A2A gRPC on 50051, and the database/cache ports configured by the file.

The checked-in Compose defaults are a template, not production secrets. They include development database credentials and currently default UAR JWT authentication off. Before exposing the stack, override all credentials, require JWT/JWKS authentication, restrict database/cache ports, and pin every image by reviewed version or digest.

docker compose -f docker-compose.prod.yaml --env-file .env config
docker compose -f docker-compose.prod.yaml --env-file .env up -d
curl --fail http://127.0.0.1:1906/healthz
curl --fail http://127.0.0.1:1906/readyz

docker-compose.prod.postgres.yaml is a source-build preview and contains floating third-party/application image tags. Do not treat it as an immutable production deployment until every image is pinned, secrets are replaced, and the postgres-backend build is verified.

Kubernetes and Helm​

k8s/helm/uar can bootstrap UAR with PostgreSQL, SurrealDB, Redis, probes, HPA, network policies, and an optional Gateway API route. Its defaults are not portable production values:

  • uar.image.repository is a placeholder;
  • bundled secret values are placeholders and must be replaced through a real secret-management path;
  • the storage provisioner is GKE-specific;
  • the default replica/HPA settings must match volume access modes and datastore topology.

Render and review before applying:

helm template uar k8s/helm/uar \
--set uar.image.repository=<registry>/universal-agent-runtime \
--set uar.image.tag=<immutable-version>

The repository's active deployment workflow targets an operator-managed Azure AKS environment by replacing only the image and then performing rollout, /readyz, and /healthz validation. It deliberately does not apply this Helm chart or overwrite the cluster's existing configuration and secrets.

Secrets​

At minimum, provide a model/provider selection and credential, a deliberate JWT or JWKS configuration, and persistence credentials/location. Store secrets in the platform's secret manager, not in Git, Compose defaults, Helm values, image layers, or command history. Per-user provider credentials have a separate encryption-key boundary.

Persistence​

Name the owner of every state path before deployment:

StateTypical ownerRequired decision
application resourcesSurrealDB/SurrealKV or PostgreSQLdurable volume/service, backup, restore, vector dimension
memoryoptional Surreal memory service/storeenabled state, credentials, retention, backup
uploadsmounted filesystem pathvolume, limits, cleanup, restore requirements
Redis cacheRedisloss tolerance and external-cache setting
A2A task storecurrent UAR process memoryrestart loss is expected
run/live projectionsruntime manager and browser projectionreload/replay boundary, not an audit ledger

See Recovery and shutdown before changing storage.

Health and functional checks​

  • /healthz — process liveness;
  • /readyz — configured dependency readiness;
  • authenticated resource read/write — API, auth, and persistence path;
  • representative tool-policy decision — governance and trusted-host path;
  • genuine inference — provider/model route and response path.

Provider/model latency and failure are not UAR-owned liveness. Keep those signals separate in dashboards and incident decisions.

Deployment ownership​

GitHub Actions in this repository are deployment execution and deployed-artifact validation only. Routine unit, integration, lint, type, documentation, and conformance checks run locally before commit and push. The Pages workflow may assemble documentation and validate the deployed routes because those steps are the deployment itself.

The AKS workflow owns only its image bump and deployment smoke checks. The cluster configuration, secrets, databases, storage classes, gateway, backups, and rollback decision remain operator-owned.

Profile limits​

This guide covers server deployment. server-full is the complete release claim; minimal is a smaller server and needs its own feature/evidence record. embedded-mobile has no server container or cluster listener and remains the responsibility of its iOS/Android/application host.

Next: Upgrade and rollback.