[{"data":1,"prerenderedAt":1044},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fcapabilities\u002Fscheduling":3,"docs-nav":823},{"id":4,"title":5,"body":6,"description":16,"extension":815,"meta":816,"navigation":818,"path":819,"seo":820,"stem":821,"__hash__":822},"docs\u002Fdocs\u002Fcapabilities\u002Fscheduling.md","Scheduling",{"type":7,"value":8,"toc":796},"minimark",[9,13,17,22,115,119,208,215,231,238,251,254,261,265,270,277,370,381,385,388,440,444,447,479,482,486,516,520,542,546,566,570,586,636,642,649,657,660,664,710,729,733,765,769],[10,11,5],"h1",{"id":12},"scheduling",[14,15,16],"p",{},"A schedule runs a flow, a datasource import, a script or a flow group by itself, at the\ntimes a cron expression gives, with the rights of the person who set it. It is how a\nreport stays current without anyone pressing a button, and how an administrator can\nstill tell, months later, who is answerable for each job that runs at night.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,36],"table",{},[26,27,28],"thead",{},[29,30,31,34],"tr",{},[32,33],"th",{},[32,35],{},[37,38,39,48,60,72,80,88,107],"tbody",{},[29,40,41,45],{},[42,43,44],"td",{},"What can be scheduled",[42,46,47],{},"flows, datasources read from a connection (database, S3, SFTP, API, SharePoint), saved Python or R scripts, SQL scripts that write a datasource, flow groups",[29,49,50,53],{},[42,51,52],{},"How",[42,54,55,56],{},"a 5-field cron expression: ",[57,58,59],"code",{},"minute hour day-of-month month day-of-week",[29,61,62,65],{},[42,63,64],{},"Time zone",[42,66,67,68,71],{},"one for the whole installation: ",[57,69,70],{},"APP__TIMEZONE",", or Administration → Settings → «Time zone of the schedules»",[29,73,74,77],{},[42,75,76],{},"Rights",[42,78,79],{},"those of whoever set the schedule, checked again every time it fires",[29,81,82,85],{},[42,83,84],{},"Precision",[42,86,87],{},"the scheduler looks every 60 seconds: a job starts within a minute of its time",[29,89,90,93],{},[42,91,92],{},"Who runs it",[42,94,95,96,99,100,103,104],{},"the gateway processes with ",[57,97,98],{},"APP__ROLE"," ",[57,101,102],{},"all"," or ",[57,105,106],{},"orchestrator",[29,108,109,112],{},[42,110,111],{},"Permission to set one",[42,113,114],{},"RUN on the object's folder (plus CONNECT on the connection, for an import)",[18,116,118],{"id":117},"where-to-set-one","Where to set one",[23,120,121,134],{},[26,122,123],{},[29,124,125,128,131],{},[32,126,127],{},"Object",[32,129,130],{},"Where",[32,132,133],{},"Button",[37,135,136,151,165,178,196],{},[29,137,138,141,148],{},[42,139,140],{},"Flow",[42,142,143,147],{},[144,145,146],"strong",{},"Flows"," tab, the calendar icon on the flow's row",[42,149,150],{},"«Schedule run»",[29,152,153,156,162],{},[42,154,155],{},"Datasource",[42,157,158,161],{},[144,159,160],{},"Datasources"," tab, the datasource's row",[42,163,164],{},"«Schedule automatic refresh (cron)»",[29,166,167,170,173],{},[42,168,169],{},"Saved script",[42,171,172],{},"the script's page",[42,174,175],{},[144,176,177],{},"Schedule",[29,179,180,183,192],{},[42,181,182],{},"SQL script",[42,184,185,186,191],{},"the script's page, once it writes a datasource (",[187,188,190],"a",{"href":189},"\u002Fdocs\u002Fsql-scripts#on-a-schedule","SQL scripts",")",[42,193,194],{},[144,195,177],{},[29,197,198,201,204],{},[42,199,200],{},"Flow group",[42,202,203],{},"the group's page",[42,205,206],{},[144,207,177],{},[14,209,210,211,214],{},"Each opens the same dialog: the cron expression, its meaning in words as you type\n(«At 06:30, Monday through Friday»), four presets («Every 15 min», «Every hour»,\n«Every night (03:00)», «Every Monday (06:00)») and the time zone the times are read in.\n",[144,212,213],{},"Disable"," removes the schedule. For a flow the dialog also has:",[216,217,218,225],"ul",{},[219,220,221,224],"li",{},[144,222,223],{},"Engine for scheduled runs",": the production engine; «same as development» by\ndefault. Flow groups run their flows on it too.",[219,226,227,230],{},[144,228,229],{},"Tell me if it fails",": addresses and an SMTP connection. An email goes out when a\nscheduled run fails after one that succeeded, once for as long as the flow stays\nbroken; runs started by hand never send it.",[14,232,233],{},[234,235],"img",{"alt":236,"src":237},"The schedule dialog of the flow Top 20 Products by Revenue: cron 30 5 * * *, At 05:30, the presets, the engine for scheduled runs and the failure notice to data-team@example.com","\u002Fmedia\u002Fguide\u002Fscheduling\u002Fschedule-dialog.png",[14,239,240],{},[241,242,243,244,247,248,250],"em",{},"The dialog of a flow, as in step 2 of the example below: cron ",[57,245,246],{},"30 5 * * *",", the production engine, and ",[144,249,229],{}," with an address and an SMTP connection.",[14,252,253],{},"A flow can be scheduled only when it has something to run (an Output, a refresh or a\nrun-flow node), a flow group when it has at least one cell, a saved script when it has\ncode, a SQL script when its author could write its datasource now.",[14,255,256,257,260],{},"The next run shows next to the object: «next run …» in the Flows tab, «· next …» in\nthe Datasources tab, ",[144,258,259],{},"Next run"," in a group's run bar. Times on screen are in your\nbrowser's time zone.",[18,262,264],{"id":263},"how-it-works","How it works",[266,267,269],"h3",{"id":268},"cron-and-time-zone","Cron and time zone",[14,271,272,273,276],{},"The expression has five fields, read in the installation's time zone, daylight saving\nincluded: ",[57,274,275],{},"0 3 * * *"," fires at 03:00 local wall time all year, not at 03:00 UTC.\nSchedules are stored in UTC. Changing the time zone in Administration → Settings\nrecomputes the next run of every schedule.",[23,278,279,289],{},[26,280,281],{},[29,282,283,286],{},[32,284,285],{},"Expression",[32,287,288],{},"Runs",[37,290,291,301,311,320,330,340,350,360],{},[29,292,293,298],{},[42,294,295],{},[57,296,297],{},"*\u002F15 * * * *",[42,299,300],{},"every 15 minutes",[29,302,303,308],{},[42,304,305],{},[57,306,307],{},"0 * * * *",[42,309,310],{},"at the start of every hour",[29,312,313,317],{},[42,314,315],{},[57,316,275],{},[42,318,319],{},"every night at 03:00",[29,321,322,327],{},[42,323,324],{},[57,325,326],{},"30 6 * * 1-5",[42,328,329],{},"Monday to Friday at 06:30",[29,331,332,337],{},[42,333,334],{},[57,335,336],{},"0 7 * * 1",[42,338,339],{},"every Monday at 07:00",[29,341,342,347],{},[42,343,344],{},[57,345,346],{},"0 6 1 * *",[42,348,349],{},"on the first day of every month at 06:00",[29,351,352,357],{},[42,353,354],{},[57,355,356],{},"0 8-18\u002F2 * * 1-5",[42,358,359],{},"every two hours from 08:00 to 18:00, on weekdays",[29,361,362,367],{},[42,363,364],{},[57,365,366],{},"0 0 1 1,4,7,10 *",[42,368,369],{},"at midnight on the first day of each quarter",[14,371,372,373,376,377,380],{},"When both day-of-month and day-of-week are set, the job runs on either (standard cron\nbehaviour): ",[57,374,375],{},"0 6 1 * 1"," runs on the 1st ",[144,378,379],{},"and"," on every Monday.",[266,382,384],{"id":383},"whose-rights","Whose rights",[14,386,387],{},"A schedule remembers who set it. Every run it starts uses that person's rights, not\nthose of the person who last edited the object, and they are checked again each time:",[23,389,390,399],{},[26,391,392],{},[29,393,394,396],{},[32,395,127],{},[32,397,398],{},"Checked when it fires",[37,400,401,408,415,426,433],{},[29,402,403,405],{},[42,404,155],{},[42,406,407],{},"RUN on its folder, CONNECT on its connection",[29,409,410,412],{},[42,411,140],{},[42,413,414],{},"everything the run will need: RUN on the flow's folder and on every flow it runs, read access to every source and file, RUN and CONNECT for every refresh, CONNECT for the connections it writes to, EDIT where it publishes, the use of its scripting environments and registries",[29,416,417,419],{},[42,418,200],{},[42,420,421,422,191],{},"RUN on its folder, then the same for every cell (",[187,423,425],{"href":424},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups#with-whose-rights","flow groups",[29,427,428,430],{},[42,429,169],{},[42,431,432],{},"to see it and use its environment, RUN on its folder; when the run starts, read access to its inputs and EDIT where it publishes",[29,434,435,437],{},[42,436,182],{},[42,438,439],{},"to see it, RUN on its folder; then what a write needs: the datasources it names, EDIT on the datasource's folder, CONNECT on its connection",[266,441,443],{"id":442},"what-switches-a-schedule-off","What switches a schedule off",[14,445,446],{},"A schedule switches itself off, and the audit log records why, when:",[216,448,449,455,461,467,473],{},[219,450,451,454],{},[144,452,453],{},"the author is gone",": deactivated or deleted. The schedule turns off at its next slot;",[219,456,457,460],{},[144,458,459],{},"the author lost the basic right",": RUN on the folder (and, for a datasource, CONNECT\non its connection; for a script, the use of its environment);",[219,462,463,466],{},[144,464,465],{},"someone else widened it",": an edit by another person that makes the object read or\nwrite more than the author chose (a new datasource, file, connection, publish folder,\nother code or another image for a flow; a new cell or a changed Container or Pushmail\ncell for a group; other SQL, another connection or another target folder for a SQL\nscript). Changes that only remove things, and the author's own changes, keep it;",[219,468,469,472],{},[144,470,471],{},"someone else moved it"," to another folder;",[219,474,475,478],{},[144,476,477],{},"a script it runs changed",": when a saved script or a SQL script is widened by\nsomeone else, the schedules of the flows and groups that run it, set by others, turn\noff too.",[14,480,481],{},"When the author keeps the basic right but lacks something deeper (for a flow, read\naccess to one source; for a group, CONNECT on one refresh's connection), the schedule\nstays on, and each slot records a failed run that says what is missing: «Scheduled\nrun not started: the schedule runs with the rights of … who no longer has …». Restore\nthe right, or set the schedule again as someone who has it.",[266,483,485],{"id":484},"from-the-slot-to-the-run","From the slot to the run",[216,487,488,498,504,510],{},[219,489,490,493,494,497],{},[144,491,492],{},"Flows, flow groups, saved scripts"," are queued in the database and picked up by an\norchestrator process, which follows each step to its end. A run still queued after\n",[57,495,496],{},"ORCHESTRATOR__QUEUE_TIMEOUT_SECONDS"," (900 by default) is closed as failed.",[219,499,500,503],{},[144,501,502],{},"Datasource imports and SQL script writes"," go straight to the engine's workers.",[219,505,506,509],{},[144,507,508],{},"One at a time."," When the object is still running at its next slot, that slot is\nskipped; the log says so.",[219,511,512,515],{},[144,513,514],{},"Missed slots."," If no orchestrator was running at the time of a slot, the job runs\nonce when one is back, and the following slot is computed from then: missed slots\nare not run one after the other.",[266,517,519],{"id":518},"several-gateways","Several gateways",[14,521,522,523,526,527,529,530,532,533,103,535,537,538,541],{},"The gateway can run as several processes: ",[57,524,525],{},"APP__ROLE=api"," only answers requests,\n",[57,528,106],{}," only does the background work (schedules, flow runs, clean-up), ",[57,531,102],{},"\ndoes both. Every process with ",[57,534,102],{},[57,536,106],{}," runs the scheduler. They share\nthe work through the database: each due slot is taken by exactly one process, with a\nconditional update, before the job is launched. If that process dies between taking\nthe slot and launching, the slot is lost (one run fewer), never run twice. The\nmachines' clocks must agree within ",[57,539,540],{},"ORCHESTRATOR__DEAD_AFTER_SECONDS",".",[266,543,545],{"id":544},"seeing-the-load","Seeing the load",[14,547,548,549,551,552,555,556,559,560,563,564,541],{},"The ",[144,550,146],{}," tab shows the ",[144,553,554],{},"Schedule load",": a day-by-hour heat map of the flows and\ndatasource imports scheduled over the next days, with the minutes where more jobs start\ntogether than the workers can carry (",[57,557,558],{},"SCHEDULING__WORKER_CAPACITY","). Spread the crowded\nones by a few minutes: ",[57,561,562],{},"5 3 * * *"," instead of ",[57,565,275],{},[18,567,569],{"id":568},"example-a-nightly-chain-with-the-sample-data","Example: a nightly chain with the sample data",[14,571,572,573,576,577,579,580,582,583,585],{},"The sample ",[57,574,575],{},"Sample \u002F Flows"," folder already has three scheduled flows (",[57,578,346],{},",\n",[57,581,246],{},", ",[57,584,336],{},"). To keep their sources current:",[587,588,589,612,630],"ol",{},[219,590,591,593,594,597,598,601,602,605,606,609,610,541],{},[144,592,160],{},", row ",[57,595,596],{},"orders"," → «Schedule automatic refresh (cron)» → ",[57,599,600],{},"0 5 * * *","\n→ ",[144,603,604],{},"Save",". Do the same for ",[57,607,608],{},"order_rows"," at ",[57,611,600],{},[219,613,614,616,617,619,620,623,624,627,628,541],{},[144,615,146],{},", row «Top 20 Products by Revenue»: it is already scheduled at\n",[57,618,246],{},", half an hour after the imports. Open the dialog, set ",[144,621,622],{},"Tell me if it\nfails"," to ",[57,625,626],{},"data-team@example.com"," with your SMTP connection, ",[144,629,604],{},[219,631,632,633,635],{},"Look at ",[144,634,554],{}," in the Flows tab: 05:00 holds two imports, 05:30 one flow.",[14,637,638],{},[234,639],{"alt":640,"src":641},"Schedule load in the Flows tab: a week by hour, with the busy slots in the early morning and no collisions","\u002Fmedia\u002Fguide\u002Fscheduling\u002Fschedule-load.png",[14,643,644],{},[241,645,646,648],{},[144,647,554],{},": the next seven days hour by hour; the darker the cell, the more runs start in it. Below, whether any minute exceeds the workers' capacity.",[14,650,651,652,656],{},"Two schedules half an hour apart work as long as the imports take less than half an\nhour. When the order matters, put the jobs in a ",[187,653,655],{"href":654},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","flow group"," with one\nschedule: the flow then starts when both imports have succeeded, and does not start\nwhen one has failed.",[14,658,659],{},"If the person who set these schedules leaves the company and their account is\ndeactivated, the imports and the flow stop at their next slot; the audit log shows\neach schedule turned off with the reason. Someone with the rights sets them again.",[18,661,663],{"id":662},"permissions","Permissions",[23,665,666,676],{},[26,667,668],{},[29,669,670,673],{},[32,671,672],{},"To",[32,674,675],{},"You need",[37,677,678,686,694,702],{},[29,679,680,683],{},[42,681,682],{},"set or remove a flow's, a group's or a script's schedule",[42,684,685],{},"RUN on its folder",[29,687,688,691],{},[42,689,690],{},"set or remove a datasource's schedule",[42,692,693],{},"RUN on its folder and CONNECT on its connection",[29,695,696,699],{},[42,697,698],{},"see that something is scheduled, and when it runs next",[42,700,701],{},"VIEW on its folder",[29,703,704,707],{},[42,705,706],{},"change the time zone",[42,708,709],{},"administrator (Administration → Settings)",[14,711,712,713,582,716,582,719,582,722,579,725,728],{},"Every schedule set, changed, removed or switched off is in the audit log\n(",[57,714,715],{},"flow.schedule",[57,717,718],{},"datasource.schedule",[57,720,721],{},"flow_group.schedule",[57,723,724],{},"script.schedule",[57,726,727],{},"sql_script.schedule",").",[18,730,732],{"id":731},"limits-and-good-to-know","Limits and good to know",[216,734,735,738,741,744,747,757],{},[219,736,737],{},"Five fields only, minute precision; the scheduler looks once a minute.",[219,739,740],{},"One time zone for the whole installation; a schedule cannot have its own.",[219,742,743],{},"Saved scripts run on Kubernetes only: on Docker Compose their schedules do not fire.",[219,745,746],{},"Scheduled flow runs use the flow's production engine and read all the data: the\ndevelopment sample of the editor does not apply.",[219,748,749,750,752,753,728],{},"A run that only fails some of its rights does not turn the schedule off: watch the\nfailed runs, or set ",[144,751,229],{}," on the flow, or a webhook\n(",[187,754,756],{"href":755},"\u002Fdocs\u002Fapi#webhooks","API and webhooks",[219,758,759,760,764],{},"To start jobs from another scheduler instead, use the ",[187,761,763],{"href":762},"\u002Fdocs\u002Fapi","API"," with a token.",[18,766,768],{"id":767},"related","Related",[216,770,771,777,782,790],{},[219,772,773,776],{},[187,774,775],{"href":654},"Flow groups",": several jobs in order on one schedule",[219,778,779],{},[187,780,146],{"href":781},"\u002Fdocs\u002Fcapabilities\u002Fflows",[219,783,784,582,786],{},[187,785,190],{"href":189},[187,787,789],{"href":788},"\u002Fdocs\u002Fscripting#running-and-scheduling","Python and R",[219,791,792],{},[187,793,795],{"href":794},"\u002Fdocs\u002Fconfiguration#orchestration-and-scheduling","Configuration: orchestration and scheduling",{"title":797,"searchDepth":798,"depth":799,"links":800},"",2,3,[801,802,803,811,812,813,814],{"id":20,"depth":798,"text":21},{"id":117,"depth":798,"text":118},{"id":263,"depth":798,"text":264,"children":804},[805,806,807,808,809,810],{"id":268,"depth":799,"text":269},{"id":383,"depth":799,"text":384},{"id":442,"depth":799,"text":443},{"id":484,"depth":799,"text":485},{"id":518,"depth":799,"text":519},{"id":544,"depth":799,"text":545},{"id":568,"depth":798,"text":569},{"id":662,"depth":798,"text":663},{"id":731,"depth":798,"text":732},{"id":767,"depth":798,"text":768},"md",{"source":817},"docs\u002Fcapabilities\u002Fscheduling.md",true,"\u002Fdocs\u002Fcapabilities\u002Fscheduling",{"title":5,"description":16},"docs\u002Fcapabilities\u002Fscheduling","eYjoDkUT7TXLTXRzwwSaBR59zpQrKD7-yn5vikep9Fc",[824,843,893,925,957,985,1010,1036],{"title":825,"icon":826,"intro":827,"items":828},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[829,831,834,837,840],{"path":830,"title":825},"\u002Fdocs\u002Fgetting-started",{"path":832,"title":833},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":835,"title":836},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":838,"title":839},"\u002Fdocs\u002Fconcepts","Concepts",{"path":841,"title":842},"\u002Fdocs\u002Foverview","Overview (README)",{"title":844,"icon":845,"intro":846,"items":847},"Capabilities","capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[848,851,853,856,859,862,865,868,870,872,875,878,880,881,884,887,890],{"path":849,"title":850},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":781,"title":852},"Low-code flows",{"path":854,"title":855},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":857,"title":858},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":860,"title":861},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":863,"title":864},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":866,"title":867},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":869,"title":789},"\u002Fdocs\u002Fscripting",{"path":871,"title":190},"\u002Fdocs\u002Fsql-scripts",{"path":873,"title":874},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":876,"title":877},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":654,"title":879},"Flow groups: orchestration",{"path":819,"title":5},{"path":882,"title":883},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":885,"title":886},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":888,"title":889},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":891,"title":892},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":894,"icon":895,"intro":896,"items":897},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[898,901,904,907,910,913,916,919,922],{"path":899,"title":900},"\u002Fdocs\u002Fsources","All sources",{"path":902,"title":903},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":905,"title":906},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":908,"title":909},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":911,"title":912},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":914,"title":915},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":917,"title":918},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":920,"title":921},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":923,"title":924},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":926,"icon":927,"intro":928,"items":929},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[930,933,936,939,942,944,945,947,948,951,954],{"path":931,"title":932},"\u002Fdocs\u002Fconnections","All connections",{"path":934,"title":935},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":937,"title":938},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":940,"title":941},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":911,"title":943},"SFTP servers",{"path":914,"title":915},{"path":917,"title":946},"SharePoint",{"path":920,"title":921},{"path":949,"title":950},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":952,"title":953},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":955,"title":956},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":958,"icon":959,"intro":960,"items":961},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[962,965,968,970,973,976,979,982],{"path":963,"title":964},"\u002Fdocs\u002Fintegrations","All integrations",{"path":966,"title":967},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":762,"title":969},"API, tokens and webhooks",{"path":971,"title":972},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":974,"title":975},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":977,"title":978},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":980,"title":981},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":983,"title":984},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":986,"icon":987,"intro":988,"items":989},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[990,993,995,998,1001,1004,1007],{"path":991,"title":992},"\u002Fdocs\u002Fgovernance","Overview",{"path":994,"title":663},"\u002Fdocs\u002Fgovernance\u002Fpermissions",{"path":996,"title":997},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":999,"title":1000},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1002,"title":1003},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1005,"title":1006},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1008,"title":1009},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1011,"icon":1012,"intro":1013,"items":1014},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1015,1018,1021,1024,1027,1030,1033],{"path":1016,"title":1017},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1019,"title":1020},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1022,"title":1023},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1025,"title":1026},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1028,"title":1029},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1031,"title":1032},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1034,"title":1035},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1037,"icon":1038,"intro":1039,"items":1040},"Reference","reference","Release process and the remaining reference pages.",[1041],{"path":1042,"title":1043},"\u002Fdocs\u002Frelease-process","Release process",1793656371717]