This document covers two perspectives:
  1. Provider — how to deploy a TEE-hardened P-Node on a Confidential VM.
  2. Consumer — how to verify a provider’s image is genuine and untampered.
For the shortest path to deploying on SecretVM, jump to SecretVM quickstart. For a conceptual overview of the two-hop trust chain, see TEE overview.

What is the TEE image?

The -tee Docker image (ghcr.io/morpheusais/morpheus-lumerin-node-tee) is a hardened version of the standard proxy-router image with all non-secret configuration baked in at build time:
  • Blockchain config (contract addresses, chain ID, blockscout URL) is frozen and cannot be changed at runtime.
  • Chat context storage is disabled (PROXY_STORE_CHAT_CONTEXT=false).
  • Logging is set to production mode (JSON, no color, minimal verbosity).
  • Environment is locked to production.
Two network variants are produced by CI/CD: Both share identical hardened settings; only the baked-in network’s contracts and chain ID differ. The attestation manifest’s baked_env.network field identifies which variant an image is. Only 5 variables are configurable at runtime — the per-provider secrets: Because configuration is frozen in the image, when run inside a TEE (Intel TDX or AMD SEV-SNP) the hardware can measure and attest that the software has not been modified.

Part 1: Provider — Setting up a TEE P-Node

Prerequisites

  • Funded wallet (MOR + ETH) on the target network and access to its private key.
  • An RPC endpoint for the target network (e.g. wss://base-mainnet.g.alchemy.com/v2/<your_key>).
  • Your AI model backend reachable on a private endpoint.
  • A models-config.json content (see models-config schema).
  • Access to a Confidential VM provider supporting Intel TDX or AMD SEV-SNP (e.g., SecretVM).
Mainnet vs testnet: Use the mainnet TEE image (:latest or versioned tag without -test) for production. Use testnet (:latest-test / *-test tags) on Base Sepolia. Substitute the testnet image and a Sepolia RPC if testing.

Step 1: Prepare the Docker Compose file

Each CI/CD build produces a deployed compose file that pins the TEE image by immutable SHA-256 digest. RTMR3 is computed from the exact compose content. Download docker-compose.tee.deployed.yml from the GitHub Release for your target version, or use the template at proxy-router/docker-compose.tee.yml and fill in the digest yourself. The deployed compose looks like (digest differs per version):
The only line that changes between versions is the proxy-router image digest. The Traefik sidecar, TLS config, and network setup stay constant.
Why digest, not tag? Tags are mutable. The digest (@sha256:...) is an immutable content hash. Using the digest in the compose file guarantees RTMR3 is cryptographically bound to one specific image binary.Exact byte content matters. The compose file must end with exactly one newline after proxy_data: null. RTMR3 is computed from the exact byte content — a single extra or missing byte changes the hash. The SecretVM portal normalizes trailing whitespace down to one newline, so pasting as-is is safe.
Published images and digests: GHCR packages.

Step 2: Prepare your secrets

Set 5 values in your TEE platform’s encrypted secrets section:
MODELS_CONFIG_CONTENT must be a single-line JSON string:
Schema: models-config.json.

Step 3: Deploy on SecretVM (or other TEE platform)

For SecretVM specifics (web portal vs CLI, advanced features, recommended platform = Intel TDX), see SecretVM quickstart. For other TEE platforms, consult their documentation for Docker Compose with encrypted secret injection. The image and compose are platform-agnostic — any environment supporting linux/amd64 Docker inside a TEE works.

Step 4: Verify the node is running

Expected:
Then proceed with Register on chain — prefer MyProvider on SecretVM; bid on an existing tee model when one exists, otherwise mint with the tee tag.

Step 5: Verify attestation (SecretVM)

After deployment, SecretVM exposes attestation endpoints on :29343. Verify your own deployment:
  1. Quick verification at https://secretai.scrtlabs.com/attestation — paste your compose and the VM URL.
  2. Programmatic verification — see Part 2.

Part 2: Consumer — Verifying a TEE provider image

As a consumer you can independently verify a provider before using it. Verification will eventually be built into the C-Node automatically for tee-tagged models, but you can do it manually today.

Install cosign

Step 1: Verify the image signature

Confirms the image was built by the official MorpheusAIs CI/CD pipeline.
Successful output mentions: cosign claims validated, transparency log verified, code-signing cert verified by trusted CA. The output JSON includes the exact GitHub commit, branch, and workflow that produced the image. If verification fails, do not trust the image.

Step 2: Inspect the TEE attestation manifest

Key fields:

Step 3: View all supply-chain artifacts

Shows signatures (.sig), attestations (.att), and SBOMs (.sbom).

Step 4: Verify the running provider (SecretVM attestation)

If the provider is on SecretVM:
  1. Go to https://secretai.scrtlabs.com/attestation
  2. Paste the docker-compose.tee.yml (exact byte content — see warning above).
  3. Enter the provider’s VM URL or paste their attestation quote.
  4. Click Verify.
Three layers must pass: hardware (genuine Intel TDX / AMD SEV-SNP), VM (firmware + kernel + initramfs match a known SecretVM release), software (RTMR3: rootfs + Docker Compose match what was deployed). The expected RTMR3 is published in the signed manifest at measurements.intel_tdx.rtmr3. Compare it against the value reported by the hardware quote.

Step 5: Verify RTMR3 independently (optional)

Output should match measurements.intel_tdx.rtmr3. If not, check that you’re using the same rootfs version as the CI/CD build.

What this guarantees (and what it does not)

See the conceptual breakdown in TEE overview, which mirrors and summarizes the per-phase guarantees and remaining gaps documented here.

Upgrading SecretVM artifacts

When SCRT Labs publishes a new SecretVM release (e.g. v0.0.31 → v0.0.32), the rootfs changes and all RTMR3 / SEV measurements must be recomputed. The CI/CD pipeline is fully variabilized so updating requires only editing .github/tee/secretvm.env.

When to upgrade

Source of truth for the Production artifacts version is the SecretVM portal. Cross-check digests against the published secretvm-verify package (data/tdx.csv / data/sev.json — also on PyPI):
Bump SECRETVM_VERIFY_NPM_VERSION (and the registry URLs) when SCRT publishes a newer package that includes the release you are pinning.

How to upgrade

1

Edit secretvm.env

SECRETVM_ROOTFS_VARIANT stays rootfs-prod unless naming changes. ISO download URLs are optional; CI uses the pinned SHA when the ISO host is unavailable.
2

Push and run CI/CD

The pipeline fetches the registries from the npm CDN, verifies the pins match, computes RTMR3 (from the pin or ISO) and SEV measurements, and embeds them in the signed manifest.
3

Rebuild providers

Providers running older SecretVM versions will have mismatched measurements. They should redeploy on the current SecretVM release.
Always use the prod rootfs variant. SecretVM runs “environment prod” even for developer-portal deployments. Using dev produces a wrong RTMR3.

Reference