- 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.
| Branch | Image tag | Network | Chain ID |
|---|---|---|---|
main | ...-tee:vX.Y.Z / ...-tee:latest | BASE Mainnet | 8453 |
test | ...-tee:vX.Y.Z-test / ...-tee:latest-test | BASE Sepolia | 84532 |
baked_env.network field identifies which variant an image is.
Only 5 variables are configurable at runtime — the per-provider secrets:
| Variable | Description |
|---|---|
WALLET_PRIVATE_KEY | Provider’s wallet private key |
ETH_NODE_ADDRESS | RPC endpoint for BASE Mainnet (e.g., Alchemy, Infura) |
MODELS_CONFIG_CONTENT | JSON model configuration (model IDs, backend URLs, slots) |
WEB_PUBLIC_URL | Public-facing URL for the API (default: http://localhost:8082) |
COOKIE_CONTENT | API auth credentials (default: admin:admin) |
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 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
| Field | What to check |
|---|---|
tee_image | Full image reference with @sha256: digest |
tee_image_digest | Immutable sha256:... of this image |
compose_sha256 | Hash of the deployed compose (digest-pinned) |
compose_image_reference | The exact image@sha256: reference inside the compose |
measurements.intel_tdx.rtmr3 | Expected RTMR3 — compare against live hardware quote |
measurements.intel_tdx.secretvm_release | SecretVM release the RTMR3 was computed against |
build.commit | Git commit that produced this image |
build.run_url | Direct link to the GitHub Actions run |
baked_env.network | mainnet or testnet |
baked_env.PROXY_STORE_CHAT_CONTEXT | Should be false |
baked_env.ENVIRONMENT | Should be production |
baked_env.ETH_NODE_CHAIN_ID | 8453 or 84532 |
baked_env.DIAMOND_CONTRACT_ADDRESS | Diamond proxy for the target network |
baked_env.MOR_TOKEN_ADDRESS | MOR token for the target network |
runtime_secrets_only | The 5 variables that can differ per provider |
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.25 → v0.0.26), the rootfs changes and all RTMR3 values must be recomputed. The CI/CD pipeline is fully variabilized so updating requires only editing .github/tee/secretvm.env.
When to upgrade
SCRT Labs publishes at github.com/scrtlabs/secret-vm-build/releases. No push notifications — check periodically:SCRT Labs sometimes marks new releases as pre-release on GitHub while already deploying them to the SecretVM portal. The
/releases/latest API only returns non-prerelease versions, so always check the full list.How to upgrade
Push and run CI/CD
The pipeline downloads the new rootfs, computes its SHA-256, computes the new RTMR3, and embeds it in the signed manifest.
Pin the rootfs SHA-256
Copy the SHA-256 from the GitHub Actions step summary back into
secretvm.env:Reference
| Resource | Link |
|---|---|
| TEE images on GHCR | https://github.com/orgs/MorpheusAIs/packages?repo_name=Morpheus-Lumerin-Node |
| RTMR3 computation script | proxy-router/scripts/compute-rtmr3.py |
| SecretVM artifact config | .github/tee/secretvm.env |
| Sigstore cosign | https://github.com/sigstore/cosign |
| SCRT Labs reproduce-mr | https://github.com/scrtlabs/reproduce-mr |
| SecretVM documentation | https://docs.scrt.network/secret-network-documentation/secretvm-confidential-virtual-machines |
| SecretVM CLI docs | https://docs.scrt.network/secret-network-documentation/secretvm-confidential-virtual-machines/secretvm-cli |
| SecretVM attestation portal | https://secretai.scrtlabs.com/attestation |
| Phase 2 backend developer reference | proxy-router/docs/tee-backend-verification.md |

