Set DOMAIN to your custom domain and TARGET_ENDPOINT to your app’s internal endpoint. TARGET_ENDPOINT tells dstack-ingress where to forward incoming traffic:
app:80 - Forward to service named “app” on port 80
api:3000 - Forward to service named “api” on port 3000
http://app:80 and grpc://app:50051 are also accepted, but the protocol prefix is stripped before proxying
Use the service name from docker-compose, not localhost
dstack-ingress is a HAProxy-based L4/TCP proxy. It terminates TLS and forwards the TCP stream to TARGET_ENDPOINT; it does not apply Nginx-style HTTP redirects, header rules, body limits, or buffering settings. Put HTTP-specific behavior in your application or in a separate HTTP proxy behind TARGET_ENDPOINT if needed.
GATEWAY_DOMAIN becomes your domain’s CNAME target, and its first label must
start with a letter or digit. Android rejects a leading underscore, so the
older _.${DSTACK_GATEWAY_DOMAIN} form resolves everywhere except Android —
change it to gateway.${DSTACK_GATEWAY_DOMAIN} if your deployment still has it.
CAA records restrict certificate issuance to the TEE managed Let’s Encrypt account
Only certificates requested from within your TEE can be issued
Certificate transparency logs can be monitored for unauthorized certificates
Cloudflare Users: Cloudflare automatically overrides CAA records at the apex domain (e.g., example.com). This prevents domain attestation from working correctly.Solution options:
Use a subdomain (recommended): Deploy to app.example.com instead of example.com
DNS not propagating: Wait 2-5 minutes for DNS changes to propagate globally.Certificate request failed: Verify your API token has permission to edit DNS records.Connection refused: Ensure TARGET_ENDPOINT points to the correct service:port.CAA record conflicts: Some providers (like Linode) don’t allow CAA and CNAME on the same subdomain. The system will automatically use A records instead.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Phala","colors":{"primary":"#527a08","light":"#527a08","dark":"#cdfa50"},"logo":{"light":"https://mintcdn.com/phalanetwork-1606097b/Y2wR1-jOsoYpAL6q/images/phala-light.png?fit=max\u0026auto=format\u0026n=Y2wR1-jOsoYpAL6q\u0026q=85\u0026s=fb4f438a36865810867d188289681376","dark":"https://mintcdn.com/phalanetwork-1606097b/Y2wR1-jOsoYpAL6q/images/phala-dark.png?fit=max\u0026auto=format\u0026n=Y2wR1-jOsoYpAL6q\u0026q=85\u0026s=c80d03f4a9b6db1a9aa8f435a980a7a3"},"favicon":"https://mintcdn.com/phalanetwork-1606097b/RUscSf7Rplq7j02n/favicon.ico?fit=max\u0026auto=format\u0026n=RUscSf7Rplq7j02n\u0026q=85\u0026s=701b1391404cffa588fcc80dd945d79e","navbar":{"links":[{"href":"https://github.com/Phala-Network/phala-cloud","label":"GitHub"},{"href":"https://cloud.phala.com/login","label":"Log in"}],"primary":{"type":"button","label":"API Dashboard","href":"https://cloud.phala.com"}},"footer":{"socials":{"discord":"https://phala.com/discord","github":"https://phala.com/github","linkedin":"https://phala.com/linkedin","x":"https://phala.com/x"},"links":[{"header":"Phala Cloud","items":[{"label":"Getting Started","href":"https://docs.phala.network/phala-cloud/getting-started/overview"},{"label":"TEEs, Attestation \u0026 Zero Trust Security","href":"https://docs.phala.network/phala-cloud/attestation/overview"},{"label":"Phala Cloud User Guides","href":"https://docs.phala.network/phala-cloud/phala-cloud-user-guides/create-cvm/overview"},{"label":"Be Production Ready","href":"https://docs.phala.network/phala-cloud/be-production-ready/overview"},{"label":"Use Cases","href":"https://docs.phala.network/phala-cloud/use-cases/overview"},{"label":"References","href":"https://docs.phala.network/phala-cloud/references/overview"},{"label":"Private AI","href":"https://docs.phala.network/phala-cloud/gpu-tee/llm-in-tee"},{"label":"FAQs","href":"https://docs.phala.network/phala-cloud/faqs"}]},{"header":"dstack","items":[{"label":"Overview","href":"https://docs.phala.network/dstack/overview"},{"label":"Local Development","href":"https://docs.phala.network/dstack/local-development"},{"label":"Getting Started","href":"https://docs.phala.network/dstack/getting-started"},{"label":"Hardware Requirements","href":"https://docs.phala.network/dstack/hardware-requirements"},{"label":"Acknowledgement","href":"https://docs.phala.network/dstack/acknowledgement"},{"label":"FAQs","href":"https://docs.phala.network/dstack/faqs"},{"label":"Design Documents","href":"https://docs.phala.network/dstack/design-documents"},{"label":"Cloud Overview","href":"https://docs.phala.network/dstack-cloud/overview"},{"label":"Cloud Quick Start","href":"https://docs.phala.network/dstack-cloud/get-started"}]},{"header":"Private AI","items":[{"label":"LLM in GPU TEE","href":"https://docs.phala.network/phala-cloud/confidential-ai/overview"},{"label":"GPU TEE Inference API","href":"https://docs.phala.network/phala-cloud/confidential-ai/confidential-model/confidential-ai-api"},{"label":"Benchmark","href":"https://docs.phala.network/phala-cloud/confidential-ai/benchmark"},{"label":"FAQs","href":"https://docs.phala.network/phala-cloud/confidential-ai/faqs"}]},{"header":"Network","items":[{"label":"Overview","href":"https://docs.phala.network/network/index"},{"label":"Phala Network","href":"https://docs.phala.network/network/overview/phala-network"},{"label":"Staking","href":"https://docs.phala.network/network/overview/phala-staking"},{"label":"Compute Providers","href":"https://docs.phala.network/network/compute-providers/introduction"}]}]},"seo":{"metatags":{"author":"Phala Cloud","canonical":"https://docs.phala.com","category":"Technology","distribution":"global","keywords":"Phala Cloud, TEE, Trusted Execution Environment, Confidential Computing, Private AI, confidential AI, GPU TEE, Intel TDX, dstack, blockchain, privacy-preserving computing, secure cloud, attestation","language":"en","og:image":"https://raw.githubusercontent.com/Phala-Network/phala-docs/main/images/phala-docs-og.png","og:image:alt":"Phala Cloud — Confidential Computing \u0026 GPU TEE for AI","og:image:width":"1200","og:image:height":"630","og:site_name":"Phala Docs","og:type":"website","og:title":"Phala Cloud Documentation — Private AI on TEE","og:description":"Deploy confidential AI applications on Phala Cloud with hardware-level privacy via Intel TDX, NVIDIA H100 GPU TEE, and verifiable attestation.","robots":"index, follow","twitter:card":"summary_large_image","twitter:creator":"@PhalaNetwork","twitter:site":"@PhalaNetwork","twitter:image":"https://raw.githubusercontent.com/Phala-Network/phala-docs/main/images/phala-docs-og.png","twitter:title":"Phala Cloud Documentation — Private AI on TEE","twitter:description":"Deploy confidential AI applications on Phala Cloud with hardware-level privacy via Intel TDX, NVIDIA H100 GPU TEE, and verifiable attestation."},"indexing":"all"},"icons":{"library":"lucide"},"styling":{"codeblocks":"system","latex":true},"integrations":{"ga4":{"measurementId":"G-RHRW9RL5LG"},"gtm":{"tagId":"GTM-TX3VQZP"}},"errors":{"404":{"redirect":false}},"contextual":{"options":["copy","view","chatgpt","claude","mcp"],"display":"header"},"thumbnails":{"background":"https://mintcdn.com/phalanetwork-1606097b/Z_xV6g4Cdei2rfqm/images/phala-docs-og.png?fit=max\u0026auto=format\u0026n=Z_xV6g4Cdei2rfqm\u0026q=85\u0026s=e0d65106aa4afa7766452b497d5ec9ca"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"phalanetwork-1606097b","hasAudioNarration":false,"actualSubdomain":"phalanetwork-1606097b","customDomains":["docs.phala.com"],"gitSource":{"type":"github","owner":"phala-network","repo":"phala-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{},"buildId":"6aef6c6fd5518ba96e46813a","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Phala Cloud","count":652},{"language":"default","tag":"API \u0026 SDK","count":163},{"language":"default","tag":"Phala Cloud API","count":110},{"language":"default","tag":"Private AI","count":100},{"language":"default","tag":"Phala Cloud CLI","count":85},{"language":"default","tag":"CVMs","count":54},{"language":"default","tag":"Resources","count":42},{"language":"default","tag":"dstack Cloud","count":22},{"language":"default","tag":"JavaScript SDK","count":22},{"language":"default","tag":"Apps","count":20}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"fonts.css","content":"@font-face{font-family:\"ABCArizonaFlare\";src:url(\"/fonts/exa/ABCArizonaFlare-Regular.woff2\") format(\"woff2\");font-style:normal;font-weight:400 700;font-display:block}@font-face{font-family:\"ABCDiatype\";src:url(\"/fonts/exa/ABCDiatype-Regular.woff2\") format(\"woff2\");font-style:normal;font-weight:400 700;font-display:block}@font-face{font-family:\"SuisseIntlMono\";src:url(\"/fonts/exa/SuisseIntlMono-Regular-WebTrial.woff2\") format(\"woff2\");font-style:normal;font-weight:400 700;font-display:block}@font-face{font-family:\"ABCArizonaFlare Fallback\";src:local(\"Georgia\"), local(\"Times New Roman\");size-adjust:94%;ascent-override:95%;descent-override:22%;line-gap-override:0%}@font-face{font-family:\"ABCDiatype Fallback\";src:local(\"Trebuchet MS\"), local(\"Arial\");size-adjust:97%;ascent-override:92%;descent-override:23%;line-gap-override:0%}@font-face{font-family:\"SuisseIntlMono Fallback\";src:local(\"SFMono-Regular\"), local(\"Consolas\"), local(\"Menlo\"),\n local(\"Liberation Mono\");size-adjust:100%;ascent-override:90%;descent-override:22%;line-gap-override:0%}:root{--v3-heading: \"ABCArizonaFlare\", \"ABCArizonaFlare Fallback\", Georgia, serif;--v3-body: \"ABCDiatype\", \"ABCDiatype Fallback\", \"Trebuchet MS\", Arial,\n sans-serif;--v3-mono: \"SuisseIntlMono\", \"SuisseIntlMono Fallback\", \"SFMono-Regular\",\n Consolas, monospace}body,input,button,select,textarea{font-family:var(--v3-body)}h1,h2{font-family:var(--v3-heading);font-weight:400;letter-spacing:0}h3,h4,h5,h6{font-family:var(--v3-body);font-weight:600;letter-spacing:0}code,pre,kbd,samp,.font-mono{font-family:var(--v3-mono)}"},{"filePath":"style.css","content":":root{--base-50: oklch(0.983 0.0034 145.55);--base-100: oklch(0.9691 0.0037 146.57);--base-200: oklch(0.9258 0.0048 147.01);--base-300: oklch(0.869 0.0054 148);--base-400: oklch(0.7067 0.0061 149.29);--base-500: oklch(0.5535 0.0066 150.55);--base-600: oklch(0.4449 0.0065 151.33);--base-700: oklch(0.3731 0.0059 150.75);--base-800: oklch(0.2731 0.0051 150.35);--base-900: oklch(0.2123 0.0048 151.01);--base-950: oklch(0.1386 0.0044 150.49);--base-1000: oklch(0.0909 0.0041 150.95);--primary-300: #cdfa50;--primary-500: oklch(0.7708 0.2308 126.52);--primary-600: oklch(0.6514 0.1967 127.14);--primary-700: oklch(0.5343 0.1568 126.91);--phala-blue-50: #f0f2ff;--phala-blue-100: #d5dbf8;--phala-blue-200: #bfc8f0;--phala-blue-300: #aabbff;--phala-blue-500: #6b80cc;--phala-blue-900: #2d3250;--phala-purple-300: #b88fd0;--phala-purple-500: #7e3daf;--phala-orange-300: #f5902c;--surface-marketing: #f7f8f3;--surface-marketing-cool: #f0f1ec;--surface-marketing-light: #fbfcf8;--surface-trust-path: #070908;--surface-trust-card: #101310;--radius: 4px}button,a[role=\"button\"],.btn,[class*=\"button\"]{border-radius:4px!important}[class*=\"Card\"],[class*=\"Callout\"],[class*=\"Note\"],[class*=\"Warning\"],[class*=\"Tip\"],[class*=\"Info\"],[class*=\"Frame\"],[class*=\"Update\"],pre,.code,.callout,.card{border-radius:0!important}[class*=\"badge\"]:not([class*=\"dot\"]),[class*=\"Badge\"]:not([class*=\"Dot\"]),[class*=\"pill\"],[class*=\"Pill\"]{border-radius:4px!important}[class*=\"Card\"]:not([class*=\"card-group\"]),[class*=\"Callout\"],[class*=\"Note\"],[class*=\"Warning\"],[class*=\"Tip\"],[class*=\"Info\"],[class*=\"Frame\"],[class*=\"Update\"],.callout,.card{box-shadow:none!important;border-width:1px!important}.card-group,[class*=\"card-group\"]{border:0!important;background:transparent!important;box-shadow:none!important;padding:0!important;border-radius:0!important;gap:1px!important}a[role=\"button\"],.btn,button.button,button[data-component=\"button\"]{min-height:44px;padding-inline:1rem;border-radius:4px!important;box-shadow:none!important;font-family:var(--v3-body, \"ABCDiatype\", \"Trebuchet MS\", Arial, sans-serif);font-weight:500;letter-spacing:0;transition:opacity 150ms ease, background-color 150ms ease,\n border-color 150ms ease}a[role=\"button\"]:hover,.btn:hover,button.button:hover,button[data-component=\"button\"]:hover{opacity:0.9;box-shadow:none!important}button{border-radius:4px!important}@media (min-width: 1024px){#sidebar,aside[id=\"sidebar\"],aside.sidebar,[class*=\"sidebar-content\"]{padding-top:1rem!important}}.sidebar-group-header{font-family:var(--v3-body, \"ABCDiatype\", sans-serif)!important;font-size:14px!important;font-weight:600!important;letter-spacing:0!important;color:var(--base-800)!important;margin-top:1.75rem!important;margin-bottom:0.5rem!important}.sidebar-group-header:first-child{margin-top:0!important}.dark .sidebar-group-header,[data-theme=\"dark\"] .sidebar-group-header{color:var(--base-100)!important}li[id^=\"/\"]>a,li[data-title]>a,.sidebar-group li>a,.sidebar-group li>button{font-size:13.5px!important;font-weight:400!important;color:var(--base-600)!important;border-radius:4px!important;outline:0!important;outline-offset:0!important}li[id^=\"/\"]>a:hover,li[data-title]>a:hover,.sidebar-group li>a:hover,.sidebar-group li>button:hover{color:var(--primary-700)!important;background-color:rgba(0, 0, 0, 0.03)!important}li[id^=\"/\"]>a:hover svg,li[data-title]>a:hover svg,.sidebar-group li>a:hover svg,.sidebar-group li>button:hover svg{color:var(--primary-700)!important;background-color:var(--primary-700)!important}.dark li[id^=\"/\"]>a,.dark li[data-title]>a,[data-theme=\"dark\"] li[id^=\"/\"]>a{color:var(--base-400)!important}.dark li[id^=\"/\"]>a:hover,.dark li[data-title]>a:hover,[data-theme=\"dark\"] li[id^=\"/\"]>a:hover{color:var(--primary-300)!important;background-color:rgba(255, 255, 255, 0.05)!important}li[data-active=\"true\"]>a,a[aria-current=\"page\"]{background-color:var(--surface-marketing-cool)!important;background-image:none!important;color:var(--base-800)!important;font-weight:500!important;text-shadow:none!important;border-radius:4px!important;--tw-bg-opacity: 1 !important}li[data-active=\"true\"]>a:hover{background-color:var(--surface-marketing-cool)!important;color:var(--base-800)!important}.dark li[data-active=\"true\"]>a,.dark a[aria-current=\"page\"],[data-theme=\"dark\"] li[data-active=\"true\"]>a{background-color:rgba(255, 255, 255, 0.08)!important;color:var(--base-100)!important}.nav-tabs-item[data-active=\"true\"],a.nav-tabs-item[data-active=\"true\"]{color:var(--primary-700)!important}@media (min-width: 768px){#table-of-contents-layout{display:flex!important}}#table-of-contents-layout{border-left:1px solid var(--base-200);padding-left:1.25rem!important}.dark #table-of-contents-layout,[data-theme=\"dark\"] #table-of-contents-layout{border-left-color:var(--base-800)}#table-of-contents h2{font-size:14px!important;margin:0!important}#table-of-contents>button,#table-of-contents h2 button,#table-of-contents-layout #table-of-contents>:first-child:not(nav):not(ul):not(ol),#table-of-contents-layout>:first-child:not(:has(#table-of-contents)):not(nav):not(ul):not(ol),#table-of-contents-layout>:first-child>:first-child:not(#table-of-contents):not(nav):not(ul):not(ol){font-family:var(--font-sans, \"Inter\", system-ui, sans-serif)!important;font-size:14px!important;line-height:1.25rem!important;font-weight:500!important;letter-spacing:0!important;text-transform:none!important;color:var(--base-600)!important}#table-of-contents-layout #table-of-contents>:first-child:not(nav):not(ul):not(ol) :is(span,div,p,h2,h3,h4,h5,h6),#table-of-contents-layout>:first-child:not(:has(#table-of-contents)):not(nav):not(ul):not(ol) :is(span,div,p,h2,h3,h4,h5,h6),#table-of-contents-layout>:first-child>:first-child:not(#table-of-contents):not(nav):not(ul):not(ol) :is(span,div,p,h2,h3,h4,h5,h6){font:inherit!important;letter-spacing:inherit!important;text-transform:inherit!important;color:inherit!important;line-height:inherit!important}.toc-item>a{font-size:13px!important;letter-spacing:0!important;text-transform:none!important;font-family:var(--font-sans, \"Inter\", system-ui, sans-serif)!important;color:var(--base-600)!important}.toc-item>a:hover{color:var(--base-800)!important}.toc-item.is-active>a,.toc-item[data-active=\"true\"]>a,.toc a[aria-current=\"true\"]{color:var(--primary-700)!important;font-weight:500!important}.toc-item[data-depth=\"1\"]{padding-left:1rem}.dark .toc-item>a,[data-theme=\"dark\"] .toc-item>a{color:var(--base-400)!important}.eyebrow,.eyebrow.text-primary,[class*=\"eyebrow\"][class*=\"text-primary\"]{color:var(--primary-600)!important}.dark .eyebrow,.dark .eyebrow.text-primary,[data-theme=\"dark\"] .eyebrow{color:var(--primary-300)!important}article .text-primary,article [class~=\"text-primary\"],article [class*=\"text-primary\"]:not([class*=\"dark:\"]),main .text-primary,main [class~=\"text-primary\"]{color:var(--primary-700)!important}html:not(.dark) body:not(.dark) :is(main,article) [class*=\"cdfa50\"],html:not(.dark) body:not(.dark) :is(main,article) [style*=\"cdfa50\"i]{color:var(--primary-700)!important}article .bg-primary,article [class~=\"bg-primary\"],article [class*=\"bg-primary\"]:not([class*=\"dark:\"]),main .bg-primary,main [class~=\"bg-primary\"]{background-color:var(--primary-700)!important}.dark article .text-primary,.dark article [class~=\"text-primary\"],[data-theme=\"dark\"] article .text-primary,[data-theme=\"dark\"] article [class~=\"text-primary\"],.dark main .text-primary,[data-theme=\"dark\"] main .text-primary{color:var(--primary-300)!important}.dark article .bg-primary,.dark article [class~=\"bg-primary\"],[data-theme=\"dark\"] article .bg-primary,[data-theme=\"dark\"] article [class~=\"bg-primary\"],.dark main .bg-primary,[data-theme=\"dark\"] main .bg-primary{background-color:var(--primary-300)!important}main,article,[class*=\"content\"],[class*=\"Content\"]{max-width:100%}:is(main,article) h1{font-size:32px!important;line-height:1.16!important;font-weight:500!important;letter-spacing:0!important;margin-bottom:1rem!important}:is(main,article) h2{font-size:22px!important;line-height:1.26!important;font-weight:500!important;letter-spacing:0!important;margin-top:2.25rem!important;margin-bottom:0.85rem!important}:is(main,article) h3{font-size:18px!important;line-height:1.3!important;font-weight:600!important;letter-spacing:0!important;margin-top:1.75rem!important;margin-bottom:0.65rem!important}:is(main,article) h4,:is(main,article) h5,:is(main,article) h6{font-weight:600!important;letter-spacing:0!important}p,li{font-size:15px;line-height:1.65}:not(pre)>code{font-family:var(--v3-mono, \"SuisseIntlMono\", monospace);font-size:0.92em;border:1px solid var(--base-200);border-radius:2px;padding:1px 5px}pre{border-radius:0!important;font-family:var(--v3-mono, \"SuisseIntlMono\", monospace);font-size:13px;line-height:1.6}.code-block,div[class~=\"code-block\"],.code-group,div[class~=\"code-group\"]{border-radius:0!important;box-shadow:none!important;overflow:hidden!important}.code-block-background,[class*=\"code-block-background\"],.code-group{border-radius:0!important;box-shadow:none!important;background-color:var(--phala-blue-50)!important}.code-block-background,[class*=\"code-block-background\"]{border:0!important}.dark .code-block-background,.dark .code-group,[data-theme=\"dark\"] .code-block-background,[data-theme=\"dark\"] .code-group{background-color:var(--surface-trust-card)!important}.code-group [role=\"tab\"][data-state=\"active\"],.code-group [role=\"tab\"][aria-selected=\"true\"]{color:var(--primary-600)!important}.code-group [role=\"tab\"][data-state=\"active\"]>div:first-child{color:var(--primary-600)!important}.code-group [role=\"tab\"][data-state=\"active\"]>div.absolute,.code-group [role=\"tab\"][data-state=\"active\"]>div[class*=\"absolute\"][class*=\"bottom\"]{background-color:var(--primary-600)!important;border-radius:0!important}.dark .code-group [role=\"tab\"][data-state=\"active\"],[data-theme=\"dark\"] .code-group [role=\"tab\"][data-state=\"active\"]{color:var(--primary-300)!important}.dark .code-group [role=\"tab\"][data-state=\"active\"]>div.absolute,[data-theme=\"dark\"] .code-group [role=\"tab\"][data-state=\"active\"]>div.absolute{background-color:var(--primary-300)!important}[data-fade-overlay]{display:none!important}.card{border-radius:0!important;box-shadow:none!important;--tw-ring-shadow: 0 0 #0000 !important;--tw-ring-offset-shadow: 0 0 #0000 !important}.card:hover{box-shadow:none!important;border-color:var(--primary-600)!important}.card svg.bg-primary,.card svg[class*=\"bg-primary\"]:not([class*=\"primary-light\"]),.card .text-primary{background-color:var(--primary-600)!important;color:var(--primary-600)!important}.dark .card svg.bg-primary,.dark .card svg[class*=\"bg-primary\"],[data-theme=\"dark\"] .card svg.bg-primary{background-color:var(--primary-300)!important;color:var(--primary-300)!important}.callout{border-radius:0!important;background-color:var(--card, #ffffff)!important;border-width:0!important;border-left:4px solid var(--phala-blue-500)!important;padding:1rem 1.25rem!important;box-shadow:none!important}.callout[data-callout-type=\"warning\"]{border-left-color:var(--phala-orange-300)!important}.callout[data-callout-type=\"info\"]{border-left-color:var(--phala-blue-500)!important}.callout[data-callout-type=\"tip\"]{background-color:var(--phala-blue-300)!important;border-left-color:var(--phala-blue-500)!important}.callout [data-component-part=\"callout-content\"],.callout [data-component-part=\"callout-content\"] *{color:var(--base-800)!important}.callout [data-component-part=\"callout-content\"]>span:first-child>strong:only-child{font-family:var(--v3-mono, \"SuisseIntlMono\", monospace);font-size:11px;font-weight:400;letter-spacing:0.08em;text-transform:uppercase;display:block;margin-bottom:0.25rem;color:var(--base-600)!important}.callout[data-callout-type=\"warning\"] [data-component-part=\"callout-content\"] strong{font-weight:400}.callout [data-component-part=\"callout-icon\"] svg{color:var(--base-600)!important;opacity:0.7}a[href*=\"cloud.phala.com\"]>span.absolute,a[href*=\"cloud.phala.com\"]>span[class*=\"absolute\"][class*=\"inset-0\"]{background-color:var(--primary-300)!important;background-image:none!important;border-radius:4px!important;box-shadow:none!important}a[href*=\"cloud.phala.com\"] span[class*=\"text-white\"],a[href*=\"cloud.phala.com\"] .z-10{color:#000!important}a[href*=\"cloud.phala.com\"] span[class*=\"text-white\"]~svg,a[href*=\"cloud.phala.com\"] svg.text-white\\/90,a[href*=\"cloud.phala.com\"] svg[class*=\"text-white\"],a[href*=\"cloud.phala.com\"] svg path{color:#000!important;stroke:#000!important}a[href*=\"cloud.phala.com\"][target=\"_blank\"]{font-family:var(--v3-body, \"ABCDiatype\", sans-serif);font-weight:500;letter-spacing:0}a[href*=\"cloud.phala.com\"]:hover>span[class*=\"absolute\"]{opacity:0.9!important}[class*=\"Update\"] [class*=\"label\"],[class*=\"update\"] [class*=\"label\"],[class*=\"UpdateLabel\"],[class*=\"changelog\"] h2,[class*=\"Changelog\"] h2{font-family:var(--v3-mono, \"SuisseIntlMono\", monospace);font-size:12px;font-weight:400;letter-spacing:0.08em;text-transform:uppercase}table{border-collapse:collapse;border:1px solid var(--base-200)}th,td{border:1px solid var(--base-200);padding:8px 12px;font-size:14px}th{font-family:var(--v3-mono, \"SuisseIntlMono\", monospace);font-size:11px;font-weight:400;letter-spacing:0.08em;text-transform:uppercase}"}],"page":{"pagePath":"phala-cloud/networking/setup-custom-domain","slug":"/phala-cloud/networking/setup-custom-domain","pageMetadata":{"title":"Set Up a Custom Domain","description":"Use your own domain with automatic SSL certificates","href":"/phala-cloud/networking/setup-custom-domain"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Use your own domain with automatic SSL certificates\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Tab,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`This guide shows you how to use your own domain (like `,_jsx(_components.code,{children:`api.mycompany.com`}),`) instead of the default Phala Cloud domain.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A domain with DNS hosted on Cloudflare (Linode and Namecheap also supported)`}),`\n`,_jsx(_components.li,{children:`Access to your DNS provider’s API token`}),`\n`,_jsx(_components.li,{children:`A deployed CVM application`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-1-create-dns-api-token`,children:`Step 1: Create DNS API Token`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Cloudflare`,id:`cloudflare`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Go to your `,_jsx(_components.a,{href:`https://dash.cloudflare.com/`,children:`Cloudflare Dashboard`})]}),`\n`,_jsx(_components.li,{children:`Select your domain`}),`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`Get Your API Token`})]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Create Token`})]}),`\n`,_jsxs(_components.li,{children:[`Use the `,_jsx(_components.strong,{children:`Edit zone DNS`}),` template`]}),`\n`,_jsxs(_components.li,{children:[`Select your domain in `,_jsx(_components.strong,{children:`Zone Resources`})]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Continue to summary`}),` and create the token`]}),`\n`,_jsx(_components.li,{children:`Copy the token for later use`}),`\n`]})}),_jsx(Tab,{title:`Linode`,id:`linode`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.a,{href:`https://cloud.linode.com/`,children:`Linode Cloud Manager`})]}),`\n`,_jsxs(_components.li,{children:[`Click on your profile → `,_jsx(_components.strong,{children:`API Tokens`})]}),`\n`,_jsxs(_components.li,{children:[`Create a `,_jsx(_components.strong,{children:`Personal Access Token`}),` with Read/Write access to Domains`]}),`\n`,_jsx(_components.li,{children:`Copy the token for later use`}),`\n`]})}),_jsx(Tab,{title:`Namecheap`,id:`namecheap`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Enable API access in your `,_jsx(_components.a,{href:`https://www.namecheap.com/myaccount/login/`,children:`Namecheap account`})]}),`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`Profile → Tools → API Access`})]}),`\n`,_jsx(_components.li,{children:`Note your username and API key`}),`\n`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`step-2-add-dstack-ingress-to-your-deployment`,children:`Step 2: Add dstack-ingress to Your Deployment`}),`\n`,_jsxs(_components.p,{children:[`Update your `,_jsx(_components.code,{children:`docker-compose.yml`}),` to include the dstack-ingress container:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`services`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` dstack-ingress`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dstacktee/dstack-ingress:2.2@sha256:d05a7b343c37c1cca1bba8dbf7e8f3c6d2118158af2d41c455103796db4f67f0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` ports`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"443:443\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` environment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`DOMAIN=api.mycompany.com`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Your custom domain`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`TARGET_ENDPOINT=app:80`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Your app's internal endpoint`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"GATEWAY_DOMAIN=gateway.${DSTACK_GATEWAY_DOMAIN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"CERTBOT_EMAIL=${CERTBOT_EMAIL}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`SET_CAA=true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/var/run/dstack.sock:/var/run/dstack.sock`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/var/run/tappd.sock:/var/run/tappd.sock`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`cert-data:/etc/letsencrypt`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`evidences:/evidences`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` restart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`unless-stopped`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`your-app:latest`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Your application`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`evidences:/evidences:ro`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # No ports exposed here - dstack-ingress handles external access`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cert-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Persistent storage for SSL certificates`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` evidences`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Generated attestation evidence files`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`DOMAIN`}),` to your custom domain and `,_jsx(_components.code,{children:`TARGET_ENDPOINT`}),` to your app’s internal endpoint. `,_jsx(_components.code,{children:`TARGET_ENDPOINT`}),` tells dstack-ingress where to forward incoming traffic:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`app:80`}),` - Forward to service named “app” on port 80`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`api:3000`}),` - Forward to service named “api” on port 3000`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`http://app:80`}),` and `,_jsx(_components.code,{children:`grpc://app:50051`}),` are also accepted, but the protocol prefix is stripped before proxying`]}),`\n`,_jsx(_components.li,{children:`Use the service name from docker-compose, not localhost`}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dstack-ingress`}),` is a HAProxy-based L4/TCP proxy. It terminates TLS and forwards the TCP stream to `,_jsx(_components.code,{children:`TARGET_ENDPOINT`}),`; it does not apply Nginx-style HTTP redirects, header rules, body limits, or buffering settings. Put HTTP-specific behavior in your application or in a separate HTTP proxy behind `,_jsx(_components.code,{children:`TARGET_ENDPOINT`}),` if needed.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GATEWAY_DOMAIN`}),` becomes your domain’s CNAME target, and its first label must\nstart with a letter or digit. Android rejects a leading underscore, so the\nolder `,_jsx(_components.code,{children:\"_.${DSTACK_GATEWAY_DOMAIN}\"}),` form resolves everywhere except Android —\nchange it to `,_jsx(_components.code,{children:\"gateway.${DSTACK_GATEWAY_DOMAIN}\"}),` if your deployment still has it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`step-3-configure-environment-variables`,children:`Step 3: Configure Environment Variables`}),`\n`,_jsx(_components.p,{children:`In the Phala Cloud dashboard, add these encrypted secrets:`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Cloudflare`,id:`cloudflare-2`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CLOUDFLARE_API_TOKEN`}),`: Your API token from Step 1`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CERTBOT_EMAIL`}),`: Your email for Let’s Encrypt notifications`]}),`\n`]})}),_jsx(Tab,{title:`Linode`,id:`linode-2`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`LINODE_API_TOKEN`}),`: Your API token from Step 1`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CERTBOT_EMAIL`}),`: Your email for Let’s Encrypt notifications`]}),`\n`]})}),_jsx(Tab,{title:`Namecheap`,id:`namecheap-2`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`NAMECHEAP_USERNAME`}),`: Your Namecheap username`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`NAMECHEAP_API_KEY`}),`: Your API key from Step 1`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`NAMECHEAP_CLIENT_IP`}),`: Your whitelisted IP address`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CERTBOT_EMAIL`}),`: Your email for Let’s Encrypt notifications`]}),`\n`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`step-4-deploy`,children:`Step 4: Deploy`}),`\n`,_jsx(_components.p,{children:`Deploy your updated docker-compose.yml through the dashboard. The first deployment typically takes 3–5 minutes as it:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Configures DNS records`}),`\n`,_jsx(_components.li,{children:`Requests SSL certificate from Let’s Encrypt`}),`\n`,_jsx(_components.li,{children:`Starts the HAProxy TCP proxy`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-5-verify`,children:`Step 5: Verify`}),`\n`,_jsx(_components.p,{children:`After deployment, you can:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Access your domain`}),`: Visit `,_jsx(_components.code,{children:`https://api.mycompany.com`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Check certificate`}),`: Your browser should show a valid Let’s Encrypt certificate`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verify evidence`}),`: Visit `,_jsx(_components.code,{children:`https://api.mycompany.com/evidences/`}),` to see attestation data`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`multiple-custom-domains`,children:`Multiple Custom Domains`}),`\n`,_jsxs(_components.p,{children:[`You can route multiple custom domains from one ingress container by using `,_jsx(_components.code,{children:`DOMAINS`}),` and `,_jsx(_components.code,{children:`ROUTING_MAP`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`37`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`37`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`services`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` ingress`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dstacktee/dstack-ingress:2.2@sha256:d05a7b343c37c1cca1bba8dbf7e8f3c6d2118158af2d41c455103796db4f67f0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` ports`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"443:443\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` environment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` DNS_PROVIDER`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`cloudflare`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` CLOUDFLARE_API_TOKEN`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${CLOUDFLARE_API_TOKEN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` CERTBOT_EMAIL`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${CERTBOT_EMAIL}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` GATEWAY_DOMAIN`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"gateway.${DSTACK_GATEWAY_DOMAIN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` SET_CAA`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` DOMAINS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` app.mycompany.com`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api.mycompany.com`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` ROUTING_MAP`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` app.mycompany.com=frontend:3000`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api.mycompany.com=api:8080`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/var/run/dstack.sock:/var/run/dstack.sock`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/var/run/tappd.sock:/var/run/tappd.sock`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`cert-data:/etc/letsencrypt`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`evidences:/evidences`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` restart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`unless-stopped`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` api`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-api:latest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`evidences:/evidences:ro`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` `})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` frontend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-frontend:latest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`evidences:/evidences:ro`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`volumes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cert-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` evidences`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`why-we-pin-infrastructure-images`,children:`Why We Pin Infrastructure Images`}),`\n`,_jsx(_components.p,{children:`The dstack-ingress image uses a SHA256 hash instead of a tag to ensure:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Auditability`}),`: Anyone can verify the exact infrastructure code handling domains`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Immutability`}),`: The ingress behavior never changes unexpectedly`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Security`}),`: Prevents infrastructure image substitution`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reproducibility`}),`: Domain handling is consistent across all deployments`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`security-features`,children:`Security Features`}),`\n`,_jsxs(_components.p,{children:[`When `,_jsx(_components.code,{children:`SET_CAA=true`}),` is enabled:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`CAA records restrict certificate issuance to the TEE managed Let’s Encrypt account`}),`\n`,_jsx(_components.li,{children:`Only certificates requested from within your TEE can be issued`}),`\n`,_jsx(_components.li,{children:`Certificate transparency logs can be monitored for unauthorized certificates`}),`\n`]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cloudflare Users`}),`: Cloudflare automatically overrides CAA records at the apex domain (e.g., `,_jsx(_components.code,{children:`example.com`}),`). This prevents domain attestation from working correctly.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Solution options:`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use a subdomain`}),` (recommended): Deploy to `,_jsx(_components.code,{children:`app.example.com`}),` instead of `,_jsx(_components.code,{children:`example.com`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Disable Cloudflare’s CAA management`}),`: See `,_jsx(_components.a,{href:`https://developers.cloudflare.com/ssl/edge-certificates/caa-records/#caa-records-added-by-cloudflare`,children:`Cloudflare CAA documentation`})]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`To verify your CAA record is working:`})}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`dig`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @1.1.1.1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` +short`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` CAA`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` your-domain.com`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Should return the Let’s Encrypt account URI with `,_jsx(_components.code,{children:`validationmethods=dns-01;accounturi=...`})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(Heading,{level:`3`,id:`check-logs`,children:`Check Logs`}),`\n`,_jsx(_components.p,{children:`Look for dstack-ingress container logs in the dashboard:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Successfully received certificate.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Generated evidences successfully`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Next renewal check in 12 hours`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`certbot-error-“too-many-certificates-5-already-issued-for-this-exact-set-of-identifiers”`,children:`Certbot Error: “too many certificates (5) already issued for this exact set of identifiers”`}),`\n`,_jsx(_components.p,{children:`You may have forgotten to attach the data volume.`}),`\n`,_jsx(Heading,{level:`3`,id:`other-common-issues`,children:`Other Common Issues`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`DNS not propagating`}),`: Wait 2-5 minutes for DNS changes to propagate globally.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Certificate request failed`}),`: Verify your API token has permission to edit DNS records.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Connection refused`}),`: Ensure `,_jsx(_components.code,{children:`TARGET_ENDPOINT`}),` points to the correct service:port.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`CAA record conflicts`}),`: Some providers (like Linode) don’t allow CAA and CNAME on the same subdomain. The system will automatically use A records instead.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next Steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/phala-cloud/networking/expose-tcp-service`,children:`Expose TCP services`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/phala-cloud/networking/domain-attestation`,children:`Learn about domain attestation`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/phala-cloud/networking/setup-grpc-service`,children:`Set up gRPC with custom domain`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Set Up a Custom Domain","description":"Use your own domain with automatic SSL certificates","href":"/phala-cloud/networking/setup-custom-domain"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Step 1: Create DNS API Token","slug":"step-1-create-dns-api-token","depth":2,"children":[]},{"title":"Step 2: Add dstack-ingress to Your Deployment","slug":"step-2-add-dstack-ingress-to-your-deployment","depth":2,"children":[]},{"title":"Step 3: Configure Environment Variables","slug":"step-3-configure-environment-variables","depth":2,"children":[]},{"title":"Step 4: Deploy","slug":"step-4-deploy","depth":2,"children":[]},{"title":"Step 5: Verify","slug":"step-5-verify","depth":2,"children":[]},{"title":"Multiple Custom Domains","slug":"multiple-custom-domains","depth":2,"children":[]},{"title":"Why We Pin Infrastructure Images","slug":"why-we-pin-infrastructure-images","depth":2,"children":[]},{"title":"Security Features","slug":"security-features","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[{"title":"Check Logs","slug":"check-logs","depth":3,"children":[]},{"title":"Certbot Error: “too many certificates (5) already issued for this exact set of identifiers”","slug":"certbot-error-“too-many-certificates-5-already-issued-for-this-exact-set-of-identifiers”","depth":3,"children":[]},{"title":"Other Common Issues","slug":"other-common-issues","depth":3,"children":[]}]},{"title":"Next Steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/phalanetwork-1606097b/2c201375ed6be1da/scripts/generate-cli-docs.js"],"subdomain":"phalanetwork-1606097b","siteName":"Phala","title":"Phala Cloud Documentation — Private AI on TEE","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-12T03:40:55.571Z","originalFileLocation":"phala-cloud/networking/setup-custom-domain.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Use your own domain with automatic SSL certificates\">\u003cmeta data-mint-head name=\"keywords\" content=\"Phala Cloud, TEE, Trusted Execution Environment, Confidential Computing, Private AI, confidential AI, GPU TEE, Intel TDX, dstack, blockchain, privacy-preserving computing, secure cloud, attestation\">\u003cmeta data-mint-head name=\"application-name\" content=\"Phala\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Phala Cloud Documentation — Private AI on TEE\">\u003cmeta data-mint-head property=\"og:description\" content=\"Deploy confidential AI applications on Phala Cloud with hardware-level privacy via Intel TDX, NVIDIA H100 GPU TEE, and verifiable attestation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Phala Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://raw.githubusercontent.com/Phala-Network/phala-docs/main/images/phala-docs-og.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Phala Cloud Documentation — Private AI on TEE\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Deploy confidential AI applications on Phala Cloud with hardware-level privacy via Intel TDX, NVIDIA H100 GPU TEE, and verifiable attestation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://raw.githubusercontent.com/Phala-Network/phala-docs/main/images/phala-docs-og.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/phalanetwork-1606097b/nl48Duk5fn7pmYeb/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Phala\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#527a08\">\u003cmeta data-mint-head name=\"author\" content=\"Phala Cloud\">\u003cmeta data-mint-head name=\"category\" content=\"Technology\">\u003cmeta data-mint-head name=\"distribution\" content=\"global\">\u003cmeta data-mint-head name=\"language\" content=\"en\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"Phala Cloud — Confidential Computing \u0026amp; GPU TEE for AI\">\u003cmeta data-mint-head name=\"twitter:creator\" content=\"@PhalaNetwork\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/phala-cloud/networking/setup-custom-domain.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.phala.com/#organization\",\"name\":\"Phala\",\"url\":\"https://docs.phala.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/phalanetwork-1606097b/Y2wR1-jOsoYpAL6q/images/phala-light.png?fit=max\u0026auto=format\u0026n=Y2wR1-jOsoYpAL6q\u0026q=85\u0026s=fb4f438a36865810867d188289681376\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.phala.com#website\",\"name\":\"Phala\",\"url\":\"https://docs.phala.com\",\"publisher\":{\"@id\":\"https://docs.phala.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain#webpage\",\"url\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain\",\"name\":\"Set Up a Custom Domain\",\"description\":\"Use your own domain with automatic SSL certificates\",\"dateModified\":\"2026-09-12T03:40:55.571Z\",\"isPartOf\":{\"@id\":\"https://docs.phala.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Phala Cloud\",\"item\":\"https://docs.phala.com/phala-cloud/what-is/what-is-phala-cloud\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Networking\",\"item\":\"https://docs.phala.com/phala-cloud/networking/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Set Up a Custom Domain\",\"item\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain#article\",\"headline\":\"Set Up a Custom Domain\",\"name\":\"Set Up a Custom Domain\",\"description\":\"Use your own domain with automatic SSL certificates\",\"url\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain\",\"mainEntityOfPage\":{\"@id\":\"https://docs.phala.com/phala-cloud/networking/setup-custom-domain#webpage\"},\"image\":\"https://raw.githubusercontent.com/Phala-Network/phala-docs/main/images/phala-docs-og.png\",\"dateModified\":\"2026-09-12T03:40:55.571Z\",\"publisher\":{\"@id\":\"https://docs.phala.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.phala.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Phala\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Phala","nav":{"global":null,"tabs":[{"tab":"Phala Cloud","icon":"cloud","pages":[{"group":"Phala Cloud","pages":[{"title":"What is Phala Cloud","href":"/phala-cloud/what-is/what-is-phala-cloud"},{"group":"Getting Started","pages":[{"title":"Quick Start","href":"/phala-cloud/getting-started/overview"},{"title":"Create Account","href":"/phala-cloud/getting-started/sign-up-for-cloud-account"},{"title":"CVM Deployment","href":"/phala-cloud/getting-started/start-from-cloud-ui"},{"title":"Deploy Your First CVM","href":"/phala-cloud/getting-started/deploy-first-cvm"},{"title":"Explore Templates","href":"/phala-cloud/getting-started/explore-templates/overview"},{"title":"Get and Verify Attestation","href":"/phala-cloud/getting-started/attestation"},{"title":"Migration from dstack v0.3","href":"/phala-cloud/references/migration-from-dstack-v03"}]},{"group":"CVM","pages":[{"title":"CVM Overview","href":"/phala-cloud/cvm/overview"},{"title":"CVM with Docker Compose","href":"/phala-cloud/cvm/create-with-docker-compose"},{"title":"Environment Variables","href":"/phala-cloud/cvm/set-secure-environment-variables"},{"title":"Private Container Registry","href":"/phala-cloud/cvm/create-with-private-docker-image"},{"title":"Scale with Multiple Replicas","href":"/phala-cloud/cvm/multi-replica-scaling"},{"title":"Replicating CVMs","href":"/phala-cloud/cvm/replicating-cvms"},{"title":"Launch Token","href":"/phala-cloud/cvm/launch-token"},{"title":"Advanced CVM Settings","href":"/phala-cloud/cvm/advanced-settings"},{"title":"Deployment Cheat Sheet","href":"/phala-cloud/cvm/deployment-cheat-sheet"},{"title":"OS Image","href":"/phala-cloud/cvm/image/overview"},{"title":"Database","href":"/phala-cloud/storage/access-database"},{"title":"Update Code","href":"/phala-cloud/update/upgrade-application"},{"title":"Scaling","href":"/phala-cloud/update/resize-resource"},{"title":"Update CVM Configuration","href":"/phala-cloud/update/update-cvm-configuration"}]},{"group":"GPU CVM","pages":[{"title":"Deploy AI Models in GPU TEE","href":"/phala-cloud/confidential-ai/gpu-tee-deployment-guide"},{"title":"Deploy and Verify GPU TEE","href":"/phala-cloud/confidential-ai/confidential-gpu/deploy-and-verify"},{"title":"Troubleshooting","href":"/phala-cloud/confidential-ai/confidential-gpu/troubleshooting"},{"title":"Benchmark","href":"/phala-cloud/confidential-ai/benchmark"}]},{"group":"Phala Cloud CLI","pages":[{"title":"CLI Overview","href":"/phala-cloud/phala-cloud-cli/overview"},{"title":"Deploy Your First CVM","href":"/phala-cloud/phala-cloud-cli/start-from-cloud-cli"},{"title":"phala.toml Configuration","href":"/phala-cloud/phala-cloud-cli/phala-toml"},{"title":"Set Up a CI/CD Pipeline","href":"/phala-cloud/phala-cloud-cli/ci-cd-automation/setup-a-ci-cd-pipeline"},{"title":"Deploy with the GitHub Action","href":"/phala-cloud/phala-cloud-cli/ci-cd-automation/github-deploy-action"},{"group":"Deploy","pages":[{"title":"deploy","href":"/phala-cloud/phala-cloud-cli/deploy"},{"title":"instance-types","href":"/phala-cloud/phala-cloud-cli/instance-types"},{"group":"nodes","pages":[{"title":"nodes","hidden":true,"href":"/phala-cloud/phala-cloud-cli/nodes"},{"title":"nodes list","href":"/phala-cloud/phala-cloud-cli/nodes/list"}]},{"title":"os-images","href":"/phala-cloud/phala-cloud-cli/os-images"}]},{"group":"CVM Operations","pages":[{"title":"annotations","href":"/phala-cloud/phala-cloud-cli/annotations"},{"title":"cp","href":"/phala-cloud/phala-cloud-cli/cp"},{"title":"logs","href":"/phala-cloud/phala-cloud-cli/logs"},{"title":"ps","href":"/phala-cloud/phala-cloud-cli/ps"},{"title":"runtime-config","href":"/phala-cloud/phala-cloud-cli/runtime-config"},{"title":"ssh","href":"/phala-cloud/phala-cloud-cli/ssh"}]},{"group":"Resources","pages":[{"group":"apps","pages":[{"title":"apps","hidden":true,"href":"/phala-cloud/phala-cloud-cli/apps"},{"title":"apps launch-token","href":"/phala-cloud/phala-cloud-cli/apps/launch-token"}]},{"group":"instances","pages":[{"title":"instances","hidden":true,"href":"/phala-cloud/phala-cloud-cli/instances"},{"title":"instances ls","href":"/phala-cloud/phala-cloud-cli/instances/ls"},{"title":"instances add","href":"/phala-cloud/phala-cloud-cli/instances/add"},{"title":"instances rm","href":"/phala-cloud/phala-cloud-cli/instances/rm"}]},{"group":"cvms","pages":[{"title":"cvms","hidden":true,"href":"/phala-cloud/phala-cloud-cli/cvms"},{"title":"cvms attestation","href":"/phala-cloud/phala-cloud-cli/cvms/attestation"},{"title":"cvms delete","href":"/phala-cloud/phala-cloud-cli/cvms/delete"},{"title":"cvms device-allowlist","href":"/phala-cloud/phala-cloud-cli/cvms/device-allowlist"},{"title":"cvms get","href":"/phala-cloud/phala-cloud-cli/cvms/get"},{"title":"cvms list","href":"/phala-cloud/phala-cloud-cli/cvms/list"},{"title":"cvms list-nodes","href":"/phala-cloud/phala-cloud-cli/cvms/list-nodes"},{"title":"cvms logs (Deprecated)","href":"/phala-cloud/phala-cloud-cli/cvms/logs"},{"title":"cvms replicate","href":"/phala-cloud/phala-cloud-cli/cvms/replicate"},{"title":"cvms resize","href":"/phala-cloud/phala-cloud-cli/cvms/resize"},{"title":"cvms restart","href":"/phala-cloud/phala-cloud-cli/cvms/restart"},{"title":"cvms serial-logs (Deprecated)","href":"/phala-cloud/phala-cloud-cli/cvms/serial-logs"},{"title":"cvms start","href":"/phala-cloud/phala-cloud-cli/cvms/start"},{"title":"cvms stop","href":"/phala-cloud/phala-cloud-cli/cvms/stop"},{"title":"cvms upgrade (Deprecated)","href":"/phala-cloud/phala-cloud-cli/cvms/upgrade"}]},{"group":"envs","pages":[{"title":"envs","hidden":true,"href":"/phala-cloud/phala-cloud-cli/envs"},{"title":"envs encrypt","href":"/phala-cloud/phala-cloud-cli/envs/encrypt"},{"title":"envs update","href":"/phala-cloud/phala-cloud-cli/envs/update"}]},{"group":"ssh-keys","pages":[{"title":"ssh-keys","hidden":true,"href":"/phala-cloud/phala-cloud-cli/ssh-keys"},{"title":"ssh-keys list","href":"/phala-cloud/phala-cloud-cli/ssh-keys/list"},{"title":"ssh-keys add","href":"/phala-cloud/phala-cloud-cli/ssh-keys/add"},{"title":"ssh-keys remove","href":"/phala-cloud/phala-cloud-cli/ssh-keys/remove"},{"title":"ssh-keys import-github","href":"/phala-cloud/phala-cloud-cli/ssh-keys/import-github"}]},{"group":"allow-devices","pages":[{"title":"allow-devices","hidden":true,"href":"/phala-cloud/phala-cloud-cli/allow-devices"},{"title":"allow-devices list","href":"/phala-cloud/phala-cloud-cli/allow-devices/list"},{"title":"allow-devices add","href":"/phala-cloud/phala-cloud-cli/allow-devices/add"},{"title":"allow-devices remove","href":"/phala-cloud/phala-cloud-cli/allow-devices/remove"},{"title":"allow-devices allow-any","href":"/phala-cloud/phala-cloud-cli/allow-devices/allow-any"},{"title":"allow-devices disallow-any","href":"/phala-cloud/phala-cloud-cli/allow-devices/disallow-any"},{"title":"allow-devices toggle-allow-any","href":"/phala-cloud/phala-cloud-cli/allow-devices/toggle-allow-any"}]},{"group":"kms","pages":[{"title":"kms","hidden":true,"href":"/phala-cloud/phala-cloud-cli/kms"},{"title":"kms list","href":"/phala-cloud/phala-cloud-cli/kms/list"},{"title":"kms nodes","href":"/phala-cloud/phala-cloud-cli/kms/nodes"},{"title":"kms ethereum","href":"/phala-cloud/phala-cloud-cli/kms/ethereum"},{"title":"kms base","href":"/phala-cloud/phala-cloud-cli/kms/base"},{"title":"kms phala","href":"/phala-cloud/phala-cloud-cli/kms/phala"}]}]},{"group":"Profile \u0026 Auth","pages":[{"title":"login","href":"/phala-cloud/phala-cloud-cli/login"},{"title":"logout","href":"/phala-cloud/phala-cloud-cli/logout"},{"group":"profiles","pages":[{"title":"profiles","hidden":true,"href":"/phala-cloud/phala-cloud-cli/profiles"},{"title":"profiles use","href":"/phala-cloud/phala-cloud-cli/profiles/use"},{"title":"profiles rename","href":"/phala-cloud/phala-cloud-cli/profiles/rename"},{"title":"profiles delete","href":"/phala-cloud/phala-cloud-cli/profiles/delete"}]},{"title":"status","href":"/phala-cloud/phala-cloud-cli/status"},{"title":"switch","href":"/phala-cloud/phala-cloud-cli/switch"},{"title":"whoami","href":"/phala-cloud/phala-cloud-cli/whoami"},{"title":"link","href":"/phala-cloud/phala-cloud-cli/link"}]},{"group":"Dev Tools","pages":[{"title":"api","href":"/phala-cloud/phala-cloud-cli/api"},{"group":"simulator","pages":[{"title":"simulator","hidden":true,"href":"/phala-cloud/phala-cloud-cli/simulator"},{"title":"simulator start","href":"/phala-cloud/phala-cloud-cli/simulator/start"},{"title":"simulator stop","href":"/phala-cloud/phala-cloud-cli/simulator/stop"}]},{"title":"keccak256sum","href":"/phala-cloud/phala-cloud-cli/keccak256sum"}]},{"group":"Misc","pages":[{"title":"phala completion","href":"/phala-cloud/phala-cloud-cli/completion"},{"group":"self","pages":[{"title":"self","hidden":true,"href":"/phala-cloud/phala-cloud-cli/self"},{"title":"self update","href":"/phala-cloud/phala-cloud-cli/self/update"}]}]},{"title":"Changelog","href":"/phala-cloud/phala-cloud-cli/changelog"},{"group":"Deprecated","pages":[{"group":"auth","pages":[{"title":"auth (Deprecated)","hidden":true,"href":"/phala-cloud/phala-cloud-cli/auth"},{"title":"auth login (Deprecated)","href":"/phala-cloud/phala-cloud-cli/auth/login"},{"title":"auth logout (Deprecated)","href":"/phala-cloud/phala-cloud-cli/auth/logout"},{"title":"auth status (Deprecated)","href":"/phala-cloud/phala-cloud-cli/auth/status"}]},{"group":"config","pages":[{"title":"config (Deprecated)","hidden":true,"href":"/phala-cloud/phala-cloud-cli/config"},{"title":"config get","href":"/phala-cloud/phala-cloud-cli/config/get"},{"title":"config list","href":"/phala-cloud/phala-cloud-cli/config/list"},{"title":"config set","href":"/phala-cloud/phala-cloud-cli/config/set"}]}]}]},{"group":"Networking","pages":[{"title":"Overview","href":"/phala-cloud/networking/overview"},{"title":"Quickstart","href":"/phala-cloud/networking/quickstart"},{"title":"Expose an HTTP Service","description":"Step-by-step guide to expose HTTP services with automatic HTTPS","href":"/phala-cloud/networking/expose-http-service"},{"title":"Set Up a Custom Domain","href":"/phala-cloud/networking/setup-custom-domain"},{"title":"Expose TCP Services","description":"Expose TCP services like databases with automatic TLS encryption","href":"/phala-cloud/networking/expose-tcp-service"},{"title":"Enable SSH Access","href":"/phala-cloud/networking/enable-ssh-access"},{"title":"TLS Passthrough","href":"/phala-cloud/networking/tls-passthrough"},{"title":"Set Up gRPC Services","href":"/phala-cloud/networking/setup-grpc-service"},{"title":"Architecture","href":"/phala-cloud/networking/architecture"},{"title":"Network Security","href":"/phala-cloud/networking/security"},{"title":"Domain Attestation","href":"/phala-cloud/networking/domain-attestation"},{"title":"Reference","href":"/phala-cloud/networking/specifications"},{"title":"Troubleshooting","href":"/phala-cloud/networking/troubleshooting"}]},{"group":"Onchain KMS","pages":[{"title":"What is KMS","href":"/phala-cloud/key-management/key-management-protocol"},{"title":"Cloud vs Onchain KMS","href":"/phala-cloud/key-management/cloud-vs-onchain-kms"},{"title":"Understanding Onchain KMS","href":"/phala-cloud/key-management/understanding-onchain-kms"},{"title":"Deploying with Onchain KMS","href":"/phala-cloud/key-management/deploying-with-onchain-kms"},{"title":"Updating with Onchain KMS","href":"/phala-cloud/key-management/updating-with-onchain-kms"},{"title":"Device Management","href":"/phala-cloud/key-management/device-management"},{"title":"Multisig and Governance","href":"/phala-cloud/key-management/multisig-governance"},{"group":"Derived Keys","pages":[{"title":"Get a Deterministic Key","href":"/phala-cloud/key-management/get-a-key"},{"title":"Create Crypto Wallets","href":"/phala-cloud/key-management/create-crypto-wallet"}]}]},{"group":"Trust Center \u0026 Attestation","pages":[{"group":"Trust Center","pages":[{"title":"Trust Center Verification","href":"/phala-cloud/attestation/trust-center-verification"},{"title":"Become a Featured Builder","href":"/phala-cloud/attestation/feature-builder"}]},{"group":"Attestation","pages":[{"title":"Overview","href":"/phala-cloud/attestation/overview"},{"title":"Quickstart","href":"/phala-cloud/attestation/quickstart"},{"title":"Get Attestation","href":"/phala-cloud/attestation/get-attestation"},{"title":"Verify Your Application","href":"/phala-cloud/attestation/verify-your-application"},{"title":"Verify the Platform","href":"/phala-cloud/attestation/verify-the-platform"},{"title":"End-to-End Attestation Verification","href":"/phala-cloud/attestation/verification-guide"},{"title":"Complete Chain of Trust","href":"/phala-cloud/attestation/chain-of-trust"},{"title":"Attestation Fields Reference","href":"/phala-cloud/attestation/attestation-fields"}]}]},{"group":"Security \u0026 Compliance","pages":[{"title":"Compliance \u0026 Certifications","href":"/phala-cloud/security-and-privacy/compliance"},{"title":"Security Audit Report","href":"/phala-cloud/security-and-privacy/security-audit"},{"title":"Security Architecture","href":"/phala-cloud/security-and-privacy/security-architecture"},{"title":"Privacy","href":"/phala-cloud/security-and-privacy/privacy"}]},{"group":"Observability","pages":[{"title":"Public Logs","href":"/phala-cloud/monitoring/public-logs"},{"title":"Serial Logs","href":"/phala-cloud/monitoring/serials-logs"},{"title":"Private Log Viewer","href":"/phala-cloud/monitoring/private-log-viewer"},{"title":"Datadog Integration","href":"/phala-cloud/monitoring/datadog-integration"},{"title":"Troubleshooting Guide","href":"/phala-cloud/troubleshooting/troubleshooting"},{"title":"Private Log Viewer","href":"/phala-cloud/troubleshooting/private-log-viewer"},{"title":"Debug Application","href":"/phala-cloud/troubleshooting/debug-your-application"},{"title":"Production Checklist","href":"/phala-cloud/production-checklist"},{"title":"Performance Report","href":"/phala-cloud/references/performance-report"}]},{"group":"API \u0026 SDK","pages":[{"title":"Overview","href":"/phala-cloud/references/overview"},{"group":"Phala Cloud API","pages":[{"title":"API Overview","href":"/phala-cloud/phala-cloud-api/overview"},{"title":"Attestation API Reference","href":"/phala-cloud/phala-cloud-api/attestations"},{"title":"CVM Deployment via API","href":"/phala-cloud/references/api-deployment-guide"},{"group":"Apps","pages":[{"title":"List apps","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps","href":"/api-reference/apps/list-apps"},{"title":"Get app filter options","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/filter-options","href":"/api-reference/apps/get-app-filter-options"},{"title":"Get app details","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}","href":"/api-reference/apps/get-app-details"},{"title":"Get app attestation data","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/attestations","href":"/api-reference/apps/get-app-attestation-data"},{"title":"Run app TCB evaluation","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/attestations/tcb-evaluation","href":"/api-reference/apps/run-app-tcb-evaluation"},{"title":"List app CVMs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/cvms","href":"/api-reference/apps/list-app-cvms"},{"title":"Batch check on-chain deployment allowance for all CVMs under an app","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/cvms/is-allowed","href":"/api-reference/apps/batch-check-on-chain-deployment-allowance-for-all-cvms-under-an-app"},{"title":"Create CVM replica","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/cvms/{vm_uuid}/replicas","href":"/api-reference/apps/create-cvm-replica"},{"title":"Create a new instance under an existing app","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/instances","href":"/api-reference/apps/create-a-new-instance-under-an-existing-app"},{"title":"Get device allowlist status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/device-allowlist","href":"/api-reference/apps/get-device-allowlist-status"},{"title":"Check if app deployment is allowed on-chain","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/is-allowed","href":"/api-reference/apps/check-if-app-deployment-is-allowed-on-chain"},{"title":"Set or rotate the app launch token","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/launch-token","href":"/api-reference/apps/set-or-rotate-the-app-launch-token"},{"title":"Clear the app launch token","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/apps/{app_id}/launch-token","href":"/api-reference/apps/clear-the-app-launch-token"},{"title":"Get app on-chain KMS info","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/kms-info","href":"/api-reference/apps/get-app-on-chain-kms-info"},{"title":"Get pending compose updates","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/pending-updates","href":"/api-reference/apps/get-pending-compose-updates"},{"title":"Preview a pending compose update","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/pending-updates/{vm_uuid}/{compose_hash}/preview","href":"/api-reference/apps/preview-a-pending-compose-update"},{"title":"List app revisions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/revisions","href":"/api-reference/apps/list-app-revisions"},{"title":"Get revision detail","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/revisions/{revision_id}","href":"/api-reference/apps/get-revision-detail"},{"title":"Redeploy app from a specific revision","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/apps/{app_id}/revisions/{revision_id}/redeploy","href":"/api-reference/apps/redeploy-app-from-a-specific-revision"},{"title":"Get app metered usage","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/apps/{app_id}/usage","href":"/api-reference/apps/get-app-metered-usage"}]},{"group":"CVMs","pages":[{"title":"Create CVM (two-phase on one path)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms","href":"/api-reference/cvms/create-cvm-two-phase-on-one-path"},{"title":"List CVMs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms","href":"/api-reference/cvms/list-cvms"},{"title":"List CVMs (paginated)","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/paginated","href":"/api-reference/cvms/list-cvms-paginated"},{"title":"Batch stop CVMs","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/batch-stop","href":"/api-reference/cvms/batch-stop-cvms"},{"title":"Batch refresh CVM instance IDs","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/instance-ids","href":"/api-reference/cvms/batch-refresh-cvm-instance-ids"},{"title":"Handle Batch Cvm Status","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/status/batch","href":"/api-reference/user/handle-batch-cvm-status"},{"title":"Get CVM details","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}","href":"/api-reference/cvms/get-cvm-details"},{"title":"Delete CVM","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/cvms/{cvm_id}","href":"/api-reference/cvms/delete-cvm"},{"title":"Update CVM","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}","href":"/api-reference/cvms/update-cvm"},{"title":"Get CVM annotations","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/annotations","href":"/api-reference/cvms/get-cvm-annotations"},{"title":"Replace CVM annotations","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/cvms/{cvm_id}/annotations","href":"/api-reference/cvms/replace-cvm-annotations"},{"title":"Get CVM attestation","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/attestation","href":"/api-reference/cvms/get-cvm-attestation"},{"title":"List available OS images","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/available-os-images","href":"/api-reference/cvms/list-available-os-images"},{"title":"Commit CVM replica (token-based, no auth required)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/commit-replica","href":"/api-reference/cvms/commit-cvm-replica-token-based-no-auth-required"},{"title":"Get commit token info (no auth required)","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/commit-update","href":"/api-reference/cvms/get-commit-token-info-no-auth-required"},{"title":"Commit CVM update (token-based, no auth required)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/commit-update","href":"/api-reference/cvms/commit-cvm-update-token-based-no-auth-required"},{"title":"Get raw compose file","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/compose_file","href":"/api-reference/cvms/get-raw-compose-file"},{"title":"Trigger compose file update","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/compose_file","href":"/api-reference/cvms/trigger-compose-file-update"},{"title":"Submit compose file update","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/compose_file","href":"/api-reference/cvms/submit-compose-file-update"},{"title":"Provision compose file update","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/compose_file/provision","href":"/api-reference/cvms/provision-compose-file-update"},{"title":"Diagnose custom domain DNS","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/customize-domain-diagnose","href":"/api-reference/cvms/diagnose-custom-domain-dns"},{"title":"Update Docker Compose file","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/docker-compose","href":"/api-reference/cvms/update-docker-compose-file"},{"title":"Get staged CVM changes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/draft","href":"/api-reference/cvms/get-staged-cvm-changes"},{"title":"Stage CVM changes","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/draft","href":"/api-reference/cvms/stage-cvm-changes"},{"title":"Discard staged CVM changes","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/cvms/{cvm_id}/draft","href":"/api-reference/cvms/discard-staged-cvm-changes"},{"title":"Apply staged CVM changes","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/draft/apply","href":"/api-reference/cvms/apply-staged-cvm-changes"},{"title":"Get Docker Compose file","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/docker-compose.yml","href":"/api-reference/cvms/get-docker-compose-file"},{"title":"Update environment variables","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/envs","href":"/api-reference/cvms/update-environment-variables"},{"title":"Get firewall availability for this CVM's node","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/firewall-status","href":"/api-reference/cvms/get-firewall-availability-for-this-cvms-node"},{"title":"Get CVM init scripts","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/init-scripts","href":"/api-reference/cvms/get-cvm-init-scripts"},{"title":"Refresh CVM instance ID","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/instance-id","href":"/api-reference/cvms/refresh-cvm-instance-id"},{"title":"Set Trust Center listing for the app","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/listed","href":"/api-reference/cvms/set-trust-center-listing-for-the-app"},{"title":"Handle Update Cvm Name","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/name","href":"/api-reference/cvms/handle-update-cvm-name"},{"title":"Get CVM network info","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/network","href":"/api-reference/cvms/get-cvm-network-info"},{"title":"Get network configuration","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/network-config","href":"/api-reference/cvms/get-network-configuration"},{"title":"Update KMS/Gateway URLs","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/network-config","href":"/api-reference/cvms/update-kmsgateway-urls"},{"title":"Get operation status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/operation-status","href":"/api-reference/cvms/get-operation-status"},{"title":"List CVM operations","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/operations","href":"/api-reference/cvms/list-cvm-operations"},{"title":"Cancel in-progress CVM operation","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/operations/cancel","href":"/api-reference/cvms/cancel-in-progress-cvm-operation"},{"title":"Update OS image","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/os-image","href":"/api-reference/cvms/update-os-image"},{"title":"Get port mappings","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/ports","href":"/api-reference/cvms/get-port-mappings"},{"title":"Set port mappings","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/cvms/{cvm_id}/ports","href":"/api-reference/cvms/set-port-mappings"},{"title":"Get pre-launch script","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/pre-launch-script","href":"/api-reference/cvms/get-pre-launch-script"},{"title":"Update pre-launch script","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/pre-launch-script","href":"/api-reference/cvms/update-pre-launch-script"},{"title":"Replicate CVM","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/replicas","href":"/api-reference/cvms/replicate-cvm"},{"title":"Restart CVM","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/restart","href":"/api-reference/cvms/restart-cvm"},{"title":"Redeploy CVM from a specific revision","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/revisions/{revision_id}/redeploy","href":"/api-reference/cvms/redeploy-cvm-from-a-specific-revision"},{"title":"Handle Update Cvm Scheduled Delete","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/cvms/{cvm_id}/scheduled-delete","href":"/api-reference/cvms/handle-update-cvm-scheduled-delete"},{"title":"Shutdown CVM","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/shutdown","href":"/api-reference/cvms/shutdown-cvm"},{"title":"Start CVM","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/start","href":"/api-reference/cvms/start-cvm"},{"title":"Handle Get Cvm State","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/state","href":"/api-reference/cvms/handle-get-cvm-state"},{"title":"Get CVM system stats","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/stats","href":"/api-reference/cvms/get-cvm-system-stats"},{"title":"Force stop CVM","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/cvms/{cvm_id}/stop","href":"/api-reference/cvms/force-stop-cvm"},{"title":"Get CVM user config","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/cvms/{cvm_id}/user_config","href":"/api-reference/cvms/get-cvm-user-config"}]},{"group":"Attestations","pages":[{"title":"Verify TEE quote","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/attestations/verify","href":"/api-reference/public/verify-tee-quote"},{"title":"View quote details","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/view/{checksum}","href":"/api-reference/public/view-quote-details"},{"title":"Get quote collateral","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/collateral/{checksum}","href":"/api-reference/public/get-quote-collateral"},{"title":"Download raw quote","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/raw/{checksum}","href":"/api-reference/public/download-raw-quote"},{"title":"Check raw quote exists","deprecated":null,"version":null,"openapi":"/openapi.json head /api/v1/attestations/raw/{checksum}","href":"/api-reference/public/check-raw-quote-exists"},{"title":"List recent quotes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/recent","href":"/api-reference/public/list-recent-quotes"},{"title":"List nodes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/nodes","href":"/api-reference/public/list-nodes"},{"title":"List node device IDs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/device_ids","href":"/api-reference/public/list-node-device-ids"},{"title":"List node PPIDs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/attestations/ppids","href":"/api-reference/public/list-node-ppids"}]},{"group":"KMS","pages":[{"title":"List KMS contracts","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms","href":"/api-reference/public/list-kms-contracts"},{"title":"Get KMS contract details","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms/{kms_id}","href":"/api-reference/public/get-kms-contract-details"},{"title":"Inspect KMS instance","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms/{kms_id}/info","href":"/api-reference/public/inspect-kms-instance"},{"title":"Get app encryption pubkey","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms/{kms_id}/pubkey/{app_id}","href":"/api-reference/public/get-app-encryption-pubkey"},{"title":"Get on-chain KMS details by chain","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms/on-chain/{chain}","href":"/api-reference/public/get-on-chain-kms-details-by-chain"},{"title":"Predict next app IDs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/kms/phala/next_app_id","href":"/api-reference/kms/predict-next-app-ids"}]},{"group":"SSH Keys","pages":[{"title":"List user SSH keys","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/user/ssh-keys","href":"/api-reference/user/list-user-ssh-keys"},{"title":"Add SSH key","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/user/ssh-keys","href":"/api-reference/user/add-ssh-key"},{"title":"Delete SSH key","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/user/ssh-keys/{key_id}","href":"/api-reference/user/delete-ssh-key"},{"title":"Import keys from GitHub profile","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/user/ssh-keys/github-profile","href":"/api-reference/user/import-keys-from-github-profile"},{"title":"Sync keys from GitHub","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/user/ssh-keys/github-sync","href":"/api-reference/user/sync-keys-from-github"}]},{"group":"Instance Types","pages":[{"title":"List instance type families","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/instance-types","href":"/api-reference/public/list-instance-type-families"},{"title":"List family instance types","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/instance-types/{family}","href":"/api-reference/public/list-family-instance-types"}]},{"group":"Webhooks","pages":[{"title":"List workspace webhooks","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workspace/webhooks","href":"/api-reference/webhooks/list-workspace-webhooks"},{"title":"Create workspace webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workspace/webhooks","href":"/api-reference/webhooks/create-workspace-webhook"},{"title":"Get webhook details","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workspace/webhooks/{webhook_id}","href":"/api-reference/webhooks/get-webhook-details"},{"title":"Update webhook","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/workspace/webhooks/{webhook_id}","href":"/api-reference/webhooks/update-webhook"},{"title":"Delete webhook","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/workspace/webhooks/{webhook_id}","href":"/api-reference/webhooks/delete-webhook"},{"title":"Reveal webhook secret (requires 2FA)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workspace/webhooks/{webhook_id}/reveal-secret","href":"/api-reference/webhooks/reveal-webhook-secret-requires-2fa"},{"title":"Rotate webhook secret (requires 2FA)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workspace/webhooks/{webhook_id}/rotate-secret","href":"/api-reference/webhooks/rotate-webhook-secret-requires-2fa"},{"title":"Send test webhook event","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workspace/webhooks/{webhook_id}/test","href":"/api-reference/webhooks/send-test-webhook-event"},{"title":"List webhook deliveries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workspace/webhooks/{webhook_id}/deliveries","href":"/api-reference/webhooks/list-webhook-deliveries"},{"title":"Resend a webhook delivery","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workspace/webhooks/{webhook_id}/deliveries/{event_id}/resend","href":"/api-reference/webhooks/resend-a-webhook-delivery"},{"title":"Get webhook delivery stats","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workspace/webhooks/{webhook_id}/stats","href":"/api-reference/webhooks/get-webhook-delivery-stats"}]}]},{"group":"JavaScript SDK","pages":[{"title":"Cloud JS SDK","href":"/phala-cloud/references/cloud-js-sdk/overview"},{"title":"Authentication","href":"/phala-cloud/references/cloud-js-sdk/authentication"},{"title":"CVM Lifecycle","href":"/phala-cloud/references/cloud-js-sdk/cvm-lifecycle"},{"title":"CVM Configuration","href":"/phala-cloud/references/cloud-js-sdk/cvm-configuration"},{"title":"CVM Query","href":"/phala-cloud/references/cloud-js-sdk/cvm-query"},{"title":"provisionCvm","href":"/phala-cloud/references/cloud-js-sdk/provision-cvm"},{"title":"commitCvmProvision","href":"/phala-cloud/references/cloud-js-sdk/commit-cvm-provision"},{"title":"updateCvmEnvs","href":"/phala-cloud/references/cloud-js-sdk/update-cvm-envs"},{"title":"updateDockerCompose","href":"/phala-cloud/references/cloud-js-sdk/update-docker-compose"},{"title":"watchCvmState","href":"/phala-cloud/references/cloud-js-sdk/watch-cvm-state"},{"title":"Apps","href":"/phala-cloud/references/cloud-js-sdk/apps"},{"title":"Workspaces","href":"/phala-cloud/references/cloud-js-sdk/workspaces"},{"title":"KMS","href":"/phala-cloud/references/cloud-js-sdk/kms"},{"title":"SSH Keys","href":"/phala-cloud/references/cloud-js-sdk/ssh-keys"},{"title":"Nodes \u0026 Instance Types","href":"/phala-cloud/references/cloud-js-sdk/nodes-and-instance-types"},{"title":"getAppEnvEncryptPubKey","href":"/phala-cloud/references/cloud-js-sdk/get-app-env-encrypt-pubkey"},{"title":"deployAppAuth","href":"/phala-cloud/references/cloud-js-sdk/deploy-app-auth"},{"title":"addComposeHash","href":"/phala-cloud/references/cloud-js-sdk/add-compose-hash"},{"title":"Schema Reference","href":"/phala-cloud/references/cloud-js-sdk/schema-reference"},{"title":"Error Handling","href":"/phala-cloud/references/cloud-js-sdk/error-handling"},{"title":"API Versioning","href":"/phala-cloud/references/cloud-js-sdk/api-versioning"},{"title":"Changelog","href":"/phala-cloud/references/cloud-js-sdk/changelog"}]},{"group":"Python SDK","pages":[{"title":"Cloud Python SDK","href":"/phala-cloud/references/cloud-python-sdk/overview"},{"title":"Authentication","href":"/phala-cloud/references/cloud-python-sdk/authentication"},{"title":"CVM Lifecycle","href":"/phala-cloud/references/cloud-python-sdk/cvm-lifecycle"},{"title":"CVM Configuration","href":"/phala-cloud/references/cloud-python-sdk/cvm-configuration"},{"title":"Apps","href":"/phala-cloud/references/cloud-python-sdk/apps"},{"title":"Workspaces","href":"/phala-cloud/references/cloud-python-sdk/workspaces"},{"title":"KMS","href":"/phala-cloud/references/cloud-python-sdk/kms"},{"title":"SSH Keys","href":"/phala-cloud/references/cloud-python-sdk/ssh-keys"},{"title":"Error Handling","href":"/phala-cloud/references/cloud-python-sdk/error-handling"},{"title":"Changelog","href":"/phala-cloud/references/cloud-python-sdk/changelog"}]},{"group":"Go SDK","pages":[{"title":"Cloud Go SDK","href":"/phala-cloud/references/cloud-go-sdk/overview"},{"title":"Authentication","href":"/phala-cloud/references/cloud-go-sdk/authentication"},{"title":"CVM Lifecycle","href":"/phala-cloud/references/cloud-go-sdk/cvm-lifecycle"},{"title":"CVM Configuration","href":"/phala-cloud/references/cloud-go-sdk/cvm-configuration"},{"title":"Watch CVM State","href":"/phala-cloud/references/cloud-go-sdk/watch-cvm-state"},{"title":"Apps","href":"/phala-cloud/references/cloud-go-sdk/apps"},{"title":"Workspaces","href":"/phala-cloud/references/cloud-go-sdk/workspaces"},{"title":"KMS","href":"/phala-cloud/references/cloud-go-sdk/kms"},{"title":"SSH Keys","href":"/phala-cloud/references/cloud-go-sdk/ssh-keys"},{"title":"Error Handling","href":"/phala-cloud/references/cloud-go-sdk/error-handling"},{"title":"Changelog","href":"/phala-cloud/references/cloud-go-sdk/changelog"}]},{"group":"Terraform Provider","pages":[{"title":"Terraform Provider","href":"/phala-cloud/references/terraform-provider/overview"},{"title":"phala_app Resource","href":"/phala-cloud/references/terraform-provider/app-resource"},{"title":"phala_cvm_power Resource","href":"/phala-cloud/references/terraform-provider/cvm-power"},{"title":"phala_ssh_key Resource","href":"/phala-cloud/references/terraform-provider/ssh-key"},{"title":"Data Sources","href":"/phala-cloud/references/terraform-provider/data-sources"},{"title":"Examples","href":"/phala-cloud/references/terraform-provider/examples"},{"title":"Changelog","href":"/phala-cloud/references/terraform-provider/changelog"}]},{"title":"Error Codes","href":"/phala-cloud/references/error-codes"},{"title":"Webhooks","href":"/phala-cloud/references/webhooks"}]},{"group":"Successful Cases","pages":[{"title":"Overview","href":"/phala-cloud/cases/overview"},{"title":"Building confidential AI","href":"/phala-cloud/cases/tee_with_ai"},{"title":"2FA for FHE/MPC Systems","href":"/phala-cloud/cases/tee_with_fhe_and_mpc"},{"title":"Private Proving with TEE","href":"/phala-cloud/cases/tee_with_zk_and_zkrollup"},{"title":"Cases Explorer","href":"/phala-cloud/cases/best-practices-and-successful-case"}]},{"title":"FAQ","href":"/phala-cloud/faqs"},{"title":"What's New","href":"/phala-cloud/changelog"},{"title":"Get Support","href":"/phala-cloud/support"}]}]},{"tab":"Private AI","icon":"shield-check","pages":[{"title":"Private AI","href":"/phala-cloud/confidential-ai/overview"}]},{"tab":"dstack","icon":"terminal","pages":[{"title":"dstack","href":"/dstack/overview"}]},{"tab":"dstack Cloud","icon":"server","pages":[{"title":"dstack Cloud","href":"/dstack-cloud/overview"}]},{"tab":"Network","icon":"network","pages":[{"title":"Network","href":"/network"}]}]},"basePath":"","title":"Phala Cloud Documentation — Private AI on TEE","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}