- Provider — how to deploy a TEE-hardened P-Node on a Confidential VM.
- Consumer — how to verify a provider’s image is genuine and untampered.
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.
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.jsoncontent (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. Downloaddocker-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):
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:
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 supportinglinux/amd64 Docker inside a TEE works.
Step 4: Verify the node is running
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:
- Quick verification at https://secretai.scrtlabs.com/attestation — paste your compose and the VM URL.
- 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 fortee-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.Step 2: Inspect the TEE attestation manifest
Step 3: View all supply-chain artifacts
.sig), attestations (.att), and SBOMs (.sbom).
Step 4: Verify the running provider (SecretVM attestation)
If the provider is on SecretVM:- Go to https://secretai.scrtlabs.com/attestation
- Paste the
docker-compose.tee.yml(exact byte content — see warning above). - Enter the provider’s VM URL or paste their attestation quote.
- Click Verify.
measurements.intel_tdx.rtmr3. Compare it against the value reported by the hardware quote.
Step 5: Verify RTMR3 independently (optional)
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):
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.