By the end of this guide, you will have a horizontally scaled Maverics deployment with multiple Orchestrator instances, sticky sessions, local session storage, and mode-appropriate Redis caching.A single Orchestrator instance can handle a significant amount of traffic — the Orchestrator is small, lightweight, and efficient. But production workloads often require multiple instances for high availability (if one instance goes down, the others continue serving traffic) and for handling peak loads that exceed a single instance’s capacity. Scaling the Orchestrator horizontally requires sticky sessions (cookie-based session affinity) on your load balancer so that each user’s requests consistently reach the same Orchestrator instance, plus Redis caching when your mode requires cross-instance data sharing.
Console terminology: In the Maverics Console, Orchestrator instances and
configuration delivery are managed through Deployments. When working directly
with YAML, configuration is managed as files delivered via the -config flag or
MAVERICS_CONFIG environment variable.
A running Orchestrator deployment — If you have not deployed to production yet, follow the Deploy to Production guide first.
A load balancer that supports cookie-based session affinity (sticky sessions) — Any HTTP load balancer that supports health check-based routing and cookie-based affinity (NGINX Plus, HAProxy, AWS ALB, F5 BIG-IP, GCP Load Balancer, etc.).
A Redis instance — Required for OIDC Provider mode; recommended for SAML Provider mode; not needed for other modes. See the Redis Cache reference for setup.
Sessions are stored locally on each Orchestrator instance. Sticky sessions (session affinity) ensure that each user’s requests consistently reach the same instance, so the Orchestrator can find the user’s session on every request.Configure your load balancer to use cookie-based affinity targeting the maverics_session cookie (or your custom session.cookie.name value). Cookie-based affinity is more reliable than IP-based affinity because it works correctly when multiple users share the same IP address (e.g., behind a corporate NAT) or when a user’s IP changes mid-session (e.g., switching networks on a mobile device).
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
Session storage configuration in Maverics Console
Configure local session storage on each Orchestrator instance. The load balancer handles routing — the Orchestrator configuration is the same as a single-node deployment:
If an Orchestrator node goes down, sessions on that node are lost. Users are transparently re-authenticated via their upstream IdP session — they experience a brief redirect but are not prompted to log in again.
2
Add Redis caching (if needed)
Redis is a cache for connector tokens and provider data — not a session store. In multi-node deployments, Redis ensures that provider-specific data (authorization codes, SAML request data, connector tokens) is accessible from any Orchestrator instance, even though each user’s requests are routed to the same instance via sticky sessions.The need for Redis depends on which Orchestrator mode you are using:
OIDC Provider: Redis cache is required for multi-node deployments. The OIDC Provider stores authorization codes, token state, and provider data in the cache. Without Redis, an authorization code issued by one instance cannot be redeemed by another — and even with sticky sessions, the token endpoint request may arrive from the application server rather than the user’s browser, bypassing session affinity.
SAML Provider: Redis cache is recommended. The SAML Provider caches SAML request data (AuthnRequest and LogoutRequest form parameters) so that after a user authenticates upstream, any Orchestrator instance can restore the original request context and generate the SAML response. Without Redis, if the authentication callback arrives at a different instance than the one that received the original AuthnRequest, the SAML response flow will fail because the request data is only in local memory.
HTTP Proxy: Redis cache is not needed. Each instance manages its own connector tokens independently.
LDAP Provider: A shared cache is not typically needed for standalone LDAP Provider deployments — the LDAP Provider uses per-connection bind state. However, in facade (sandwich) deployments where HTTP Proxy and LDAP Provider run as separate Orchestrator instances, a shared cache is required so that one-time credentials generated by the proxy can be validated by the LDAP Provider. When both modes run on a single Orchestrator, the local cache is sufficient. See LDAP Provider — Pairing with HTTP Proxy and the Caches reference.
AI Identity Gateway: A cache is not typically needed. AI Identity Gateway uses token-based state tied to the upstream OAuth authorization server.
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
Redis cache configuration in Maverics Console
Define a Redis cache and reference it from your provider configuration:
maverics.yaml
caches: - name: "my-redis" type: "redis" redis: addresses: - "redis.example.com:6379" password: <vault.redis-password> tls: "redis-tls"# Reference the cache from your provider:oidcProvider: cache: "my-redis" # ... other oidcProvider configsamlProvider: cache: "my-redis" # ... other samlProvider config
See Redis Cache Reference for all Redis cache fields including encryption and hashing options.
3
Configure load balancing
A load balancer distributes incoming requests across your Orchestrator instances. Configure it to use health check-based routing so that traffic only goes to healthy instances, and cookie-based sticky sessions so that each user’s requests reach the same instance.Key load balancer configuration:
Health check endpoint — Point the load balancer’s health check at the Orchestrator’s /status endpoint. Remove instances from the pool when they return an unhealthy status.
Sticky sessions — Configure cookie-based session affinity using the maverics_session cookie (or your custom session.cookie.name value). This ensures each user’s requests consistently reach the same Orchestrator instance.
Connection draining — When an instance is removed from the pool (during a rolling update or failure), allow existing connections to complete before terminating the instance. This prevents request failures during deployments.
TLS termination — Decide whether TLS terminates at the load balancer or at the Orchestrator. Terminating at the load balancer is simpler to manage when running multiple instances.
Load balancers are external to the Orchestrator — they are configured in your infrastructure layer, not in maverics.yaml. Select your load balancer below for configuration examples:
NGINX Plus
HAProxy
AWS ALB
F5 BIG-IP
Azure Application Gateway
GCP Load Balancer
Traefik
upstream maverics { server 10.0.1.10:9443; server 10.0.1.11:9443; server 10.0.1.12:9443; # Use the Orchestrator's session cookie for affinity. # If you customized session.cookie.name, use that value instead. sticky cookie maverics_session;}server { listen 443 ssl; server_name app.example.com; location / { proxy_pass https://maverics; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /status { proxy_pass https://maverics/status; }}
frontend maverics_fe bind *:443 ssl crt /etc/haproxy/certs/app.pem default_backend maverics_bebackend maverics_be cookie maverics_session insert indirect nocache server orch1 10.0.1.10:9443 ssl check cookie orch1 server orch2 10.0.1.11:9443 ssl check cookie orch2 server orch3 10.0.1.12:9443 ssl check cookie orch3 option httpchk GET /status
HAProxy’s cookie directive in the backend inserts a cookie to track which server handles each session. The insert indirect nocache options tell HAProxy to manage the affinity cookie transparently.
Enable application cookie-based stickiness on the ALB target group:
In the AWS Console: navigate to EC2 > Target Groups > your target group > Attributes > Stickiness, enable stickiness, select Application-based cookie, and set the cookie name to maverics_session.
Use an iRule or a persistence profile with cookie-based persistence targeting the maverics_session cookie. Consult your load balancer’s documentation for cookie-based affinity configuration.
Enable cookie-based affinity on the backend settings. Azure Application Gateway uses its own affinity cookie by default, but can be configured for application-managed affinity. Consult the Azure documentation for cookie-based affinity configuration.
Use a backend service with GENERATED_COOKIE or HTTP_COOKIE session affinity and specify the maverics_session cookie name. Consult the GCP documentation for cookie-based affinity configuration.
Use the sticky sessions configuration in the load balancer service definition with a cookie name of maverics_session. Consult the Traefik documentation for sticky session configuration.
Always use cookie-based affinity rather than IP-based affinity. Cookie-based affinity works correctly when users share IPs (corporate NAT) or change networks mid-session (mobile devices). Each user’s requests will consistently reach the same Orchestrator instance based on their session cookie.
4
Verify high availability
With multiple instances behind a load balancer and sticky sessions configured, verify that your deployment is truly highly available by testing failover.
# Verify all instances are healthy via the load balancercurl -s https://your-load-balancer:9443/status | jq .# Authenticate through the load balancer and verify your session works# Make several requests to confirm sticky sessions are routing correctly
Test a failover scenario:
Authenticate through the load balancer — Establish a session
Stop one Orchestrator instance — Simulate a failure
Make another request — If the stopped instance was handling your session, the load balancer routes you to a healthy instance. The Orchestrator redirects you to your upstream IdP, which recognizes your existing IdP session and completes authentication silently — you experience a brief redirect but are not prompted to log in again.
Restart the stopped instance — It should rejoin the pool automatically once the health check passes
Success! Your Orchestrator deployment is horizontally scaled with high
availability. Each instance stores sessions locally, the load balancer uses
cookie-based sticky sessions to route users consistently, and failover
triggers transparent re-authentication via the upstream IdP.
Sessions lost when requests hit a different instance
If users are being asked to re-authenticate unexpectedly, sticky sessions
may be misconfigured:
Verify the load balancer has cookie-based session affinity configured on the session cookie (maverics_session by default, or your custom session.cookie.name value).
Verify all instances use store.type: "local".
Check load balancer logs to confirm requests from the same user consistently reach the same instance.
If using IP-based affinity instead of cookie-based, switch to cookie-based affinity. IP-based affinity breaks when multiple users share the same IP (corporate NAT) or when a user’s IP changes mid-session.
Instance not joining the load balancer pool
If a new or restarted Orchestrator instance is not receiving traffic, check
that:
The instance’s health endpoint is returning a healthy status
The load balancer’s health check is configured to poll the correct port and
path
The health check interval and threshold are set appropriately — some load
balancers require multiple consecutive healthy responses before adding an
instance to the pool
Network rules allow the load balancer to reach the instance on both the
application port and the health check port
Scale the two-tier AI Identity Gateway architecture with MCP-specific load balancing and token exchange tuning
Deploy to Production
Set up your production deployment before scaling horizontally
Sessions
Session store types and session configuration
Redis Cache
Redis cache configuration for connector tokens and provider data
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Maverics Documentation","colors":{"primary":"#1DA1DC","light":"#2FCAFF","dark":"#0086C0"},"logo":{"light":"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/light.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=f75039b8474c2403c381ef74fdbee428","dark":"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/dark.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=c18e3db0543ce5426f86c06a48cfceba","href":"https://www.strata.io"},"favicon":"https://mintcdn.com/strataidentity/bx_Hbkhp9SuRuU18/favicon.svg?fit=max\u0026auto=format\u0026n=bx_Hbkhp9SuRuU18\u0026q=85\u0026s=7a515a8aae3869956b801d7d0a8a555c","appearance":{"default":"dark","strict":false},"navbar":{"links":[{"href":"https://strataidentity.my.site.com/support/s/","label":"Support"}],"primary":{"type":"button","label":"Console Login","href":"https://maverics.strata.io"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/strata-identity","github":"https://github.com/strata-io","x":"https://x.com/strataidentity","youtube":"https://www.youtube.com/@strataidentity"},"links":[{"header":"Resources","items":[{"label":"Legacy Docs","href":"https://legacy-docs.strata.io"}]},{"header":"Help","items":[{"label":"Status","href":"https://status.strata.io/"},{"label":"Support Center","href":"https://strataidentity.my.site.com/support/s"}]},{"header":"Terms and Policy","items":[{"label":"Privacy Policy","href":"https://www.strata.io/privacy-policy"},{"label":"Trust Center","href":"https://security-trust.strata.io/"},{"label":"Cookie Declaration","href":"https://www.strata.io/legal/cookiebot-declaration"}]}]},"integrations":{"cookies":{"key":"cookieconsent_analytics_allowed","value":"true"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"Looks like this page has moved or doesn't exist yet. Try searching the docs or head back to the [homepage](/introduction/overview). If you're looking for older content, it might still be on the [legacy documentation site](https://legacy-docs.strata.io)."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"strataidentity","hasAudioNarration":false,"actualSubdomain":"strataidentity","customDomains":["docs.strata.io"],"gitSource":{"type":"github","owner":"strata-io","repo":"docs.strata.io","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae3d6c44d8c75cc1299ac11","collectionId":"7746a22e-510d-4f26-92ad-5de380a5565d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae3d6c44d8c75cc1299ac11"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae3d6c44d8c75cc1299ac11","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Reference","count":102},{"language":"default","tag":"Orchestration","count":90},{"language":"default","tag":"Guides","count":31},{"language":"default","tag":"Identity Fabric","count":31},{"language":"default","tag":"Configuration","count":18},{"language":"default","tag":"Console Administration","count":12},{"language":"default","tag":"Authentication","count":9},{"language":"default","tag":"Changelog","count":8},{"language":"default","tag":"Config Sources","count":8},{"language":"default","tag":"Secret Providers","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"footer{margin-top:2rem!important}"}],"page":{"pagePath":"guides/operations/scale","slug":"/guides/operations/scale","pageMetadata":{"title":"Scale for Production","icon":"arrows-up-down","description":null,"href":"/guides/operations/scale"},"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},{Accordion,AccordionGroup,Card,CardGroup,Check,CodeBlock,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Tab,Tabs,Tip}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`By the end of this guide, you will have a horizontally scaled Maverics deployment with multiple Orchestrator instances, sticky sessions, local session storage, and mode-appropriate Redis caching.`}),`\n`,_jsx(_components.p,{children:`A single Orchestrator instance can handle a significant amount of traffic — the Orchestrator is small, lightweight, and efficient. But production workloads often require multiple instances for high availability (if one instance goes down, the others continue serving traffic) and for handling peak loads that exceed a single instance’s capacity. Scaling the Orchestrator horizontally requires sticky sessions (cookie-based session affinity) on your load balancer so that each user’s requests consistently reach the same Orchestrator instance, plus Redis caching when your mode requires cross-instance data sharing.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console terminology:`}),` In the Maverics Console, Orchestrator instances and\nconfiguration delivery are managed through `,_jsx(_components.strong,{children:`Deployments`}),`. When working directly\nwith YAML, configuration is managed as files delivered via the `,_jsx(_components.code,{children:`-config`}),` flag or\n`,_jsx(_components.code,{children:`MAVERICS_CONFIG`}),` environment variable.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A running Orchestrator deployment`}),` — If you have not deployed to production yet, follow the `,_jsx(_components.a,{href:`/guides/operations/deploy`,children:`Deploy to Production guide`}),` first.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A load balancer that supports cookie-based session affinity (sticky sessions)`}),` — Any HTTP load balancer that supports health check-based routing and cookie-based affinity (NGINX Plus, HAProxy, AWS ALB, F5 BIG-IP, GCP Load Balancer, etc.).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A Redis instance`}),` — Required for OIDC Provider mode; recommended for SAML Provider mode; not needed for other modes. See the `,_jsx(_components.a,{href:`/reference/orchestrator/caches/redis`,children:`Redis Cache reference`}),` for setup.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`scale-your-deployment`,children:`Scale Your Deployment`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Configure sticky sessions on your load balancer`,children:[_jsx(_components.p,{children:`Sessions are stored locally on each Orchestrator instance. Sticky sessions (session affinity) ensure that each user’s requests consistently reach the same instance, so the Orchestrator can find the user’s session on every request.`}),_jsxs(_components.p,{children:[`Configure your load balancer to use `,_jsx(_components.strong,{children:`cookie-based affinity`}),` targeting the `,_jsx(_components.code,{children:`maverics_session`}),` cookie (or your custom `,_jsx(_components.code,{children:`session.cookie.name`}),` value). Cookie-based affinity is more reliable than IP-based affinity because it works correctly when multiple users share the same IP address (e.g., behind a corporate NAT) or when a user’s IP changes mid-session (e.g., switching networks on a mobile device).`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Console UI`,id:`console-ui`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})}),_jsx(Frame,{caption:`Session storage configuration in Maverics Console`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=ea8d2ec72a69d5a8c7955d78abba6a30`,alt:`Session storage settings in Maverics Console showing local session store configuration`,\"data-og-width\":`800`,width:`800`,\"data-og-height\":`400`,height:`400`,\"data-path\":`images/placeholder.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=280\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=8915bedc81639825bb64f4b29741511e 280w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=560\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=2391aa0bf01425e8995a1b8684607380 560w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=840\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=134f31ce48f4902f27e417082e7da90c 840w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=c17116c17f12c64573cc737986cbe837 1100w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=f1e0a37a82ab3dbb2b0ba6b0f9cc04ca 1650w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=190ef650fddf11454c2bc9b2482c05b6 2500w`})})]}),_jsxs(Tab,{title:`Configuration`,id:`configuration`,children:[_jsx(_components.p,{children:`Configure local session storage on each Orchestrator instance. The load balancer handles routing — the Orchestrator configuration is the same as a single-node deployment:`}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`11`,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:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`session`}),_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:` cookie`}),_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:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"maverics_session\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\".example.com\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` lifetime`}),_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:` maxTimeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"12h\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` idleTimeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"30m\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` store`}),_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:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"local\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` local`}),_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:` capacity`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`50000`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/reference/orchestrator/sessions`,children:`Sessions Reference`}),` for all session configuration fields.`]})]})]}),_jsx(Note,{children:_jsx(_components.p,{children:`If an Orchestrator node goes down, sessions on that node are lost. Users are transparently re-authenticated via their upstream IdP session — they experience a brief redirect but are not prompted to log in again.`})})]}),_jsxs(Step,{title:`Add Redis caching (if needed)`,children:[_jsxs(_components.p,{children:[`Redis is a `,_jsx(_components.strong,{children:`cache`}),` for connector tokens and provider data — not a session store. In multi-node deployments, Redis ensures that provider-specific data (authorization codes, SAML request data, connector tokens) is accessible from any Orchestrator instance, even though each user’s requests are routed to the same instance via sticky sessions.`]}),_jsx(_components.p,{children:`The need for Redis depends on which Orchestrator mode you are using:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`OIDC Provider:`}),` Redis cache is `,_jsx(_components.strong,{children:`required`}),` for multi-node deployments. The OIDC Provider stores authorization codes, token state, and provider data in the cache. Without Redis, an authorization code issued by one instance cannot be redeemed by another — and even with sticky sessions, the token endpoint request may arrive from the application server rather than the user’s browser, bypassing session affinity.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SAML Provider:`}),` Redis cache is `,_jsx(_components.strong,{children:`recommended`}),`. The SAML Provider caches SAML request data (AuthnRequest and LogoutRequest form parameters) so that after a user authenticates upstream, any Orchestrator instance can restore the original request context and generate the SAML response. Without Redis, if the authentication callback arrives at a different instance than the one that received the original AuthnRequest, the SAML response flow will fail because the request data is only in local memory.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`HTTP Proxy:`}),` Redis cache is `,_jsx(_components.strong,{children:`not needed`}),`. Each instance manages its own connector tokens independently.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`LDAP Provider:`}),` A shared cache is `,_jsx(_components.strong,{children:`not typically needed`}),` for standalone LDAP Provider deployments — the LDAP Provider uses per-connection bind state. However, in `,_jsx(_components.strong,{children:`facade (sandwich) deployments`}),` where HTTP Proxy and LDAP Provider run as separate Orchestrator instances, a shared cache `,_jsx(_components.strong,{children:`is required`}),` so that one-time credentials generated by the proxy can be validated by the LDAP Provider. When both modes run on a single Orchestrator, the local cache is sufficient. See `,_jsx(_components.a,{href:`/reference/modes/ldap-provider#pairing-with-http-proxy`,children:`LDAP Provider — Pairing with HTTP Proxy`}),` and the `,_jsx(_components.a,{href:`/reference/orchestrator/caches`,children:`Caches reference`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`AI Identity Gateway:`}),` A cache is `,_jsx(_components.strong,{children:`not typically needed`}),`. AI Identity Gateway uses token-based state tied to the upstream OAuth authorization server.`]}),`\n`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Console UI`,id:`console-ui-2`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})}),_jsx(Frame,{caption:`Redis cache configuration in Maverics Console`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=ea8d2ec72a69d5a8c7955d78abba6a30`,alt:`Redis cache settings in Maverics Console showing cache and provider configuration`,\"data-og-width\":`800`,width:`800`,\"data-og-height\":`400`,height:`400`,\"data-path\":`images/placeholder.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=280\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=8915bedc81639825bb64f4b29741511e 280w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=560\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=2391aa0bf01425e8995a1b8684607380 560w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=840\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=134f31ce48f4902f27e417082e7da90c 840w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=c17116c17f12c64573cc737986cbe837 1100w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=f1e0a37a82ab3dbb2b0ba6b0f9cc04ca 1650w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=190ef650fddf11454c2bc9b2482c05b6 2500w`})})]}),_jsxs(Tab,{title:`Configuration`,id:`configuration-2`,children:[_jsx(_components.p,{children:`Define a Redis cache and reference it from your provider configuration:`}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`17`,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:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`caches`}),_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:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"my-redis\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"redis\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` redis`}),_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:` addresses`}),_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:`\"redis.example.com:6379\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\u003cvault.redis-password>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` tls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"redis-tls\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Reference the cache from your provider:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`oidcProvider`}),_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:` cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"my-redis\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ... other oidcProvider config`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`samlProvider`}),_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:` cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"my-redis\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ... other samlProvider config`})}),`\n`]})})}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/reference/orchestrator/caches/redis`,children:`Redis Cache Reference`}),` for all Redis cache fields including encryption and hashing options.`]})]})]})]}),_jsxs(Step,{title:`Configure load balancing`,children:[_jsx(_components.p,{children:`A load balancer distributes incoming requests across your Orchestrator instances. Configure it to use health check-based routing so that traffic only goes to healthy instances, and cookie-based sticky sessions so that each user’s requests reach the same instance.`}),_jsx(_components.p,{children:`Key load balancer configuration:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Health check endpoint`}),` — Point the load balancer’s health check at the Orchestrator’s `,_jsx(_components.code,{children:`/status`}),` endpoint. Remove instances from the pool when they return an unhealthy status.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sticky sessions`}),` — Configure cookie-based session affinity using the `,_jsx(_components.code,{children:`maverics_session`}),` cookie (or your custom `,_jsx(_components.code,{children:`session.cookie.name`}),` value). This ensures each user’s requests consistently reach the same Orchestrator instance.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Connection draining`}),` — When an instance is removed from the pool (during a rolling update or failure), allow existing connections to complete before terminating the instance. This prevents request failures during deployments.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`TLS termination`}),` — Decide whether TLS terminates at the load balancer or at the Orchestrator. Terminating at the load balancer is simpler to manage when running multiple instances.`]}),`\n`]}),_jsxs(_components.p,{children:[`Load balancers are external to the Orchestrator — they are configured in your infrastructure layer, not in `,_jsx(_components.code,{children:`maverics.yaml`}),`. Select your load balancer below for configuration examples:`]}),_jsxs(Tabs,{children:[_jsx(Tab,{title:`NGINX Plus`,id:`nginx-plus`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`24`,language:`nginx`,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:`nginx`,children:_jsxs(_components.code,{language:`nginx`,numberOfLines:`24`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`upstream`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` maverics `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` 10.0.1.10:9443;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` 10.0.1.11:9443;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` 10.0.1.12:9443;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Use the Orchestrator's session cookie for affinity.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # If you customized session.cookie.name, use that value instead.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` sticky `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cookie maverics_session;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` listen `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`443`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ssl;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` server_name `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`app.example.com;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` location`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` / `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` proxy_pass `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`https://maverics;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` proxy_set_header `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Host $`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`host`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` proxy_set_header `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`X-Real-IP $`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`remote_addr`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` location`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` /status `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` proxy_pass `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`https://maverics/status;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})}),_jsxs(Tab,{title:`HAProxy`,id:`haproxy`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`11`,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:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`frontend maverics_fe`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` bind *:443 ssl crt /etc/haproxy/certs/app.pem`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` default_backend maverics_be`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`backend maverics_be`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cookie maverics_session insert indirect nocache`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` server orch1 10.0.1.10:9443 ssl check cookie orch1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` server orch2 10.0.1.11:9443 ssl check cookie orch2`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` server orch3 10.0.1.12:9443 ssl check cookie orch3`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` option httpchk GET /status`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`HAProxy’s `,_jsx(_components.code,{children:`cookie`}),` directive in the backend inserts a cookie to track which server handles each session. The `,_jsx(_components.code,{children:`insert indirect nocache`}),` options tell HAProxy to manage the affinity cookie transparently.`]})]}),_jsxs(Tab,{title:`AWS ALB`,id:`aws-alb`,children:[_jsx(_components.p,{children:`Enable application cookie-based stickiness on the ALB target group:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`7`,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:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`aws`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` elbv2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` modify-target-group-attributes`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --target-group-arn`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` arn:aws:elasticloadbalancing:REGION:ACCOUNT:targetgroup/maverics/XXXXX`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --attributes`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Key=stickiness.enabled,Value=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Key=stickiness.type,Value=app_cookie`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Key=stickiness.app_cookie.cookie_name,Value=maverics_session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Key=stickiness.app_cookie.duration_seconds,Value=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`86400`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`In the AWS Console: navigate to `,_jsx(_components.strong,{children:`EC2 > Target Groups > your target group > Attributes > Stickiness`}),`, enable stickiness, select `,_jsx(_components.strong,{children:`Application-based cookie`}),`, and set the cookie name to `,_jsx(_components.code,{children:`maverics_session`}),`.`]})]}),_jsx(Tab,{title:`F5 BIG-IP`,id:`f5-big-ip`,children:_jsxs(_components.p,{children:[`Use an iRule or a persistence profile with cookie-based persistence targeting the `,_jsx(_components.code,{children:`maverics_session`}),` cookie. Consult your load balancer’s documentation for cookie-based affinity configuration.`]})}),_jsx(Tab,{title:`Azure Application Gateway`,id:`azure-application-gateway`,children:_jsx(_components.p,{children:`Enable cookie-based affinity on the backend settings. Azure Application Gateway uses its own affinity cookie by default, but can be configured for application-managed affinity. Consult the Azure documentation for cookie-based affinity configuration.`})}),_jsx(Tab,{title:`GCP Load Balancer`,id:`gcp-load-balancer`,children:_jsxs(_components.p,{children:[`Use a backend service with `,_jsx(_components.code,{children:`GENERATED_COOKIE`}),` or `,_jsx(_components.code,{children:`HTTP_COOKIE`}),` session affinity and specify the `,_jsx(_components.code,{children:`maverics_session`}),` cookie name. Consult the GCP documentation for cookie-based affinity configuration.`]})}),_jsx(Tab,{title:`Traefik`,id:`traefik`,children:_jsxs(_components.p,{children:[`Use the sticky sessions configuration in the load balancer service definition with a cookie name of `,_jsx(_components.code,{children:`maverics_session`}),`. Consult the Traefik documentation for sticky session configuration.`]})})]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Always use `,_jsx(_components.strong,{children:`cookie-based affinity`}),` rather than IP-based affinity. Cookie-based affinity works correctly when users share IPs (corporate NAT) or change networks mid-session (mobile devices). Each user’s requests will consistently reach the same Orchestrator instance based on their session cookie.`]})})]}),_jsxs(Step,{title:`Verify high availability`,children:[_jsx(_components.p,{children:`With multiple instances behind a load balancer and sticky sessions configured, verify that your deployment is truly highly available by testing failover.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`5`,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:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Verify all instances are healthy via the load balancer`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://your-load-balancer:9443/status`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` jq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Authenticate through the load balancer and verify your session works`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Make several requests to confirm sticky sessions are routing correctly`})}),`\n`]})})}),_jsx(_components.p,{children:`Test a failover scenario:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Authenticate through the load balancer`}),` — Establish a session`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Stop one Orchestrator instance`}),` — Simulate a failure`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Make another request`}),` — If the stopped instance was handling your session, the load balancer routes you to a healthy instance. The Orchestrator redirects you to your upstream IdP, which recognizes your existing IdP session and completes authentication silently — you experience a brief redirect but are not prompted to log in again.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Restart the stopped instance`}),` — It should rejoin the pool automatically once the health check passes`]}),`\n`]}),_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success!`}),` Your Orchestrator deployment is horizontally scaled with high\navailability. Each instance stores sessions locally, the load balancer uses\ncookie-based sticky sessions to route users consistently, and failover\ntriggers transparent re-authentication via the upstream IdP.`]})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Sessions lost when requests hit a different instance`,id:`sessions-lost-when-requests-hit-a-different-instance`,children:[_jsx(_components.p,{children:`If users are being asked to re-authenticate unexpectedly, sticky sessions\nmay be misconfigured:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Verify the load balancer has cookie-based session affinity configured on the session cookie (`,_jsx(_components.code,{children:`maverics_session`}),` by default, or your custom `,_jsx(_components.code,{children:`session.cookie.name`}),` value).`]}),`\n`,_jsxs(_components.li,{children:[`Verify all instances use `,_jsx(_components.code,{children:`store.type: \"local\"`}),`.`]}),`\n`,_jsx(_components.li,{children:`Check load balancer logs to confirm requests from the same user consistently reach the same instance.`}),`\n`,_jsx(_components.li,{children:`If using IP-based affinity instead of cookie-based, switch to cookie-based affinity. IP-based affinity breaks when multiple users share the same IP (corporate NAT) or when a user’s IP changes mid-session.`}),`\n`]})]}),_jsxs(Accordion,{title:`Instance not joining the load balancer pool`,id:`instance-not-joining-the-load-balancer-pool`,children:[_jsx(_components.p,{children:`If a new or restarted Orchestrator instance is not receiving traffic, check\nthat:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The instance’s health endpoint is returning a healthy status`}),`\n`,_jsx(_components.li,{children:`The load balancer’s health check is configured to poll the correct port and\npath`}),`\n`,_jsx(_components.li,{children:`The health check interval and threshold are set appropriately — some load\nbalancers require multiple consecutive healthy responses before adding an\ninstance to the pool`}),`\n`,_jsx(_components.li,{children:`Network rules allow the load balancer to reach the instance on both the\napplication port and the health check port`}),`\n`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related Pages`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Operations Overview`,icon:`compass`,href:`/guides/operations/overview`,children:_jsx(_components.p,{children:`Back to the Operations guides hub`})}),_jsx(Card,{title:`Scale the AI Identity Gateway`,icon:`microchip-ai`,href:`/guides/ai-identity/scale-for-production`,children:_jsx(_components.p,{children:`Scale the two-tier AI Identity Gateway architecture with MCP-specific load balancing and token exchange tuning`})}),_jsx(Card,{title:`Deploy to Production`,icon:`rocket`,href:`/guides/operations/deploy`,children:_jsx(_components.p,{children:`Set up your production deployment before scaling horizontally`})}),_jsx(Card,{title:`Sessions`,icon:`database`,href:`/reference/orchestrator/sessions`,children:_jsx(_components.p,{children:`Session store types and session configuration`})}),_jsx(Card,{title:`Redis Cache`,icon:`database`,href:`/reference/orchestrator/caches/redis`,children:_jsx(_components.p,{children:`Redis cache configuration for connector tokens and provider data`})})]})]})}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":{"config":{},"pageMetadata":{"title":"Scale for Production","icon":"arrows-up-down","description":null,"href":"/guides/operations/scale"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Scale Your Deployment","slug":"scale-your-deployment","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Related Pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/strataidentity/f5eb628399810ff7/status.js","/_mintlify/custom/strataidentity/b8e24dc33885ac0a/cookiebot.js"],"subdomain":"strataidentity","siteName":"Maverics Documentation","title":"Scale for Production - Maverics Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T20:34:57.087Z","originalFileLocation":"guides/operations/scale.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=\"dark\"}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=\"application-name\" content=\"Maverics Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_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/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Scale for Production - Maverics Documentation\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Maverics Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.strata.io/guides/operations/scale\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://strataidentity.mintlify.app/_mintlify/api/og/v2?division=Operations\u0026amp;title=Scale+for+Production\u0026amp;theme=fe1a0fe3316b752af9e31a17\u0026amp;signature=b4d757a2d04ee70bc6882905fea2148dadcf0131abd7a886506487383b5a3577\">\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=\"Scale for Production - Maverics Documentation\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://strataidentity.mintlify.app/_mintlify/api/og/v2?division=Operations\u0026amp;title=Scale+for+Production\u0026amp;theme=fe1a0fe3316b752af9e31a17\u0026amp;signature=b4d757a2d04ee70bc6882905fea2148dadcf0131abd7a886506487383b5a3577\">\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/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Maverics Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1DA1DC\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.strata.io/guides/operations/scale\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/operations/scale.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.strata.io/#organization\",\"name\":\"Maverics Documentation\",\"url\":\"https://docs.strata.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/light.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=f75039b8474c2403c381ef74fdbee428\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.strata.io#website\",\"name\":\"Maverics Documentation\",\"url\":\"https://docs.strata.io\",\"publisher\":{\"@id\":\"https://docs.strata.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.strata.io/guides/operations/scale#webpage\",\"url\":\"https://docs.strata.io/guides/operations/scale\",\"name\":\"Scale for Production\",\"dateModified\":\"2026-09-30T20:34:57.087Z\",\"isPartOf\":{\"@id\":\"https://docs.strata.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.strata.io/guides/operations/scale#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.strata.io/guides/operations/scale#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Operations\",\"item\":\"https://docs.strata.io/guides/operations/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scale for Production\",\"item\":\"https://docs.strata.io/guides/operations/scale\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.strata.io/guides/operations/scale#article\",\"headline\":\"Scale for Production\",\"name\":\"Scale for Production\",\"url\":\"https://docs.strata.io/guides/operations/scale\",\"mainEntityOfPage\":{\"@id\":\"https://docs.strata.io/guides/operations/scale#webpage\"},\"dateModified\":\"2026-09-30T20:34:57.087Z\",\"publisher\":{\"@id\":\"https://docs.strata.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.strata.io#website\"}}]}\u003c/script>","siteName":"Maverics Documentation","nav":{"global":null,"tabs":[{"tab":"Introduction","pages":[{"title":"Introduction","href":"/introduction/overview"}]},{"tab":"Guides","groups":[{"group":"Getting Started","icon":"rocket","pages":[{"title":"Overview","icon":"compass","href":"/guides/getting-started/overview"},{"title":"Quick Start","icon":"bolt","href":"/guides/getting-started/quick-start"},{"title":"Protect Your First Application","icon":"shield-halved","href":"/guides/getting-started/first-application"}]},{"group":"Authentication","icon":"key","pages":[{"title":"Overview","icon":"compass","href":"/guides/authentication/overview"},{"title":"How Authentication Works","sidebarTitle":"How Auth Works","icon":"diagram-project","href":"/guides/authentication/how-auth-works"},{"title":"Choosing an Orchestrator Mode","sidebarTitle":"Choosing a Mode","icon":"compass-drafting","href":"/guides/authentication/choosing-a-mode"},{"title":"SSO with OIDC","icon":"key","href":"/guides/authentication/sso-with-oidc"},{"title":"Federate SAML Apps","sidebarTitle":"Federate SAML Apps","icon":"shield-halved","href":"/guides/authentication/saml-federation"},{"title":"Add SSO to Web Apps","sidebarTitle":"Add SSO to Web Apps","icon":"server","href":"/guides/authentication/http-proxy-auth"},{"title":"Modernize LDAP Authentication","sidebarTitle":"Modernize LDAP Auth","icon":"folder-tree","href":"/guides/authentication/ldap-provider"},{"title":"Single Logout (SLO)","sidebarTitle":"Single Logout","icon":"right-from-bracket","href":"/guides/authentication/single-logout"},{"title":"Migrate Between Identity Providers","sidebarTitle":"IdP Migration","icon":"right-left","href":"/guides/authentication/idp-migration"}]},{"group":"AI Identity","icon":"microchip-ai","pages":[{"title":"Overview","icon":"compass","href":"/guides/ai-identity/overview"},{"title":"Expose APIs to Agents","icon":"bridge","href":"/guides/ai-identity/mcp-bridge"},{"title":"Protect MCP Servers","icon":"shield-halved","href":"/guides/ai-identity/mcp-proxy"},{"title":"OWASP MCP Top 10","icon":"shield-check","href":"/guides/ai-identity/owasp-mcp-top-10"},{"group":"Connect an AI Client","icon":"plug","expanded":true,"pages":[{"title":"Connect Claude to the AI Identity Gateway","sidebarTitle":"Claude","icon":"message-bot","href":"/guides/ai-identity/connect/claude"},{"title":"Connect ChatGPT to the AI Identity Gateway","sidebarTitle":"ChatGPT","icon":"message-bot","href":"/guides/ai-identity/connect/chatgpt"}]},{"title":"Scale the AI Identity Gateway for Production","icon":"arrows-up-down","href":"/guides/ai-identity/scale-for-production"}]},{"group":"Identity Continuity","icon":"arrows-rotate","pages":[{"title":"Overview","icon":"compass","href":"/guides/identity-continuity/overview"},{"title":"Reducing Single Points of Failure","icon":"shield-check","href":"/guides/identity-continuity/reducing-spofs"}]},{"group":"Operations","icon":"wrench","pages":[{"title":"Overview","icon":"compass","href":"/guides/operations/overview"},{"title":"Deploy to Production","icon":"rocket","href":"/guides/operations/deploy"},{"title":"Monitor and Observe","icon":"chart-line","description":null,"href":"/guides/operations/monitor"},{"title":"Scale for Production","icon":"arrows-up-down","href":"/guides/operations/scale"},{"title":"Troubleshoot Common Issues","icon":"wrench","description":null,"href":"/guides/operations/troubleshoot"}]},{"group":"Security","icon":"shield-halved","pages":[{"title":"Overview","icon":"compass","href":"/guides/security/overview"},{"title":"Configure TLS","icon":"lock","href":"/guides/security/tls"},{"title":"Manage Secrets","icon":"vault","href":"/guides/security/secrets-management"},{"title":"Configure Authorization Policies","sidebarTitle":"Authorization Policies","icon":"shield-check","href":"/guides/security/policies"},{"title":"Compliance and Audit","icon":"clipboard-check","href":"/guides/security/compliance"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/console/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Scale for Production - Maverics Documentation","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}