[{"data":1,"prerenderedAt":645},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fdeployment":189,"\u002Fgetting-started\u002Fdeployment-surround":640},[4,34,60,116,137,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,18,23,28],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":5,"path":16,"stem":17,"icon":6},"\u002Fgetting-started\u002Fgetting-started","1.getting-started\u002F2.getting-started",{"title":19,"path":20,"stem":21,"icon":22},"Choosing a Preset","\u002Fgetting-started\u002Fchoosing-a-preset","1.getting-started\u002F3.choosing-a-preset","i-lucide-git-branch",{"title":24,"path":25,"stem":26,"icon":27},"Deployment","\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F4.deployment","i-lucide-cloud",{"title":29,"path":30,"stem":31,"icon":32},"Background Maintenance","\u002Fgetting-started\u002Fbackground-maintenance","1.getting-started\u002F5.background-maintenance","i-lucide-timer-reset",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Build","i-lucide-wrench","\u002Fbuild","2.build",[40,45,50,55],{"title":41,"path":42,"stem":43,"icon":44},"Routers & Prefixes","\u002Fbuild\u002Frouters-and-prefixes","2.build\u002F1.routers-and-prefixes","i-lucide-route",{"title":46,"path":47,"stem":48,"icon":49},"Configuration","\u002Fbuild\u002Fconfiguration","2.build\u002F2.configuration","i-lucide-settings",{"title":51,"path":52,"stem":53,"icon":54},"Authorization Dependencies","\u002Fbuild\u002Fauthorization-dependencies","2.build\u002F3.authorization-dependencies","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Command Line","\u002Fbuild\u002Fcli","2.build\u002F4.cli","i-lucide-terminal",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":33},"Auth","i-lucide-lock","\u002Fauth","3.auth",[66,71,76,81,86,91,96,101,106,111],{"title":67,"path":68,"stem":69,"icon":70},"OAuth & Social Login","\u002Fauth\u002Foauth-and-social-login","3.auth\u002F1.oauth-and-social-login","i-lucide-log-in",{"title":72,"path":73,"stem":74,"icon":75},"Multi-Frontend Support","\u002Fauth\u002Fmulti-frontend","3.auth\u002F10.multi-frontend","i-lucide-layout-grid",{"title":77,"path":78,"stem":79,"icon":80},"Sessions & Audit","\u002Fauth\u002Fsessions-and-audit","3.auth\u002F2.sessions-and-audit","i-lucide-monitor-smartphone",{"title":82,"path":83,"stem":84,"icon":85},"Passwordless & Messaging","\u002Fauth\u002Fpasswordless-and-messaging","3.auth\u002F3.passwordless-and-messaging","i-lucide-mail",{"title":87,"path":88,"stem":89,"icon":90},"JWT Tokens","\u002Fauth\u002Fjwt-tokens","3.auth\u002F4.jwt-tokens","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"User Management API","\u002Fauth\u002Fuser-management-api","3.auth\u002F5.user-management-api","i-lucide-users",{"title":97,"path":98,"stem":99,"icon":100},"User Invitations","\u002Fauth\u002Fuser-invitations","3.auth\u002F6.user-invitations","i-lucide-send",{"title":102,"path":103,"stem":104,"icon":105},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F7.roles-and-permissions","i-lucide-shield",{"title":107,"path":108,"stem":109,"icon":110},"ABAC","\u002Fauth\u002Fabac","3.auth\u002F8.abac","i-lucide-filter",{"title":112,"path":113,"stem":114,"icon":115},"User Status","\u002Fauth\u002Fuser-status","3.auth\u002F9.user-status","i-lucide-user-cog",{"title":117,"icon":118,"path":119,"stem":120,"children":121,"page":33},"Enterprise","i-lucide-building-2","\u002Fenterprise","4.enterprise",[122,127,132],{"title":123,"path":124,"stem":125,"icon":126},"Core Authorization Concepts","\u002Fenterprise\u002Fcore-authorization-concepts","4.enterprise\u002F1.core-authorization-concepts","i-lucide-network",{"title":128,"path":129,"stem":130,"icon":131},"Entities","\u002Fenterprise\u002Fentities","4.enterprise\u002F2.entities","i-lucide-folder-tree",{"title":133,"path":134,"stem":135,"icon":136},"Entity Memberships","\u002Fenterprise\u002Fentity-memberships","4.enterprise\u002F3.entity-memberships","i-lucide-user-plus",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":33},"Integrations","i-lucide-plug","\u002Fintegrations","5.integrations",[143,148],{"title":144,"path":145,"stem":146,"icon":147},"API Keys","\u002Fintegrations\u002Fapi-keys","5.integrations\u002F1.api-keys","i-lucide-key",{"title":149,"path":150,"stem":151,"icon":152},"OutlabsAuth UI","\u002Fintegrations\u002Foutlabsauth-ui","5.integrations\u002F2.outlabsauth-ui","i-lucide-layout-dashboard",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":33},"Reference","i-lucide-book-marked","\u002Freference","6.reference",[159,164,169,174,179,184],{"title":160,"path":161,"stem":162,"icon":163},"Data Models","\u002Freference\u002Fdata-models","6.reference\u002F1.data-models","i-lucide-database",{"title":165,"path":166,"stem":167,"icon":168},"Activity Tracking","\u002Freference\u002Factivity-tracking","6.reference\u002F2.activity-tracking","i-lucide-activity",{"title":170,"path":171,"stem":172,"icon":173},"Testing","\u002Freference\u002Ftesting","6.reference\u002F3.testing","i-lucide-flask-conical",{"title":175,"path":176,"stem":177,"icon":178},"Observability","\u002Freference\u002Fobservability","6.reference\u002F4.observability","i-lucide-eye",{"title":180,"path":181,"stem":182,"icon":183},"Metrics Reference","\u002Freference\u002Fmetrics-reference","6.reference\u002F5.metrics-reference","i-lucide-chart-bar",{"title":185,"path":186,"stem":187,"icon":188},"Log Events Reference","\u002Freference\u002Flog-events-reference","6.reference\u002F6.log-events-reference","i-lucide-scroll-text",{"id":190,"title":24,"body":191,"description":633,"extension":634,"links":635,"meta":636,"navigation":637,"path":25,"seo":638,"stem":26,"__hash__":639},"docs\u002F1.getting-started\u002F4.deployment.md",{"type":192,"value":193,"toc":627},"minimark",[194,198,203,440,444,525,538,542,548,595,599,623],[195,196,197],"p",{},"Ship OutlabsAuth without fighting the schema or cache topology.",[199,200,202],"h2",{"id":201},"checklist","Checklist",[204,205,207,212,225,229,239,243,258,262,268,378,382,393,397,415,418,427,431],"steps",{"level":206},"3",[208,209,211],"h3",{"id":210},"postgres","Postgres",[195,213,214,215,219,220,224],{},"Use ",[216,217,218],"code",{},"postgresql+asyncpg:\u002F\u002F…",". Prefer a ",[221,222,223],"strong",{},"direct"," URL over a transaction pooler\nfor auth-heavy traffic.",[208,226,228],{"id":227},"secret","Secret",[195,230,231,234,235,238],{},[216,232,233],{},"secret_key"," must be ",[221,236,237],{},"≥ 32 characters"," for HS256.",[208,240,242],{"id":241},"schema","Schema",[195,244,245,246,249,250,253,254,257],{},"Keep auth tables in a dedicated schema (for example ",[216,247,248],{},"outlabs_auth",") via\n",[216,251,252],{},"database_schema="," \u002F ",[216,255,256],{},"OUTLABS_AUTH_SCHEMA",".",[208,259,261],{"id":260},"migrate-once","Migrate once",[195,263,264,267],{},[216,265,266],{},"auto_migrate=False"," in multi-worker runtimes. Run the CLI in prestart:",[269,270,276],"pre",{"className":271,"code":272,"filename":273,"language":274,"meta":275,"style":275},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export DATABASE_URL=postgresql+asyncpg:\u002F\u002F...\nexport OUTLABS_AUTH_SCHEMA=outlabs_auth\n\noutlabs-auth doctor\noutlabs-auth migrate\noutlabs-auth seed-system\noutlabs-auth bootstrap-admin --email admin@example.com --password '…'\n# or: outlabs-auth bootstrap --admin-email … --admin-password …\n","Terminal","bash","",[216,277,278,298,311,318,329,337,345,371],{"__ignoreMap":275},[279,280,283,287,291,295],"span",{"class":281,"line":282},"line",1,[279,284,286],{"class":285},"spNyl","export",[279,288,290],{"class":289},"sTEyZ"," DATABASE_URL",[279,292,294],{"class":293},"sMK4o","=",[279,296,297],{"class":289},"postgresql+asyncpg:\u002F\u002F...\n",[279,299,301,303,306,308],{"class":281,"line":300},2,[279,302,286],{"class":285},[279,304,305],{"class":289}," OUTLABS_AUTH_SCHEMA",[279,307,294],{"class":293},[279,309,310],{"class":289},"outlabs_auth\n",[279,312,314],{"class":281,"line":313},3,[279,315,317],{"emptyLinePlaceholder":316},true,"\n",[279,319,321,325],{"class":281,"line":320},4,[279,322,324],{"class":323},"sBMFI","outlabs-auth",[279,326,328],{"class":327},"sfazB"," doctor\n",[279,330,332,334],{"class":281,"line":331},5,[279,333,324],{"class":323},[279,335,336],{"class":327}," migrate\n",[279,338,340,342],{"class":281,"line":339},6,[279,341,324],{"class":323},[279,343,344],{"class":327}," seed-system\n",[279,346,348,350,353,356,359,362,365,368],{"class":281,"line":347},7,[279,349,324],{"class":323},[279,351,352],{"class":327}," bootstrap-admin",[279,354,355],{"class":327}," --email",[279,357,358],{"class":327}," admin@example.com",[279,360,361],{"class":327}," --password",[279,363,364],{"class":293}," '",[279,366,367],{"class":327},"…",[279,369,370],{"class":293},"'\n",[279,372,374],{"class":281,"line":373},8,[279,375,377],{"class":376},"sHwdD","# or: outlabs-auth bootstrap --admin-email … --admin-password …\n",[208,379,381],{"id":380},"redis-or-memory-cache","Redis (or memory cache)",[195,383,384,385,388,389,392],{},"Use Redis for shared permission cache, counters, rate limits, and token\nblacklist. Use ",[216,386,387],{},"cache_backend=\"memory\""," only on a ",[221,390,391],{},"single"," process.",[208,394,396],{"id":395},"mount-prefix","Mount prefix",[195,398,399,400,403,404,407,408,411,412,257],{},"Keep a stable prefix (",[216,401,402],{},"\u002Fv1",", ",[216,405,406],{},"\u002Fiam",", …) and match OutlabsAuth UI\n",[216,409,410],{},"authApiPrefix"," — see ",[413,414,41],"a",{"href":42},[208,416,175],{"id":417},"observability",[195,419,420,421,424,425,257],{},"Instrument OutlabsAuth in the API process and expose your host ",[216,422,423],{},"\u002Fmetrics"," registry —\n",[413,426,175],{"href":176},[208,428,430],{"id":429},"maintenance-owner","Maintenance owner",[195,432,433,434,437,438,257],{},"Keep ",[216,435,436],{},"background_job_mode=\"disabled\""," in every API replica. Give periodic\ncleanup and sync work one external scheduler\u002Fworker owner — see\n",[413,439,29],{"href":30},[199,441,443],{"id":442},"multi-worker-multi-instance","Multi-worker \u002F multi-instance",[445,446,447,460],"table",{},[448,449,450],"thead",{},[451,452,453,457],"tr",{},[454,455,456],"th",{},"Concern",[454,458,459],{},"Guidance",[461,462,463,472,487,495,506,517],"tbody",{},[451,464,465,469],{},[466,467,468],"td",{},"Migrations",[466,470,471],{},"One-shot prestart \u002F release job — never every uvicorn worker",[451,473,474,477],{},[466,475,476],{},"Permission cache",[466,478,479,482,483,486],{},[216,480,481],{},"redis"," (+ ",[216,484,485],{},"redis_url",") so invalidation is shared",[451,488,489,492],{},[466,490,491],{},"Memory cache",[466,493,494],{},"Only for single-process hosts",[451,496,497,500],{},[466,498,499],{},"Refresh revoke \u002F sessions",[466,501,502,505],{},[216,503,504],{},"store_refresh_tokens=True"," (default)",[451,507,508,511],{},[466,509,510],{},"Immediate access kill",[466,512,513,516],{},[216,514,515],{},"enable_token_blacklist=True"," + Redis",[451,518,519,522],{},[466,520,521],{},"Background maintenance",[466,523,524],{},"Disabled in every API process; one external owner per database\u002Fenvironment",[526,527,528],"caution",{},[195,529,530,531,534,535,537],{},"Do ",[221,532,533],{},"not"," use ",[216,536,387],{}," when multiple workers must see each\nother's permission invalidations immediately.",[199,539,541],{"id":540},"health","Health",[195,543,544,547],{},[216,545,546],{},"outlabs-auth doctor"," is read-only and safe on prod for preflight.",[445,549,550,560],{},[448,551,552],{},[451,553,554,557],{},[454,555,556],{},"Exit code",[454,558,559],{},"Meaning",[461,561,562,572,582],{},[451,563,564,569],{},[466,565,566],{},[216,567,568],{},"0",[466,570,571],{},"Healthy",[451,573,574,579],{},[466,575,576],{},[216,577,578],{},"1",[466,580,581],{},"Check \u002F plan failure",[451,583,584,589],{},[466,585,586],{},[216,587,588],{},"2",[466,590,591,592],{},"Missing ",[216,593,594],{},"DATABASE_URL",[199,596,598],{"id":597},"related","Related",[600,601,602,607,611,615,619],"ul",{},[603,604,605],"li",{},[413,606,46],{"href":47},[603,608,609],{},[413,610,5],{"href":16},[603,612,613],{},[413,614,175],{"href":176},[603,616,617],{},[413,618,29],{"href":30},[603,620,621],{},[413,622,149],{"href":150},[624,625,626],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}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);}",{"title":275,"searchDepth":282,"depth":300,"links":628},[629,630,631,632],{"id":201,"depth":300,"text":202},{"id":442,"depth":300,"text":443},{"id":540,"depth":300,"text":541},{"id":597,"depth":300,"text":598},"Production migrate, Redis, and multi-worker checklist.","md",null,{},{"icon":27},{"title":24,"description":633},"uN6dDP32ninBB_UTDzaolgb7PQ8HiD-OmL_YqYSPI38",[641,643],{"title":19,"path":20,"stem":21,"description":642,"icon":22,"children":-1},"SimpleRBAC vs EnterpriseRBAC in plain language.",{"title":29,"path":30,"stem":31,"description":644,"icon":32,"children":-1},"Run cleanup and sync work safely outside FastAPI processes.",1787472745731]