Deployment options
ai-agents-observability can be deployed several ways depending on your security, governance, and infrastructure constraints. This page is the entry point — pick the path that matches your constraints, then follow the linked runbook.
Decision matrix
| Constraint | Primary path | Secondary | Runbook |
|---|---|---|---|
| Standard / homelab | Pre-built images from GHCR + Docker Compose | — | README.md |
| Internal registry only | Helm chart with image.registry set to internal |
Registry sync recipe (below) | kubernetes.md |
| Supply-chain compliance | cosign + SBOM + GitHub build provenance | Internal registry re-scan | Verification |
| Air-gapped / no outbound | OCI tarball release + docker load |
Helm chart with pullPolicy: IfNotPresent |
air-gapped.md |
| Kubernetes mandate | Helm chart | — | kubernetes.md |
| No external image trust | Build from source | Helm chart with locally-built images | build-from-source.md |
| No container runtime | Server binaries + web tarball | — | binaries.md |
| Hook binary distribution | GitHub Releases | curl | sh install script |
hook-binary.md |
Available paths
1. Pre-built images + Docker Compose (default)
The standard path. Images are published to ghcr.io/yorch/ai-agents-observability/*
for each approved release. Production uses .env.production, never the host-native
.env development file.
just prod-init# Fill the required values and choose one release tag in .env.production.just prod-keysjust prod-configjust prod-upThe equivalent command without just is:
APP_ENV_FILE=.env.production docker compose --env-file .env.production \ -f docker-compose.infra.yml -f docker-compose.prod.yml up -dCompose v2.30 or newer is required for raw service env files, which preserve literal
$ characters in application secrets. Values Compose interpolates into the model
(such as bundled database and MinIO credentials) must represent a literal $ as $$.
See README.md for the full setup guide.
For an existing Traefik instance, set DOMAIN_APP, DOMAIN_INGEST, DOMAIN_GITHUB,
and DOMAIN_GRAFANA, then run:
just prod-traefik-upThe Traefik overlay publishes no container ports on the host. It exposes web, GitHub
webhooks, ingest, and Grafana through HTTPS domains; PostgreSQL, MinIO, and Prometheus
remain internal. Metrics routes are not exposed through Traefik. Only /health,
/v1/events, and /v1/transcripts/:id are routed on the ingest domain; the GitHub
service domain similarly allows only /health and /webhooks/github. Set
INGEST_BASE_URL=https://$DOMAIN_INGEST on developer machines.
The external Traefik websecure entrypoint must not trust arbitrary client-supplied
forwarded headers. Keep forwardedHeaders.insecure disabled; if another proxy is in
front of Traefik, configure its CIDRs with forwardedHeaders.trustedIPs instead.
2. Build from source
Clone the repo at a pinned tag and build all four images locally. No external image trust required.
just prod-source-upSee build-from-source.md.
3. Air-gapped (OCI tarball release)
For every approved release, CI publishes each image as an OCI archive (.tar) + checksums + SBOM to the GitHub Release. Download, verify, docker load, and deploy with no outbound network.
See air-gapped.md.
4. Kubernetes (Helm chart)
A Helm chart packages all four services + TimescaleDB + MinIO. Supports internal registries, external DB/S3, ingress, and air-gapped deployments.
helm install ai-agents-observability deploy/helm/ai-agents-observability/ -f my-values.yamlSee kubernetes.md.
5. Server binaries + web tarball (no container runtime)
Ingest and github-app are compiled as standalone Bun binaries (~70 MB each). The web app is packaged as a Next.js standalone tarball (~16 MB, requires Node >= 24). Migrations still need Docker or Bun from source. Deploy directly on VMs, bare metal, or under systemd.
# Download from GitHub Releasesgh release download v1.0.0 --repo yorch/ai-agents-observability \ --pattern "ingest-server-linux-x64" \ --pattern "github-app-server-linux-x64" \ --pattern "web-standalone-*.tar.gz"See binaries.md.
6. Hook binary distribution
The aiot hook binary is published to GitHub Releases with per-platform binaries + checksums. Mac binaries are codesigned + notarized when Apple signing secrets are configured.
curl -fsSL https://raw.githubusercontent.com/yorch/ai-agents-observability/main/scripts/install.sh | bashSee hook-binary.md.
Internal registry sync recipe
If org policy requires images to live in your internal registry (Harbor, Artifactory, ECR, GAR, ACR), sync from GHCR on each release:
#!/bin/bashTAG=$1INTERNAL_REGISTRY="harbor.internal.corp.com"REPO="ai-agents-observability"
for COMPONENT in web ingest github-app migrations-runner; do SRC="ghcr.io/yorch/ai-agents-observability/${COMPONENT}:${TAG}" DST="${INTERNAL_REGISTRY}/${REPO}/${COMPONENT}:${TAG}"
# Pull, re-tag, push docker pull "${SRC}" docker tag "${SRC}" "${DST}" docker push "${DST}"
# Verify signature (if cosign is available) cosign verify "${SRC}" \ --certificate-identity "https://github.com/yorch/ai-agents-observability/.github/workflows/docker.yml@refs/heads/main" \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
echo "Synced ${COMPONENT}:${TAG}"doneThen point your deployment at the internal registry:
- Docker Compose: set
APP_IMAGE_WEB=harbor.internal.corp.com/ai-agents-observability/web:v1.0.0(etc.) in.env.production - Helm: set
image.registry: harbor.internal.corp.com/ai-agents-observabilityinvalues.yaml
Note: cosign signatures don’t follow images through a re-push. Re-sign in your internal registry, or verify the source image’s signature before re-pushing.
Verifying supply-chain attestations
Every image published to GHCR is signed with cosign (keyless via GitHub OIDC) and has an SBOM (CycloneDX) and a GitHub build-provenance attestation.
Verify image signature
cosign verify ghcr.io/yorch/ai-agents-observability/web:v1.0.0 \ --certificate-identity "https://github.com/yorch/ai-agents-observability/.github/workflows/docker.yml@refs/heads/main" \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com"Verify build provenance
docker login ghcr.iogh attestation verify \ oci://ghcr.io/yorch/ai-agents-observability/web:v1.0.0 \ --repo yorch/ai-agents-observabilityDownload SBOM
SBOMs are attached to each GitHub Release as sbom-<component>-<tag>.json (CycloneDX format). Download with:
gh release download v1.0.0 --repo yorch/ai-agents-observability --pattern "sbom-*.json"Files
| File | Purpose |
|---|---|
.env.production.example |
Production-only environment template |
Justfile |
Named local-development and production Compose workflows |
docker-compose.prod.yml |
Pre-built image deployment (default) |
docker-compose.self-hosted.yml |
Build-from-source overlay |
docker-compose.traefik.yml |
Traefik reverse proxy overlay |
docker-compose.watchtower.yml |
Auto-update overlay |
deploy/helm/ai-agents-observability/ |
Helm chart for Kubernetes |
scripts/install.sh |
Hook binary install script |
scripts/package-web.sh |
Web tarball packaging script |