[{"data":1,"prerenderedAt":705},["ShallowReactive",2],{"navigation_docs":3,"-configure-integrations":136,"-configure-integrations-surround":700},[4,26,47,68,89,110,123],{"title":5,"path":6,"stem":7,"children":8,"page":25},"Getting Started","\u002Fgetting-started","1.getting-started",[9,13,17,21],{"title":10,"path":11,"stem":12},"What you are running","\u002Fgetting-started\u002Fwhat-you-are-running","1.getting-started\u002F1.what-you-are-running",{"title":14,"path":15,"stem":16},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F2.architecture",{"title":18,"path":19,"stem":20},"Prerequisites","\u002Fgetting-started\u002Fprerequisites","1.getting-started\u002F3.prerequisites",{"title":22,"path":23,"stem":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F4.quickstart",false,{"title":27,"path":28,"stem":29,"children":30,"page":25},"Install","\u002Finstall","2.install",[31,35,39,43],{"title":32,"path":33,"stem":34},"Install the chart","\u002Finstall\u002Finstall-the-chart","2.install\u002F1.install-the-chart",{"title":36,"path":37,"stem":38},"Activation","\u002Finstall\u002Factivation","2.install\u002F2.activation",{"title":40,"path":41,"stem":42},"DNS and TLS","\u002Finstall\u002Fdns-and-tls","2.install\u002F3.dns-and-tls",{"title":44,"path":45,"stem":46},"Verify your install","\u002Finstall\u002Fverify-your-install","2.install\u002F4.verify-your-install",{"title":48,"path":49,"stem":50,"children":51,"page":25},"Configure","\u002Fconfigure","3.configure",[52,56,60,64],{"title":53,"path":54,"stem":55},"Data services","\u002Fconfigure\u002Fdata-services","3.configure\u002F1.data-services",{"title":57,"path":58,"stem":59},"Secrets","\u002Fconfigure\u002Fsecrets","3.configure\u002F2.secrets",{"title":61,"path":62,"stem":63},"Registry and air-gapped installs","\u002Fconfigure\u002Fregistry-and-airgap","3.configure\u002F3.registry-and-airgap",{"title":65,"path":66,"stem":67},"Integrations","\u002Fconfigure\u002Fintegrations","3.configure\u002F4.integrations",{"title":69,"path":70,"stem":71,"children":72,"page":25},"Licensing","\u002Flicensing","4.licensing",[73,77,81,85],{"title":74,"path":75,"stem":76},"How licensing works","\u002Flicensing\u002Fhow-licensing-works","4.licensing\u002F1.how-licensing-works",{"title":78,"path":79,"stem":80},"Your key never leaves","\u002Flicensing\u002Fyour-key-never-leaves","4.licensing\u002F2.your-key-never-leaves",{"title":82,"path":83,"stem":84},"What phones home","\u002Flicensing\u002Fwhat-phones-home","4.licensing\u002F3.what-phones-home",{"title":86,"path":87,"stem":88},"Revoke and recover","\u002Flicensing\u002Frevoke-and-recover","4.licensing\u002F4.revoke-and-recover",{"title":90,"path":91,"stem":92,"children":93,"page":25},"Operate","\u002Foperate","5.operate",[94,98,102,106],{"title":95,"path":96,"stem":97},"Upgrade","\u002Foperate\u002Fupgrade","5.operate\u002F1.upgrade",{"title":99,"path":100,"stem":101},"Backup and restore","\u002Foperate\u002Fbackup-and-restore","5.operate\u002F2.backup-and-restore",{"title":103,"path":104,"stem":105},"Observability","\u002Foperate\u002Fobservability","5.operate\u002F3.observability",{"title":107,"path":108,"stem":109},"High availability","\u002Foperate\u002Fhigh-availability","5.operate\u002F4.high-availability",{"title":111,"path":112,"stem":113,"children":114,"page":25},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting",[115,119],{"title":116,"path":117,"stem":118},"Install failures","\u002Ftroubleshooting\u002Finstall-failures","6.troubleshooting\u002F1.install-failures",{"title":120,"path":121,"stem":122},"Licensing failures","\u002Ftroubleshooting\u002Flicensing-failures","6.troubleshooting\u002F2.licensing-failures",{"title":124,"path":125,"stem":126,"children":127,"page":25},"Reference","\u002Freference","9.reference",[128,132],{"title":129,"path":130,"stem":131},"Helm values","\u002Freference\u002Fhelm-values","9.reference\u002F1.helm-values",{"title":133,"path":134,"stem":135},"Environment variables","\u002Freference\u002Fenvironment","9.reference\u002F2.environment",{"id":137,"title":65,"body":138,"description":693,"extension":694,"links":695,"meta":696,"navigation":697,"path":66,"seo":698,"stem":67,"__hash__":699},"docs\u002F3.configure\u002F4.integrations.md",{"type":139,"value":140,"toc":687},"minimark",[141,145,149,161,223,226,231,234,292,307,332,335,372,375,382,386,393,480,493,499,503,508,553,567,576,580,583,641,663,669,672,683],[142,143,65],"h1",{"id":144},"integrations",[146,147,148],"p",{},"Everything on this page is optional. The platform boots, serves and stays licensed without any of it. Each one adds a feature, and the feature it adds is the only thing that stops working if you leave it out.",[146,150,151,152,156,157,160],{},"Two Helm values carry any environment the chart does not template itself. ",[153,154,155],"code",{},"api.env"," is a map that lands in the ConfigMap, for plain settings. ",[153,158,159],{},"api.secretEnv"," is a map that lands in the platform Secret, for credentials. Both are merged in verbatim, so anything the API reads from its environment can be set through one of them.",[162,163,168],"pre",{"className":164,"code":165,"language":166,"meta":167,"style":167},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","api:\n  env:\n    SENTRY_DSN: https:\u002F\u002Fabc123@o0.ingest.sentry.io\u002F0\n  secretEnv:\n    ANTHROPIC_API_KEY: sk-ant-...\n","yaml","",[153,169,170,183,191,204,212],{"__ignoreMap":167},[171,172,175,179],"span",{"class":173,"line":174},"line",1,[171,176,178],{"class":177},"swJcz","api",[171,180,182],{"class":181},"sMK4o",":\n",[171,184,186,189],{"class":173,"line":185},2,[171,187,188],{"class":177},"  env",[171,190,182],{"class":181},[171,192,194,197,200],{"class":173,"line":193},3,[171,195,196],{"class":177},"    SENTRY_DSN",[171,198,199],{"class":181},":",[171,201,203],{"class":202},"sfazB"," https:\u002F\u002Fabc123@o0.ingest.sentry.io\u002F0\n",[171,205,207,210],{"class":173,"line":206},4,[171,208,209],{"class":177},"  secretEnv",[171,211,182],{"class":181},[171,213,215,218,220],{"class":173,"line":214},5,[171,216,217],{"class":177},"    ANTHROPIC_API_KEY",[171,219,199],{"class":181},[171,221,222],{"class":202}," sk-ant-...\n",[146,224,225],{},"Supplier and payment credentials go through the same two maps. They are out of scope for this page, and none of them gate a boot: each feature stays off until its key is there.",[227,228,230],"h2",{"id":229},"outbound-email","Outbound email",[146,232,233],{},"The platform sends transactional mail (order confirmations, eSIM delivery, password resets) through an email worker that reads jobs off Kafka, renders the template, and hands the result to Resend.",[162,235,239],{"className":236,"code":237,"language":238,"meta":167,"style":167},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","--set ess.enabled=true \\\n--set auth.resendAPIKey=re_... \\\n--set auth.fromEmail=support@acme.com \\\n--set auth.fromName='Acme Mobile'\n","bash",[153,240,241,257,267,276],{"__ignoreMap":167},[171,242,243,247,250,253],{"class":173,"line":174},[171,244,246],{"class":245},"sBMFI","--set",[171,248,249],{"class":202}," ess.enabled=",[171,251,252],{"class":181},"true",[171,254,256],{"class":255},"sTEyZ"," \\\n",[171,258,259,262,265],{"class":173,"line":185},[171,260,261],{"class":255},"--set ",[171,263,264],{"class":202},"auth.resendAPIKey=re_...",[171,266,256],{"class":255},[171,268,269,271,274],{"class":173,"line":193},[171,270,261],{"class":255},[171,272,273],{"class":202},"auth.fromEmail=support@acme.com",[171,275,256],{"class":255},[171,277,278,280,283,286,289],{"class":173,"line":206},[171,279,261],{"class":255},[171,281,282],{"class":202},"auth.fromName=",[171,284,285],{"class":181},"'",[171,287,288],{"class":202},"Acme Mobile",[171,290,291],{"class":181},"'\n",[146,293,294,295,298,299,302,303,306],{},"The worker only renders if Kafka is wired: ",[153,296,297],{},"ess.enabled=true"," with no brokers renders nothing at all, silently. If you set ",[153,300,301],{},"kafka.mode=external"," and left ",[153,304,305],{},"kafka.external.brokers"," empty, that is the case you are in.",[146,308,309,312,313,316,317,320,321,324,325,328,329,331],{},[153,310,311],{},"auth.resendAPIKey"," lands in the Secret as ",[153,314,315],{},"RESEND_API_KEY"," and is read by both the email worker and the auth service. ",[153,318,319],{},"auth.fromEmail"," and ",[153,322,323],{},"auth.fromName"," are the envelope every message goes out under. If you want Resend's delivery webhooks verified, put ",[153,326,327],{},"RESEND_WEBHOOK_SIGNING_KEY"," in ",[153,330,159],{},"; the worker reads it as an optional key and runs without it.",[146,333,334],{},"The auth service sends its own mail separately, for sign-up confirmation and recovery. Three ways to configure it:",[336,337,338,344,363],"ul",{},[339,340,341,343],"li",{},[153,342,311],{},", the same key as above.",[339,345,346,349,350,349,353,349,356,320,359,362],{},[153,347,348],{},"auth.smtp.host",", ",[153,351,352],{},".port",[153,354,355],{},".user",[153,357,358],{},".password",[153,360,361],{},".adminEmail",", if you have an SMTP relay and no Resend account.",[339,364,365,368,369,371],{},[153,366,367],{},"auth.emailHook.enabled=true",", which routes the auth service's mail through the email worker instead, so confirmation mail matches your branded templates rather than GoTrue's plain ones. This needs ",[153,370,297],{},".",[146,373,374],{},"Leave all three unset and the auth service sends nothing. Sign-ups auto-confirm and no mail is attempted. Fine for a smoke test, wrong for a real storefront.",[146,376,377,381],{},[378,379,380],"strong",{},"Without any of this:"," the platform runs. Orders complete, eSIMs provision. No email arrives, and email jobs pile up unsent.",[227,383,385],{"id":384},"object-storage","Object storage",[146,387,388,389,320,391,199],{},"Uploads (logos, product images, CMS media) go to an S3-compatible bucket. The chart configures none of it, so set it through ",[153,390,155],{},[153,392,159],{},[162,394,396],{"className":164,"code":395,"language":166,"meta":167,"style":167},"api:\n  env:\n    STORAGE_PROVIDER: r2\n    R2_ACCOUNT_ID: \u003Ccloudflare-account-id>\n    R2_ACCESS_KEY_ID: \u003Caccess-key-id>\n    R2_BUCKET_NAME: solvegio-media\n    R2_PUBLIC_URL: https:\u002F\u002Fmedia.acme.com\n  secretEnv:\n    R2_SECRET_ACCESS_KEY: \u003Csecret-access-key>\n",[153,397,398,404,410,420,430,440,451,462,469],{"__ignoreMap":167},[171,399,400,402],{"class":173,"line":174},[171,401,178],{"class":177},[171,403,182],{"class":181},[171,405,406,408],{"class":173,"line":185},[171,407,188],{"class":177},[171,409,182],{"class":181},[171,411,412,415,417],{"class":173,"line":193},[171,413,414],{"class":177},"    STORAGE_PROVIDER",[171,416,199],{"class":181},[171,418,419],{"class":202}," r2\n",[171,421,422,425,427],{"class":173,"line":206},[171,423,424],{"class":177},"    R2_ACCOUNT_ID",[171,426,199],{"class":181},[171,428,429],{"class":202}," \u003Ccloudflare-account-id>\n",[171,431,432,435,437],{"class":173,"line":214},[171,433,434],{"class":177},"    R2_ACCESS_KEY_ID",[171,436,199],{"class":181},[171,438,439],{"class":202}," \u003Caccess-key-id>\n",[171,441,443,446,448],{"class":173,"line":442},6,[171,444,445],{"class":177},"    R2_BUCKET_NAME",[171,447,199],{"class":181},[171,449,450],{"class":202}," solvegio-media\n",[171,452,454,457,459],{"class":173,"line":453},7,[171,455,456],{"class":177},"    R2_PUBLIC_URL",[171,458,199],{"class":181},[171,460,461],{"class":202}," https:\u002F\u002Fmedia.acme.com\n",[171,463,465,467],{"class":173,"line":464},8,[171,466,209],{"class":177},[171,468,182],{"class":181},[171,470,472,475,477],{"class":173,"line":471},9,[171,473,474],{"class":177},"    R2_SECRET_ACCESS_KEY",[171,476,199],{"class":181},[171,478,479],{"class":202}," \u003Csecret-access-key>\n",[146,481,482,485,486,489,490,371],{},[153,483,484],{},"R2_PUBLIC_URL"," is the hostname the bucket's objects are served from, and it is what gets written into the URLs the platform stores. Point it at a domain you control rather than a bucket URL you might want to move off later. ",[153,487,488],{},"STORAGE_PROVIDER"," defaults to ",[153,491,492],{},"r2",[146,494,495,498],{},[378,496,497],{},"Without it:"," the platform runs and serves. Any upload fails. If you never upload a logo or a product image, you will never notice.",[227,500,502],{"id":501},"error-reporting","Error reporting",[146,504,505,506,199],{},"Sentry, if you use it. Three keys, all non-secret, all in ",[153,507,155],{},[162,509,511],{"className":164,"code":510,"language":166,"meta":167,"style":167},"api:\n  env:\n    SENTRY_DSN: https:\u002F\u002Fabc123@o0.ingest.sentry.io\u002F0\n    SENTRY_ENV: production\n    SENTRY_RELEASE: v1.4.2\n",[153,512,513,519,525,533,543],{"__ignoreMap":167},[171,514,515,517],{"class":173,"line":174},[171,516,178],{"class":177},[171,518,182],{"class":181},[171,520,521,523],{"class":173,"line":185},[171,522,188],{"class":177},[171,524,182],{"class":181},[171,526,527,529,531],{"class":173,"line":193},[171,528,196],{"class":177},[171,530,199],{"class":181},[171,532,203],{"class":202},[171,534,535,538,540],{"class":173,"line":206},[171,536,537],{"class":177},"    SENTRY_ENV",[171,539,199],{"class":181},[171,541,542],{"class":202}," production\n",[171,544,545,548,550],{"class":173,"line":214},[171,546,547],{"class":177},"    SENTRY_RELEASE",[171,549,199],{"class":181},[171,551,552],{"class":202}," v1.4.2\n",[146,554,555,558,559,562,563,566],{},[153,556,557],{},"SENTRY_DSN"," is the only one that turns it on. ",[153,560,561],{},"SENTRY_ENV"," labels which install an error came from, which matters once you have a staging deployment alongside production. ",[153,564,565],{},"SENTRY_RELEASE"," labels which build.",[146,568,569,571,572,575],{},[378,570,497],{}," errors are logged to stdout and nowhere else. ",[153,573,574],{},"kubectl logs"," is your only view of them.",[227,577,579],{"id":578},"ai-translation","AI translation",[146,581,582],{},"The platform can translate catalog and CMS content in the background. It ships configured for Anthropic and needs a key before the engine will run:",[162,584,586],{"className":164,"code":585,"language":166,"meta":167,"style":167},"api:\n  env:\n    TRANSLATION_AI_PROVIDER: anthropic     # chart default\n    TRANSLATION_AI_MODEL: claude-sonnet-5  # chart default\n  secretEnv:\n    ANTHROPIC_API_KEY: sk-ant-...\n",[153,587,588,594,600,614,627,633],{"__ignoreMap":167},[171,589,590,592],{"class":173,"line":174},[171,591,178],{"class":177},[171,593,182],{"class":181},[171,595,596,598],{"class":173,"line":185},[171,597,188],{"class":177},[171,599,182],{"class":181},[171,601,602,605,607,610],{"class":173,"line":193},[171,603,604],{"class":177},"    TRANSLATION_AI_PROVIDER",[171,606,199],{"class":181},[171,608,609],{"class":202}," anthropic",[171,611,613],{"class":612},"sHwdD","     # chart default\n",[171,615,616,619,621,624],{"class":173,"line":206},[171,617,618],{"class":177},"    TRANSLATION_AI_MODEL",[171,620,199],{"class":181},[171,622,623],{"class":202}," claude-sonnet-5",[171,625,626],{"class":612},"  # chart default\n",[171,628,629,631],{"class":173,"line":214},[171,630,209],{"class":177},[171,632,182],{"class":181},[171,634,635,637,639],{"class":173,"line":442},[171,636,217],{"class":177},[171,638,199],{"class":181},[171,640,222],{"class":202},[146,642,643,644,647,648,651,652,647,655,658,659,662],{},"The provider and the key have to agree. ",[153,645,646],{},"TRANSLATION_AI_PROVIDER: openai"," reads ",[153,649,650],{},"OPENAI_API_KEY",", and ",[153,653,654],{},"google",[153,656,657],{},"GOOGLE_TRANSLATE_API_KEY"," and ignores ",[153,660,661],{},"TRANSLATION_AI_MODEL"," entirely. Setting a key without switching the provider does nothing.",[146,664,665,668],{},[378,666,667],{},"Without the matching key:"," the engine is disabled. The platform boots, the API serves, and translation jobs sit in the queue as pending. Nothing errors and nothing retries. Add the key and they start moving.",[670,671],"hr",{},[146,673,674,675,679,680,682],{},"Every variable named here, plus the ones the chart sets for you, is in the ",[676,677,678],"a",{"href":134},"environment reference",". The Helm values that wrap them are in the ",[676,681,129],{"href":130}," reference.",[684,685,686],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":167,"searchDepth":174,"depth":185,"links":688},[689,690,691,692],{"id":229,"depth":185,"text":230},{"id":384,"depth":185,"text":385},{"id":501,"depth":185,"text":502},{"id":578,"depth":185,"text":579},"The optional pieces: outbound email, object storage, error reporting and the AI translation keys.","md",null,{},true,{"title":65,"description":693},"JXO6wzScwNyGFsgw-_jO25HhqS2yGQ_mf_JUj7-C2yI",[701,703],{"title":61,"path":62,"stem":63,"description":702,"children":-1},"Pinning images by digest, mirroring the image set into your own registry, and pulling from a private one.",{"title":74,"path":75,"stem":76,"description":704,"children":-1},"The full lifecycle of your license, from the activation code you paste into helm install to the renewals that keep your deployment serving.",1783967741116]