[{"data":1,"prerenderedAt":8808},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fconfiguration":3,"docs-nav":8605},{"id":4,"title":5,"body":6,"description":8596,"extension":8597,"meta":8598,"navigation":8600,"path":8601,"seo":8602,"stem":8603,"__hash__":8604},"docs\u002Fdocs\u002Fconfiguration.md","Configuration reference",{"type":7,"value":8,"toc":8543},"minimark",[9,13,36,83,88,142,172,189,217,304,309,317,419,422,429,685,687,702,707,717,926,930,937,1163,1167,1172,1492,1496,1514,1987,1991,2135,2139,2158,2594,2599,2612,2615,2619,2641,2730,2734,2773,2777,2788,3070,3074,3099,3235,3239,3253,3443,3447,3456,3561,3565,3645,3649,3661,4071,4075,4096,4592,4596,4611,4850,4854,4863,5160,5164,5171,5214,5217,5233,5237,5244,5252,5311,5315,5416,5420,5423,5429,5590,5594,5600,5755,5759,5772,5778,6115,6119,6122,6223,6227,6234,6387,6391,6406,6807,6811,6825,6975,6979,6982,7093,7097,7100,7166,7170,7177,7278,7282,7289,7411,7415,7421,7669,7673,7679,7719,7723,7726,7767,7770,7781,7918,7922,7928,8070,8072,8084,8204,8207,8210,8491,8495],[10,11,5],"h1",{"id":12},"configuration-reference",[14,15,16,17,27,28,35],"p",{},"Every setting of Tabularia is an environment variable. This page lists all of them: the\nones the gateway and the engine read, the frontend's, and the few that only the Docker\nCompose files and the Helm chart use. It is generated from the code by\n",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002F.github\u002Fscripts\u002Fconfig_reference.py",[22],"nofollow",[24,25,26],"code",{},".github\u002Fscripts\u002Fconfig_reference.py",", and a\ncheck fails when a variable is added, removed or changed without the page following:\nedit the code or ",[18,29,32],{"href":30,"rel":31},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002F.github\u002Fscripts\u002Fconfig_reference.toml",[22],[24,33,34],{},"config_reference.toml",",\nnever this page.",[14,37,38,42,43,46,47,50,51,54,55,58,59,62,63,66,67,70,71,74,75,78,79,82],{},[39,40,41],"strong",{},"Nested names."," The settings are grouped in sections, and a variable names the section\nand the field with a double underscore: ",[24,44,45],{},"STORAGE__BUCKET"," is the ",[24,48,49],{},"bucket"," field of the\n",[24,52,53],{},"storage"," section, ",[24,56,57],{},"CLICKHOUSE_EXTERNAL__S3_ENDPOINT"," the ",[24,60,61],{},"s3_endpoint"," field of\n",[24,64,65],{},"clickhouse_external",". Write them in capitals. Booleans are ",[24,68,69],{},"true"," or ",[24,72,73],{},"false",", lists are\nJSON (",[24,76,77],{},"APP__CORS_ORIGINS=[\"https:\u002F\u002Fapp.example.com\"]","), and a variable left out keeps the\ndefault shown below. Keep comments on their own line: not every tool strips a trailing\n",[24,80,81],{},"# comment"," from a value.",[14,84,85],{},[39,86,87],{},"Where to set them.",[89,90,91,116],"ul",{},[92,93,94,98,99,102,103,110,111,115],"li",{},[95,96,97],"em",{},"Docker Compose",": in ",[24,100,101],{},"infrastructure\u002F.env",", a copy of\n",[18,104,107],{"href":105,"rel":106},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002Finfrastructure\u002F.env.example",[22],[24,108,109],{},"infrastructure\u002F.env.example",". The gateway and\nengine containers read the whole file, so one value reaches every service that needs\nit. Compose is the way to try Tabularia; production runs on Kubernetes with the Helm\nchart (",[18,112,114],{"href":113},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes guide",").",[92,117,118,121,122,125,126,129,130,133,134,137,138,141],{},[95,119,120],{},"Helm",": the ",[39,123,124],{},"Helm value"," column gives the key of ",[24,127,128],{},"values.yaml"," the chart renders the\nvariable from. A variable without one goes in ",[24,131,132],{},"extraEnv",", by its name (it lands in the\nshared ConfigMap; the chart refuses a name it already sets), or, for a secret, in the\nSecret you name in ",[24,135,136],{},"existingSecret",". See ",[18,139,140],{"href":113},"Deploying on Kubernetes",".",[14,143,144,147,148,151,152,155,156,159,160,163,164,167,168,171],{},[39,145,146],{},"Who reads what."," The ",[95,149,150],{},"gateway"," is the control plane (API, sign-in, permissions,\nschedules, flow orchestration), in one process or split into ",[24,153,154],{},"api"," and ",[24,157,158],{},"orchestrator","\ncopies (",[24,161,162],{},"APP__ROLE","). The ",[95,165,166],{},"engine"," is one image with several roles: the internal engine\nAPI, the run and preview workers, and the beat scheduler; they all read the same\nsettings. The ",[95,169,170],{},"frontend"," reads a few public values at startup. A variable only matters to\nthe service it is listed under; giving it to the others is harmless.",[14,173,174,177,178,181,182,185,186,115],{},[39,175,176],{},"Secrets"," are never printed here. ",[95,179,180],{},"required"," means the process refuses to start\nwithout the variable; ",[95,183,184],{},"development value (hidden)"," means a placeholder that works on a\nlaptop and must be replaced before anyone else can reach the installation (the gateway\nrefuses some of them when ",[24,187,188],{},"APP__ENV_NAME=production",[14,190,191,194,195,198,199,203,204,208,209,213,214,141],{},[39,192,193],{},"Not in the environment."," Some things are set in the administration panel instead: the\nengine parameters marked ",[95,196,197],{},"Also adjustable in Administration → Settings"," (the variable is\nthe starting value, see ",[18,200,202],{"href":201},"\u002Fdocs\u002Fengine-settings","engine settings","), the processes per worker\n(Administration → Workers), the AI models people may use, the engines allowed, the\nforwarding of the audit log to a SIEM (",[18,205,207],{"href":206},"\u002Fdocs\u002Fsiem-splunk","Splunk","), webhook receivers and\nservice accounts (",[18,210,212],{"href":211},"\u002Fdocs\u002Fapi","API","), and the banners. Connection credentials (databases,\nSFTP, S3, APIs, SharePoint) belong to each connection, encrypted with\n",[24,215,216],{},"SECURITY__FERNET_KEY",[218,219,220,233],"table",{},[221,222,223],"thead",{},[224,225,226,230],"tr",{},[227,228,229],"th",{},"Read by",[227,231,232],{},"Variables",[234,235,236,248,259,270,281,292],"tbody",{},[224,237,238,245],{},[239,240,241],"td",{},[18,242,244],{"href":243},"#shared-by-the-gateway-and-the-engine","Shared by the gateway and the engine",[239,246,247],{},"7",[224,249,250,256],{},[239,251,252],{},[18,253,255],{"href":254},"#gateway","Gateway",[239,257,258],{},"170",[224,260,261,267],{},[239,262,263],{},[18,264,266],{"href":265},"#engine-and-workers","Engine and workers",[239,268,269],{},"104",[224,271,272,278],{},[239,273,274],{},[18,275,277],{"href":276},"#frontend","Frontend",[239,279,280],{},"5",[224,282,283,289],{},[239,284,285],{},[18,286,288],{"href":287},"#compose-and-helm-only","Compose and Helm only",[239,290,291],{},"13",[224,293,294,299],{},[239,295,296],{},[39,297,298],{},"Total",[239,300,301],{},[39,302,303],{},"299",[305,306,308],"h2",{"id":307},"before-production","Before production",[14,310,311,312,316],{},"The defaults are made for a laptop. Before an installation is reachable by anyone else,\nset at least these (the ",[18,313,315],{"href":314},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","release checklist"," lists what\nchanged between versions):",[89,318,319,329,335,340,350,356,366,376,389,399,407,413],{},[92,320,321,324,325,328],{},[24,322,323],{},"STORAGE__ACCESS_KEY"," — use credentials of your own (",[24,326,327],{},"minioadmin"," is the development MinIO's).",[92,330,331,334],{},[24,332,333],{},"STORAGE__SECRET_KEY"," — use credentials of your own.",[92,336,337,339],{},[24,338,216],{}," — generate a key of your own and keep it with your backups: without it the saved connections cannot be decrypted.",[92,341,342,345,346,349],{},[24,343,344],{},"DB__PASSWORD"," — replace the development password (the gateway refuses it in production unless ",[24,347,348],{},"DB__URL"," is set).",[92,351,352,355],{},[24,353,354],{},"JWT__SECRET"," — generate a secret of at least 32 characters (the gateway refuses the default and shorter ones in production).",[92,357,358,361,362,365],{},[24,359,360],{},"AUTH__ADMIN_PASSWORD"," — set a password of your own before the first start (at least 12 characters; the gateway refuses ",[24,363,364],{},"admin"," and other published passwords).",[92,367,368,371,372,375],{},[24,369,370],{},"APP__ENV_NAME"," — set it to ",[24,373,374],{},"production",", so the gateway refuses the development secrets.",[92,377,378,381,382,384,385,388],{},[24,379,380],{},"SECURITY__KEYS_DIR"," — on Kubernetes leave it empty and set ",[24,383,216],{},"; with Compose, back the ",[24,386,387],{},"keys"," volume up with the database.",[92,390,391,394,395,398],{},[24,392,393],{},"AI__MAX_COST_PER_DAY_USD"," — set it, and ",[24,396,397],{},"AI__MAX_COST_PER_DAY_TOTAL_USD",", wherever people you do not know can sign in (every question is paid with your key).",[92,400,401,404,405,141],{},[24,402,403],{},"AUTH__FIRST_RUN_SETUP"," — leave it off: the administrator comes from ",[24,406,360],{},[92,408,409,412],{},[24,410,411],{},"NOTEBOOKS__ORIGIN"," — with notebooks, set it to a host name of their own next to the interface's, routed to the gateway: without it their apps and editors do not open.",[92,414,415,418],{},[24,416,417],{},"GRAFANA_ADMIN_PASSWORD"," — change it wherever Grafana is reachable by others.",[305,420,244],{"id":421},"shared-by-the-gateway-and-the-engine",[14,423,424,425,428],{},"Read by the gateway and by the engine. Give both the same value: the Compose file and the\nchart do, since every container reads the same ",[24,426,427],{},".env"," or ConfigMap.",[218,430,431,449],{},[221,432,433],{},[224,434,435,438,441,444,446],{},[227,436,437],{},"Variable",[227,439,440],{},"Type",[227,442,443],{},"Default",[227,445,124],{},[227,447,448],{},"Description",[234,450,451,494,528,558,585,612,652],{},[224,452,453,457,460,465,470],{},[239,454,455],{},[24,456,370],{},[239,458,459],{},"string",[239,461,462],{},[24,463,464],{},"development",[239,466,467],{},[24,468,469],{},"app.envName",[239,471,472,475,476,478,479,481,482,484,485,487,488,490,491,493],{},[39,473,474],{},"Production:"," set it to ",[24,477,374],{},", so the gateway refuses the development secrets. ",[24,480,374],{}," turns on the gateway's production guard: it refuses to start with the development secrets (",[24,483,354],{},", ",[24,486,344],{},"), an empty or published ",[24,489,360],{},", or a ",[24,492,354],{}," shorter than 32 characters. The engine accepts it and nothing there depends on it.",[224,495,496,501,511,516,521],{},[239,497,498],{},[24,499,500],{},"APP__CORS_ORIGINS",[239,502,503,504,155,507,510],{},"JSON list of strings; ",[24,505,506],{},"*",[24,508,509],{},"null"," refused",[239,512,513],{},[24,514,515],{},"[\"http:\u002F\u002Flocalhost:3000\", \"http:\u002F\u002F127.0.0.1:3000\"]",[239,517,518],{},[24,519,520],{},"app.corsOrigins",[239,522,523,524,527],{},"Origins allowed to call the API from a browser, with the session cookie. Needed only when the interface is served from another host than the gateway (then set ",[24,525,526],{},"AUTH__COOKIE_DOMAIN"," too). The engine API applies the same list to its own CORS.",[224,529,530,535,537,542,547],{},[239,531,532],{},[24,533,534],{},"STORAGE__ENDPOINT",[239,536,459],{},[239,538,539],{},[24,540,541],{},"http:\u002F\u002Flocalhost:9002",[239,543,544],{},[24,545,546],{},"externalServices.storage.endpoint",[239,548,549,550,553,554,557],{},"URL of the S3-compatible object storage, as the workers reach it (",[24,551,552],{},"http:\u002F\u002Fminio:9000"," in Compose). The gateway reads it only to name the storage in OpenLineage events (",[24,555,556],{},"gs:\u002F\u002F"," for Google Cloud Storage).",[224,559,560,565,568,573,578],{},[239,561,562],{},[24,563,564],{},"CELERY__TASK_TIME_LIMIT",[239,566,567],{},"integer",[239,569,570],{},[24,571,572],{},"3600",[239,574,575],{},[24,576,577],{},"engine.taskTimeLimitSeconds",[239,579,580,581,584],{},"Seconds after which the worker kills a task: the real ceiling on a run, an import or a preview. The gateway reads it too, to derive ",[24,582,583],{},"ENGINE__RUN_STALE_TIMEOUT_SECONDS",". Also adjustable in Administration → Settings.",[224,586,587,591,593,596,601],{},[239,588,589],{},[24,590,216],{},[239,592,459],{},[239,594,595],{},"empty",[239,597,598],{},[24,599,600],{},"secrets.fernetKey",[239,602,603,605,606,608,609,141],{},[39,604,474],{}," generate a key of your own and keep it with your backups: without it the saved connections cannot be decrypted. Encrypts the credentials of database and file connections, at rest in the gateway and on their way to the engine, which decrypts them only inside the worker. The same value everywhere; never change it once a connection is saved. Empty with ",[24,607,380],{}," set (the Compose stack): the key created there at the first start. Empty without it: the services refuse to start. Generate one with ",[24,610,611],{},"openssl rand -base64 32 | tr '+\u002F' '-_'",[224,613,614,618,620,622,626],{},[239,615,616],{},[24,617,380],{},[239,619,459],{},[239,621,595],{},[239,623,624],{},[24,625,132],{},[239,627,628,630,631,384,633,635,636,638,639,642,643,645,646,484,648,651],{},[39,629,474],{}," on Kubernetes leave it empty and set ",[24,632,216],{},[24,634,387],{}," volume up with the database. A directory every service shares on one machine (the Compose stack mounts the ",[24,637,387],{}," volume there): the secrets left empty are created in it at the first start and read afterwards, ",[24,640,641],{},"fernet.key"," for ",[24,644,216],{}," and, with ",[24,647,403],{},[24,649,650],{},"bootstrap.token",", which the sample-data container exchanges for a session once the administrator exists. Back it up with the data. Not for Kubernetes, where the pods share no volume: the chart sets the key.",[224,653,654,659,662,668,672],{},[239,655,656],{},[24,657,658],{},"UPLOAD__MAX_BYTES",[239,660,661],{},"integer, ≥ 0",[239,663,664,667],{},[24,665,666],{},"1073741824"," (1 GiB)",[239,669,670],{},[24,671,132],{},[239,673,674,675,484,678,484,681,684],{},"The largest file a person can upload, in bytes; 0 = no ceiling. The gateway answers 413 before calling the engine when the size is declared, and cuts an undeclared (chunked) body at the ceiling; the engine API refuses it too. The file is spooled on the engine's disk and converted there, so this is also a disk bound: keep the engine's temporary space above it. Imports from SFTP, S3 and APIs have their own caps (",[24,676,677],{},"SFTP__*",[24,679,680],{},"S3_SOURCE__*",[24,682,683],{},"API__*","). Also adjustable in Administration → Settings.",[305,686,255],{"id":150},[14,688,689,690,692,693,695,696,698,699,701],{},"The control plane: in Compose the ",[24,691,150],{}," service; on Kubernetes the ",[24,694,150],{}," (",[24,697,154],{},")\nand ",[24,700,158],{}," workloads.",[703,704,706],"h3",{"id":705},"process-and-http","Process and HTTP",[14,708,709,710,712,713,484,715,141],{},"Read by both services, so listed under ",[18,711,244],{"href":243},": ",[24,714,500],{},[24,716,370],{},[218,718,719,733],{},[221,720,721],{},[224,722,723,725,727,729,731],{},[227,724,437],{},[227,726,440],{},[227,728,443],{},[227,730,124],{},[227,732,448],{},[234,734,735,756,781,802,843,873,900],{},[224,736,737,742,744,749,753],{},[239,738,739],{},[24,740,741],{},"APP__NAME",[239,743,459],{},[239,745,746],{},[24,747,748],{},"Tabularia",[239,750,751],{},[24,752,132],{},[239,754,755],{},"Product name shown by the API. Product identity, not a deployment setting: leave it.",[224,757,758,763,765,770,774],{},[239,759,760],{},[24,761,762],{},"APP__VERSION",[239,764,459],{},[239,766,767],{},[24,768,769],{},"1.3.0",[239,771,772],{},[24,773,132],{},[239,775,776,777,780],{},"The release, shown by ",[24,778,779],{},"\u002Fsystem\u002Finfo"," and in the interface's menu. Set by the code; leave it.",[224,782,783,788,790,795,799],{},[239,784,785],{},[24,786,787],{},"APP__CODENAME",[239,789,459],{},[239,791,792],{},[24,793,794],{},"Catone",[239,796,797],{},[24,798,132],{},[239,800,801],{},"The release's name. Set by the code; leave it.",[224,803,804,808,818,822,831],{},[239,805,806],{},[24,807,162],{},[239,809,810,811,484,814,484,816],{},"one of ",[24,812,813],{},"all",[24,815,154],{},[24,817,158],{},[239,819,820],{},[24,821,813],{},[239,823,824,825,827,828,830],{},"set per workload: ",[24,826,154],{}," for the gateway, ",[24,829,158],{}," for the orchestrator",[239,832,833,834,836,837,839,840,842],{},"What this gateway process does: ",[24,835,813],{}," answers requests and does the background work (schedules, flow executions, clean-up); ",[24,838,154],{}," only answers; ",[24,841,158],{}," only does the background work. Split them to run several copies: they share the work through the database.",[224,844,845,850,856,858,863],{},[239,846,847],{},[24,848,849],{},"APP__ROOT_PATH",[239,851,852,853],{},"string; a path such as ",[24,854,855],{},"\u002Fapi",[239,857,595],{},[239,859,860],{},[24,861,862],{},"ingress.apiPrefix",[239,864,865,866,868,869,872],{},"Path prefix a reverse proxy publishes the gateway under, stripping it before forwarding (",[24,867,855],{}," when one host serves interface and API). It fixes the paths the gateway writes for the browser: the SSO cookie, ",[24,870,871],{},"\u002Fdocs",", redirects. Empty = published at the root.",[224,874,875,880,883,888,893],{},[239,876,877],{},[24,878,879],{},"APP__GATEWAY_THREADS",[239,881,882],{},"integer, ≥ 4",[239,884,885],{},[24,886,887],{},"40",[239,889,890],{},[24,891,892],{},"gateway.threads",[239,894,895,896,899],{},"Threads serving the synchronous routes. More do not serve more (Python runs one at a time); the database pool follows this number. A different name from the engine's ",[24,897,898],{},"APP__ENGINE_API_THREADS"," because both read the same file and want opposite values. Also adjustable in Administration → Settings, applied after a restart of the gateway and orchestrator.",[224,901,902,907,913,918,923],{},[239,903,904],{},[24,905,906],{},"APP__TIMEZONE",[239,908,909,910],{},"string; an IANA name, e.g. ",[24,911,912],{},"Europe\u002FRome",[239,914,915],{},[24,916,917],{},"UTC",[239,919,920],{},[24,921,922],{},"app.timezone",[239,924,925],{},"Time zone in which cron schedules are read (wall-clock time, daylight saving included); they are stored in UTC. Timestamps are still shown in each viewer's own time zone. Also adjustable in Administration → Settings.",[703,927,929],{"id":928},"metadata-database-postgres","Metadata database (Postgres)",[14,931,932,933,141],{},"Users, groups, permissions, flows, connections, runs, schedules and the audit log. The schema is migrated with Alembic: see ",[18,934,936],{"href":935},"\u002Fdocs\u002Fdatabase-migrations","database migrations",[218,938,939,953],{},[221,940,941],{},[224,942,943,945,947,949,951],{},[227,944,437],{},[227,946,440],{},[227,948,443],{},[227,950,124],{},[227,952,448],{},[234,954,955,977,999,1021,1044,1065,1086,1112,1133],{},[224,956,957,962,964,969,974],{},[239,958,959],{},[24,960,961],{},"DB__HOST",[239,963,459],{},[239,965,966],{},[24,967,968],{},"localhost",[239,970,971],{},[24,972,973],{},"externalServices.postgres.host",[239,975,976],{},"Postgres host.",[224,978,979,984,986,991,996],{},[239,980,981],{},[24,982,983],{},"DB__PORT",[239,985,567],{},[239,987,988],{},[24,989,990],{},"5432",[239,992,993],{},[24,994,995],{},"externalServices.postgres.port",[239,997,998],{},"Postgres port.",[224,1000,1001,1006,1008,1013,1018],{},[239,1002,1003],{},[24,1004,1005],{},"DB__USER",[239,1007,459],{},[239,1009,1010],{},[24,1011,1012],{},"tabularia",[239,1014,1015],{},[24,1016,1017],{},"externalServices.postgres.user",[239,1019,1020],{},"Postgres user. The development Compose file also creates the database with it.",[224,1022,1023,1027,1029,1031,1036],{},[239,1024,1025],{},[24,1026,344],{},[239,1028,459],{},[239,1030,184],{},[239,1032,1033],{},[24,1034,1035],{},"secrets.dbPassword",[239,1037,1038,1040,1041,1043],{},[39,1039,474],{}," replace the development password (the gateway refuses it in production unless ",[24,1042,348],{}," is set). Postgres password.",[224,1045,1046,1051,1053,1057,1062],{},[239,1047,1048],{},[24,1049,1050],{},"DB__NAME",[239,1052,459],{},[239,1054,1055],{},[24,1056,1012],{},[239,1058,1059],{},[24,1060,1061],{},"externalServices.postgres.database",[239,1063,1064],{},"Postgres database.",[224,1066,1067,1071,1073,1075,1079],{},[239,1068,1069],{},[24,1070,348],{},[239,1072,459],{},[239,1074,595],{},[239,1076,1077],{},[24,1078,136],{},[239,1080,1081,1082,1085],{},"A full DSN (",[24,1083,1084],{},"postgresql:\u002F\u002Fuser:password@host:5432\u002Fdbname",") for a managed Postgres that does not fit the pieces above; when set it wins over them. It holds the password: treat it as a secret.",[224,1087,1088,1093,1096,1098,1102],{},[239,1089,1090],{},[24,1091,1092],{},"DB__POOL_SIZE",[239,1094,1095],{},"integer, ≥ 1",[239,1097,595],{},[239,1099,1100],{},[24,1101,132],{},[239,1103,1104,1105,1107,1108,1111],{},"Connections kept open to Postgres. Empty = one per thread (",[24,1106,879],{},"), which is what the gateway needs. Pool plus overflow, summed over every gateway process, must stay under Postgres' ",[24,1109,1110],{},"max_connections",". Also adjustable in Administration → Settings, applied after a restart of the gateway and orchestrator.",[224,1113,1114,1119,1121,1126,1130],{},[239,1115,1116],{},[24,1117,1118],{},"DB__MAX_OVERFLOW",[239,1120,661],{},[239,1122,1123],{},[24,1124,1125],{},"10",[239,1127,1128],{},[24,1129,132],{},[239,1131,1132],{},"Extra connections opened at a peak and closed when returned. Also adjustable in Administration → Settings, applied after a restart of the gateway and orchestrator.",[224,1134,1135,1140,1143,1147,1151],{},[239,1136,1137],{},[24,1138,1139],{},"DB__AUTO_MIGRATE",[239,1141,1142],{},"boolean",[239,1144,1145],{},[24,1146,73],{},[239,1148,1149],{},[24,1150,132],{},[239,1152,1153,1155,1156,1158,1159,1162],{},[24,1154,69],{},": the gateway migrates the schema itself at startup (the development Compose file sets it). ",[24,1157,73],{},": migrations are a step of their own (",[24,1160,1161],{},"python -m app.db.migra",", the chart's init container) and the gateway only refuses a database behind its code.",[703,1164,1166],{"id":1165},"sign-in-sessions-and-api-tokens","Sign-in, sessions and API tokens",[14,1168,1169,1170,115],{},"Local sign-in and the session cookie, the first administrator, and the API tokens of scripts and service accounts (",[18,1171,212],{"href":211},[218,1173,1174,1188],{},[221,1175,1176],{},[224,1177,1178,1180,1182,1184,1186],{},[227,1179,437],{},[227,1181,440],{},[227,1183,443],{},[227,1185,124],{},[227,1187,448],{},[234,1189,1190,1214,1235,1257,1279,1311,1333,1361,1394,1416,1445,1469],{},[224,1191,1192,1196,1198,1200,1205],{},[239,1193,1194],{},[24,1195,354],{},[239,1197,459],{},[239,1199,184],{},[239,1201,1202],{},[24,1203,1204],{},"secrets.jwtSecret",[239,1206,1207,1209,1210,1213],{},[39,1208,474],{}," generate a secret of at least 32 characters (the gateway refuses the default and shorter ones in production). Signs every session and API token (HS256). Generate one with ",[24,1211,1212],{},"openssl rand -hex 32","; changing it signs everybody out.",[224,1215,1216,1221,1223,1228,1232],{},[239,1217,1218],{},[24,1219,1220],{},"JWT__ALGORITHM",[239,1222,459],{},[239,1224,1225],{},[24,1226,1227],{},"HS256",[239,1229,1230],{},[24,1231,132],{},[239,1233,1234],{},"Signature algorithm of the session tokens. Leave it.",[224,1236,1237,1242,1244,1249,1254],{},[239,1238,1239],{},[24,1240,1241],{},"JWT__ACCESS_TTL_MINUTES",[239,1243,567],{},[239,1245,1246],{},[24,1247,1248],{},"720",[239,1250,1251],{},[24,1252,1253],{},"auth.jwtAccessTtlMinutes",[239,1255,1256],{},"The longest a session lasts, active or not. Sessions also end at sign-out, from «Your sessions», by an administrator, at a password change or when the account is disabled. Also adjustable in Administration → Settings.",[224,1258,1259,1264,1266,1271,1276],{},[239,1260,1261],{},[24,1262,1263],{},"AUTH__ADMIN_EMAIL",[239,1265,459],{},[239,1267,1268],{},[24,1269,1270],{},"admin@tabularia.local",[239,1272,1273],{},[24,1274,1275],{},"auth.adminEmail",[239,1277,1278],{},"E-mail of the administrator created at the first start. Existing users are never touched.",[224,1280,1281,1285,1287,1289,1294],{},[239,1282,1283],{},[24,1284,360],{},[239,1286,459],{},[239,1288,595],{},[239,1290,1291],{},[24,1292,1293],{},"secrets.adminPassword",[239,1295,1296,1298,1299,1301,1302,1304,1305,1307,1308,1310],{},[39,1297,474],{}," set a password of your own before the first start (at least 12 characters; the gateway refuses ",[24,1300,364],{}," and other published passwords). Password of that administrator, used when it is created. No default: the gateway refuses to create the administrator with a published password (",[24,1303,364],{},", the guides' examples) or one under 12 characters, in every environment. Empty with ",[24,1306,403],{}," (the Compose stack): no administrator at the start, the sign-in page creates it. Empty otherwise: the gateway refuses to start. An administrator still holding ",[24,1309,364],{}," from an older release gets this password at the next start, and its sessions close.",[224,1312,1313,1318,1320,1325,1330],{},[239,1314,1315],{},[24,1316,1317],{},"AUTH__ADMIN_NAME",[239,1319,459],{},[239,1321,1322],{},[24,1323,1324],{},"Administrator",[239,1326,1327],{},[24,1328,1329],{},"auth.adminName",[239,1331,1332],{},"Display name of that administrator.",[224,1334,1335,1340,1342,1346,1350],{},[239,1336,1337],{},[24,1338,1339],{},"AUTH__ALLOW_KNOWN_ADMIN_PASSWORD",[239,1341,1142],{},[239,1343,1344],{},[24,1345,73],{},[239,1347,1348],{},[24,1349,132],{},[239,1351,1352,1353,1355,1356,1358,1359,141],{},"Development only: ",[24,1354,69],{}," lets a local stack whose scripts sign in with a fixed password (",[24,1357,364],{},") create or keep it. Ignored with ",[24,1360,188],{},[224,1362,1363,1367,1369,1373,1377],{},[239,1364,1365],{},[24,1366,403],{},[239,1368,1142],{},[239,1370,1371],{},[24,1372,73],{},[239,1374,1375],{},[24,1376,132],{},[239,1378,1379,1381,1382,1384,1385,1388,1389,1391,1392,141],{},[39,1380,474],{}," leave it off: the administrator comes from ",[24,1383,360],{},". While no account exists, the sign-in page asks for the first administrator (email and password, the same password rule), signs it in, and from then on is the ordinary sign-in. On with ",[24,1386,1387],{},"docker-compose.yml",", which answers on 127.0.0.1 only; ",[24,1390,360],{},", when set, creates the administrator instead. Ignored with ",[24,1393,188],{},[224,1395,1396,1401,1403,1408,1413],{},[239,1397,1398],{},[24,1399,1400],{},"AUTH__SESSION_IDLE_MINUTES",[239,1402,661],{},[239,1404,1405],{},[24,1406,1407],{},"0",[239,1409,1410],{},[24,1411,1412],{},"auth.sessionIdleMinutes",[239,1414,1415],{},"Minutes without activity after which a session closes: the gateway refuses it and the open page signs out by itself after a one-minute warning. 0 = never. Also adjustable in Administration → Settings.",[224,1417,1418,1422,1424,1426,1431],{},[239,1419,1420],{},[24,1421,526],{},[239,1423,459],{},[239,1425,595],{},[239,1427,1428],{},[24,1429,1430],{},"auth.cookieDomain",[239,1432,1433,1434,155,1437,1440,1441,1444],{},"Domain of the session cookie. Empty = the gateway's host, right when interface and API share a host. With the interface on another host of the same domain (",[24,1435,1436],{},"app.example.com",[24,1438,1439],{},"api.example.com",") set the common domain, ",[24,1442,1443],{},"example.com","; two unrelated domains do not work.",[224,1446,1447,1452,1454,1458,1463],{},[239,1448,1449],{},[24,1450,1451],{},"AUTH__PERSONAL_TOKENS",[239,1453,1142],{},[239,1455,1456],{},[24,1457,69],{},[239,1459,1460],{},[24,1461,1462],{},"auth.personalTokens",[239,1464,1465,1466,1468],{},"Whether people may create API tokens for their own scripts, with their own permissions. ",[24,1467,73],{},": only service accounts, created by an administrator, have tokens. Also adjustable in Administration → Settings.",[224,1470,1471,1476,1479,1484,1489],{},[239,1472,1473],{},[24,1474,1475],{},"AUTH__API_TOKEN_MAX_DAYS",[239,1477,1478],{},"integer, 1–3650",[239,1480,1481],{},[24,1482,1483],{},"365",[239,1485,1486],{},[24,1487,1488],{},"auth.apiTokenMaxDays",[239,1490,1491],{},"The furthest expiry of an API token: every token has one. Also adjustable in Administration → Settings.",[703,1493,1495],{"id":1494},"single-sign-on-oidc","Single sign-on (OIDC)",[14,1497,1498,1499,1502,1503,1509,1510,141],{},"Optional: Keycloak, Microsoft Entra ID, Auth0, Okta… Off while ",[24,1500,1501],{},"OIDC__ISSUER"," is empty; when it is set, the gateway configures itself from the issuer's discovery document and refuses to start if the client secret, redirect URI or post-login URL is missing. Runnable example: ",[18,1504,1506],{"href":1505},"\u002Fdocs\u002Fexamples\u002Fkeycloak",[24,1507,1508],{},"docs\u002Fexamples\u002Fkeycloak\u002F","; how groups are mapped: ",[18,1511,1513],{"href":1512},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO group mapping",[218,1515,1516,1530],{},[221,1517,1518],{},[224,1519,1520,1522,1524,1526,1528],{},[227,1521,437],{},[227,1523,440],{},[227,1525,443],{},[227,1527,124],{},[227,1529,448],{},[234,1531,1532,1558,1577,1596,1619,1644,1684,1703,1729,1755,1774,1793,1819,1844,1866,1886,1907,1935,1966],{},[224,1533,1534,1538,1540,1542,1547],{},[239,1535,1536],{},[24,1537,1501],{},[239,1539,459],{},[239,1541,595],{},[239,1543,1544],{},[24,1545,1546],{},"oidc.issuer",[239,1548,1549,1550,1553,1554,1557],{},"Issuer URL, e.g. ",[24,1551,1552],{},"https:\u002F\u002Fkeycloak.example.com\u002Frealms\u002Ftabularia"," or, for Entra ID, ",[24,1555,1556],{},"https:\u002F\u002Flogin.microsoftonline.com\u002F\u003Ctenant-id>\u002Fv2.0",". Empty = SSO off.",[224,1559,1560,1565,1567,1569,1574],{},[239,1561,1562],{},[24,1563,1564],{},"OIDC__CLIENT_ID",[239,1566,459],{},[239,1568,595],{},[239,1570,1571],{},[24,1572,1573],{},"oidc.clientId",[239,1575,1576],{},"Client id registered on the identity provider.",[224,1578,1579,1584,1586,1588,1593],{},[239,1580,1581],{},[24,1582,1583],{},"OIDC__CLIENT_SECRET",[239,1585,459],{},[239,1587,595],{},[239,1589,1590],{},[24,1591,1592],{},"secrets.oidcClientSecret",[239,1594,1595],{},"Secret of that (confidential) client. Required when SSO is on.",[224,1597,1598,1603,1605,1607,1612],{},[239,1599,1600],{},[24,1601,1602],{},"OIDC__REDIRECT_URI",[239,1604,459],{},[239,1606,595],{},[239,1608,1609],{},[24,1610,1611],{},"oidc.redirectUri",[239,1613,1614,1615,1618],{},"The gateway's callback, e.g. ",[24,1616,1617],{},"https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fauth\u002Fsso\u002Fcallback","; it must match the one registered on the identity provider exactly. Required when SSO is on.",[224,1620,1621,1626,1628,1633,1638],{},[239,1622,1623],{},[24,1624,1625],{},"OIDC__SCOPES",[239,1627,459],{},[239,1629,1630],{},[24,1631,1632],{},"openid profile email",[239,1634,1635],{},[24,1636,1637],{},"oidc.scopes",[239,1639,1640,1641,141],{},"Scopes asked for, separated by spaces; must include ",[24,1642,1643],{},"openid",[224,1645,1646,1651,1653,1658,1663],{},[239,1647,1648],{},[24,1649,1650],{},"OIDC__GROUPS_CLAIM",[239,1652,459],{},[239,1654,1655],{},[24,1656,1657],{},"groups",[239,1659,1660],{},[24,1661,1662],{},"oidc.groupsClaim",[239,1664,1665,1666,1668,1669,1672,1673,155,1676,1679,1680,1683],{},"Where the groups are: a claim (",[24,1667,1657],{}," for Keycloak's group mapper, ",[24,1670,1671],{},"roles"," for Entra ID app roles) or a path into the token, as it appears in the JSON: ",[24,1674,1675],{},"realm_access.roles",[24,1677,1678],{},"resource_access.\u003Cclient id>.roles"," for Keycloak's realm and client roles (a client id with dots works). Several, comma-separated, are joined: ",[24,1681,1682],{},"groups,realm_access.roles",". A path the id_token does not carry is looked up in the access token (Keycloak puts the roles there by default), then in the provider's userinfo. Also adjustable in Administration → Settings.",[224,1685,1686,1691,1693,1695,1700],{},[239,1687,1688],{},[24,1689,1690],{},"OIDC__GROUP_ALLOWLIST",[239,1692,459],{},[239,1694,595],{},[239,1696,1697],{},[24,1698,1699],{},"oidc.groupAllowlist",[239,1701,1702],{},"Identity-provider groups mapped onto Tabularia groups, separated by commas. Empty = all of them. Also adjustable in Administration → Settings.",[224,1704,1705,1710,1712,1716,1721],{},[239,1706,1707],{},[24,1708,1709],{},"OIDC__AUTO_CREATE_GROUPS",[239,1711,1142],{},[239,1713,1714],{},[24,1715,73],{},[239,1717,1718],{},[24,1719,1720],{},"oidc.autoCreateGroups",[239,1722,1723,1725,1726,1728],{},[24,1724,69],{},": create the Tabularia groups missing at sign-in. ",[24,1727,73],{},": map only onto groups an administrator already made. Also adjustable in Administration → Settings.",[224,1730,1731,1736,1738,1742,1747],{},[239,1732,1733],{},[24,1734,1735],{},"OIDC__AUTHORITATIVE",[239,1737,1142],{},[239,1739,1740],{},[24,1741,69],{},[239,1743,1744],{},[24,1745,1746],{},"oidc.authoritative",[239,1748,1749,1751,1752,1754],{},[24,1750,69],{},": the identity provider owns group membership (groups absent from the claim are removed). ",[24,1753,73],{},": SSO only adds. A token without any of the group claims counts as no groups (identity providers leave the claim out for a person in no group): check the claim name, the audit of each sign-in names a missing one. Also adjustable in Administration → Settings.",[224,1756,1757,1762,1764,1766,1771],{},[239,1758,1759],{},[24,1760,1761],{},"OIDC__SUPERUSER_GROUP",[239,1763,459],{},[239,1765,595],{},[239,1767,1768],{},[24,1769,1770],{},"oidc.superuserGroup",[239,1772,1773],{},"Members of this group are administrators. Empty = nobody becomes one through SSO.",[224,1775,1776,1781,1783,1785,1790],{},[239,1777,1778],{},[24,1779,1780],{},"OIDC__ALLOWED_EMAIL_DOMAINS",[239,1782,459],{},[239,1784,595],{},[239,1786,1787],{},[24,1788,1789],{},"oidc.allowedEmailDomains",[239,1791,1792],{},"Only people with an e-mail in these domains may sign in, separated by commas. Empty = anyone the identity provider authenticates, which may be a whole company directory. Also adjustable in Administration → Settings.",[224,1794,1795,1800,1802,1806,1811],{},[239,1796,1797],{},[24,1798,1799],{},"OIDC__REQUIRE_ALLOWLISTED_GROUP",[239,1801,1142],{},[239,1803,1804],{},[24,1805,73],{},[239,1807,1808],{},[24,1809,1810],{},"oidc.requireAllowlistedGroup",[239,1812,1813,1815,1816,1818],{},[24,1814,69],{},": signing in requires one of the groups of ",[24,1817,1690],{}," (or the administrators' group). Also adjustable in Administration → Settings.",[224,1820,1821,1826,1828,1833,1838],{},[239,1822,1823],{},[24,1824,1825],{},"OIDC__POST_LOGIN_URL",[239,1827,459],{},[239,1829,1830],{},[24,1831,1832],{},"http:\u002F\u002Flocalhost:3000\u002Fauth\u002Fcallback",[239,1834,1835],{},[24,1836,1837],{},"oidc.postLoginUrl",[239,1839,1840,1841,141],{},"The interface page that receives the session after SSO, e.g. ",[24,1842,1843],{},"https:\u002F\u002Ftabularia.example.com\u002Fauth\u002Fcallback",[224,1845,1846,1851,1853,1858,1863],{},[239,1847,1848],{},[24,1849,1850],{},"OIDC__BUTTON_LABEL",[239,1852,459],{},[239,1854,1855],{},[24,1856,1857],{},"Single sign-on",[239,1859,1860],{},[24,1861,1862],{},"oidc.buttonLabel",[239,1864,1865],{},"Label of the SSO button on the sign-in page. Also adjustable in Administration → Settings.",[224,1867,1868,1873,1875,1879,1883],{},[239,1869,1870],{},[24,1871,1872],{},"OIDC__DISCOVERY_TTL_SECONDS",[239,1874,567],{},[239,1876,1877],{},[24,1878,572],{},[239,1880,1881],{},[24,1882,132],{},[239,1884,1885],{},"How long the identity provider's discovery document is trusted before it is fetched again. Also adjustable in Administration → Settings.",[224,1887,1888,1893,1896,1900,1904],{},[239,1889,1890],{},[24,1891,1892],{},"OIDC__TIMEOUT_SECONDS",[239,1894,1895],{},"number",[239,1897,1898],{},[24,1899,1125],{},[239,1901,1902],{},[24,1903,132],{},[239,1905,1906],{},"Timeout of the calls to the identity provider. Also adjustable in Administration → Settings.",[224,1908,1909,1914,1916,1918,1921],{},[239,1910,1911],{},[24,1912,1913],{},"OIDC__CA_FILE",[239,1915,459],{},[239,1917,595],{},[239,1919,1920],{},"oidc.caCert \u002F oidc.caConfigMap",[239,1922,1923,1924,1927,1928,70,1931,1934],{},"A PEM file of the certificate authorities to trust for the identity provider, besides the public ones: a company Keycloak whose certificate the company's own authority signed (without it every sign-in fails with ",[24,1925,1926],{},"idp_untrusted","). The chart mounts it from ",[24,1929,1930],{},"oidc.caCert",[24,1932,1933],{},"oidc.caConfigMap",". The gateway refuses to start when the file is not one.",[224,1936,1937,1942,1944,1948,1953],{},[239,1938,1939],{},[24,1940,1941],{},"OIDC__VERIFY_TLS",[239,1943,1142],{},[239,1945,1946],{},[24,1947,69],{},[239,1949,1950],{},[24,1951,1952],{},"oidc.verifyTls",[239,1954,1955,1956,1958,1959,1961,1962,141],{},"Whether the identity provider's certificate is checked. ",[24,1957,73],{}," accepts it even when no trusted authority signed it (a company Keycloak whose authority you cannot give in ",[24,1960,1913],{},"): whoever can stand between the gateway and the provider can then sign in as anyone, administrators included. The gateway logs a warning at every start. See ",[18,1963,1965],{"href":1964},"\u002Fdocs\u002Fsso-keycloak#a-certificate-the-gateway-does-not-trust","Single sign-on with Keycloak",[224,1967,1968,1973,1975,1980,1984],{},[239,1969,1970],{},[24,1971,1972],{},"OIDC__LOGIN_TX_TTL_SECONDS",[239,1974,567],{},[239,1976,1977],{},[24,1978,1979],{},"600",[239,1981,1982],{},[24,1983,132],{},[239,1985,1986],{},"How long a sign-in may stay on the identity provider's page (the state, nonce and PKCE cookie). Also adjustable in Administration → Settings.",[703,1988,1990],{"id":1989},"link-to-the-engine","Link to the engine",[218,1992,1993,2007],{},[221,1994,1995],{},[224,1996,1997,1999,2001,2003,2005],{},[227,1998,437],{},[227,2000,440],{},[227,2002,443],{},[227,2004,124],{},[227,2006,448],{},[234,2008,2009,2033,2058,2082,2109],{},[224,2010,2011,2016,2018,2023,2026],{},[239,2012,2013],{},[24,2014,2015],{},"ENGINE__BASE_URL",[239,2017,459],{},[239,2019,2020],{},[24,2021,2022],{},"http:\u002F\u002Flocalhost:8000",[239,2024,2025],{},"set by the chart (the engine Service)",[239,2027,2028,2029,2032],{},"Internal URL of the engine API (",[24,2030,2031],{},"http:\u002F\u002Fbackend:8000"," in Compose). The gateway is its only client.",[224,2034,2035,2040,2042,2047,2052],{},[239,2036,2037],{},[24,2038,2039],{},"ENGINE__BUCKET",[239,2041,459],{},[239,2043,2044],{},[24,2045,2046],{},"data-prep",[239,2048,2049],{},[24,2050,2051],{},"externalServices.storage.bucket",[239,2053,2054,2055,2057],{},"The gateway's copy of the bucket name, compared with the bucket of every request (a mismatch is refused with 403). It must equal ",[24,2056,45],{},": the Compose file and the chart derive it from that value, so set it by hand only if you know why.",[224,2059,2060,2064,2066,2071,2076],{},[239,2061,2062],{},[24,2063,583],{},[239,2065,567],{},[239,2067,2068,2070],{},[24,2069,564],{}," + 300",[239,2072,2073],{},[24,2074,2075],{},"engine.runStaleTimeoutSeconds",[239,2077,2078,2079,2081],{},"A run that has not reached a final state after this long is declared lost and marked failed. It must stay above ",[24,2080,564],{},", so the gateway gives up only after the worker has killed the task. Also adjustable in Administration → Settings.",[224,2083,2084,2089,2091,2095,2100],{},[239,2085,2086],{},[24,2087,2088],{},"ENGINE__SETTINGS_PANEL",[239,2090,1142],{},[239,2092,2093],{},[24,2094,69],{},[239,2096,2097],{},[24,2098,2099],{},"engine.settingsPanel",[239,2101,2102,2103,2105,2106,2108],{},"Whether Administration → Settings may change some engine parameters at runtime (",[18,2104,202],{"href":201},"). ",[24,2107,73],{},": the environment is the only source, the panel shows the values without changing them, and values saved before stop applying.",[224,2110,2111,2116,2119,2124,2128],{},[239,2112,2113],{},[24,2114,2115],{},"ENGINE__DBT_EXPORT_TIMEOUT_SECONDS",[239,2117,2118],{},"number, > 0 and ≤ 3600",[239,2120,2121],{},[24,2122,2123],{},"100",[239,2125,2126],{},[24,2127,132],{},[239,2129,2130,2131,2134],{},"Seconds the gateway waits for the engine to build one dbt export; past it the download stops with a clear 504 instead of hanging until the ingress cuts it. Keep it, plus ",[24,2132,2133],{},"AI__DBT_EXPORT_TIMEOUT_SECONDS",", under the ingress' read timeout. Also adjustable in Administration → Settings.",[703,2136,2138],{"id":2137},"ai-assistant","AI assistant",[14,2140,2141,2142,155,2145,2148,2149,2153,2154,115],{},"Optional: a chat over the catalog and an assistant in the flow editor. Off until an administrator adds a provider in Administration → AI models (Anthropic, or any OpenAI-compatible endpoint), or ",[24,2143,2144],{},"AI__BASE_URL",[24,2146,2147],{},"AI__SECRET_KEY"," are set, and no model is usable until an administrator enables it. On the external ClickHouse the assistant can run as a read-only user: see ",[18,2150,2152],{"href":2151},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","the AI user",". The dbt export uses it too (",[18,2155,2157],{"href":2156},"\u002Fdocs\u002Fdbt-export","dbt export",[218,2159,2160,2174],{},[221,2161,2162],{},[224,2163,2164,2166,2168,2170,2172],{},[227,2165,437],{},[227,2167,440],{},[227,2169,443],{},[227,2171,124],{},[227,2173,448],{},[234,2175,2176,2198,2217,2235,2257,2281,2304,2327,2350,2372,2395,2420,2440,2462,2485,2506,2529,2550,2572],{},[224,2177,2178,2182,2184,2186,2191],{},[239,2179,2180],{},[24,2181,2144],{},[239,2183,459],{},[239,2185,595],{},[239,2187,2188],{},[24,2189,2190],{},"ai.baseUrl",[239,2192,2193,2194,2197],{},"OpenAI-compatible endpoint, e.g. ",[24,2195,2196],{},"https:\u002F\u002Fapi.scaleway.ai\u002Fv1",": a provider that shows in the panel as read-only. Empty = no such provider.",[224,2199,2200,2205,2207,2209,2214],{},[239,2201,2202],{},[24,2203,2204],{},"AI__ACCESS_KEY",[239,2206,459],{},[239,2208,595],{},[239,2210,2211],{},[24,2212,2213],{},"ai.accessKey",[239,2215,2216],{},"Identifier of the key (Scaleway calls it access key); the protocol authenticates with the secret alone, this only tells which key is in use.",[224,2218,2219,2223,2225,2227,2232],{},[239,2220,2221],{},[24,2222,2147],{},[239,2224,459],{},[239,2226,595],{},[239,2228,2229],{},[24,2230,2231],{},"secrets.aiSecretKey",[239,2233,2234],{},"Its API key. Empty = no such provider.",[224,2236,2237,2242,2244,2246,2251],{},[239,2238,2239],{},[24,2240,2241],{},"AI__DEFAULT_MODEL",[239,2243,459],{},[239,2245,595],{},[239,2247,2248],{},[24,2249,2250],{},"ai.defaultModel",[239,2252,2253,2254,584],{},"Model proposed first in the picker, if an administrator enabled it, on any provider: its name, e.g. ",[24,2255,2256],{},"claude-opus-5-5",[224,2258,2259,2264,2266,2270,2274],{},[239,2260,2261],{},[24,2262,2263],{},"AI__METADATA_ONLY",[239,2265,1142],{},[239,2267,2268],{},[24,2269,73],{},[239,2271,2272],{},[24,2273,132],{},[239,2275,2276,2277,584],{},"On, no value of a row of data reaches the model configured here: the chat, the flow and script assistants and the dbt export get names, types, descriptions, row counts and structure, with no query, preview, sample or error text, and the AI comments on dashboards and reports are off. Values people typed in filters, SQL and descriptions still go. See ",[18,2278,2280],{"href":2279},"\u002Fdocs\u002Fintegrations\u002Fai#metadata-only-mode","AI in Tabularia",[224,2282,2283,2288,2291,2296,2301],{},[239,2284,2285],{},[24,2286,2287],{},"AI__MAX_RESULT_ROWS",[239,2289,2290],{},"integer, 1–2000",[239,2292,2293],{},[24,2294,2295],{},"200",[239,2297,2298],{},[24,2299,2300],{},"ai.maxResultRows",[239,2302,2303],{},"Rows a query of the assistant may return, to the model and to the chat. Also adjustable in Administration → Settings.",[224,2305,2306,2311,2314,2319,2324],{},[239,2307,2308],{},[24,2309,2310],{},"AI__MAX_REQUESTS",[239,2312,2313],{},"integer, 1–50",[239,2315,2316],{},[24,2317,2318],{},"12",[239,2320,2321],{},[24,2322,2323],{},"ai.maxRequests",[239,2325,2326],{},"Model round-trips per message of the data chat: the cap on its tool-calling loop. Also adjustable in Administration → Settings.",[224,2328,2329,2334,2337,2342,2347],{},[239,2330,2331],{},[24,2332,2333],{},"AI__MAX_FLOW_REQUESTS",[239,2335,2336],{},"integer, 1–80",[239,2338,2339],{},[24,2340,2341],{},"30",[239,2343,2344],{},[24,2345,2346],{},"ai.maxFlowRequests",[239,2348,2349],{},"The same for the assistants that build — the flow editor's, and the Assistant page's for whoever may make changes — which take a round-trip for every step they build and check. Also adjustable in Administration → Settings.",[224,2351,2352,2357,2360,2365,2369],{},[239,2353,2354],{},[24,2355,2356],{},"AI__MAX_HISTORY_MESSAGES",[239,2358,2359],{},"integer, 0–400",[239,2361,2362],{},[24,2363,2364],{},"60",[239,2366,2367],{},[24,2368,132],{},[239,2370,2371],{},"Past messages of a conversation replayed to the model: higher remembers more and costs more per turn. Also adjustable in Administration → Settings.",[224,2373,2374,2379,2382,2387,2392],{},[239,2375,2376],{},[24,2377,2378],{},"AI__MAX_COST_PER_TURN_USD",[239,2380,2381],{},"number, ≥ 0",[239,2383,2384],{},[24,2385,2386],{},"0.5",[239,2388,2389],{},[24,2390,2391],{},"ai.maxCostPerTurnUsd",[239,2393,2394],{},"Spending ceiling of one turn, in dollars. The round-trip cap does not limit tokens. A model with no known price counts at $4 in and $20 out per million tokens. Also adjustable in Administration → Settings.",[224,2396,2397,2401,2403,2407,2412],{},[239,2398,2399],{},[24,2400,393],{},[239,2402,2381],{},[239,2404,2405],{},[24,2406,1407],{},[239,2408,2409],{},[24,2410,2411],{},"ai.maxCostPerDayUsd",[239,2413,2414,2416,2417,2419],{},[39,2415,474],{}," set it, and ",[24,2418,397],{},", wherever people you do not know can sign in (every question is paid with your key). Daily ceiling per user, in dollars. 0 = none. Also adjustable in Administration → Settings.",[224,2421,2422,2426,2428,2432,2437],{},[239,2423,2424],{},[24,2425,397],{},[239,2427,2381],{},[239,2429,2430],{},[24,2431,1407],{},[239,2433,2434],{},[24,2435,2436],{},"ai.maxCostPerDayTotalUsd",[239,2438,2439],{},"Daily ceiling of the whole installation, in dollars: where many people share one account (a public demo) the per-user ceiling protects nothing. Once reached, the assistant is unavailable until the next day. 0 = none. Also adjustable in Administration → Settings.",[224,2441,2442,2447,2450,2455,2459],{},[239,2443,2444],{},[24,2445,2446],{},"AI__MAX_INPUT_TOKENS_PER_TURN",[239,2448,2449],{},"integer, ≥ 1000",[239,2451,2452],{},[24,2453,2454],{},"400000",[239,2456,2457],{},[24,2458,132],{},[239,2460,2461],{},"Input tokens one turn may send to the model, without those read from the provider's cache: the spending ceilings stand for those. Also adjustable in Administration → Settings.",[224,2463,2464,2468,2470,2475,2479],{},[239,2465,2466],{},[24,2467,2133],{},[239,2469,2118],{},[239,2471,2472],{},[24,2473,2474],{},"180",[239,2476,2477],{},[24,2478,132],{},[239,2480,2481,2482,2484],{},"Seconds for all the AI calls of one dbt export (descriptions and translations). Keep it, plus ",[24,2483,2115],{},", under the ingress' read timeout (300 s in the chart). Also adjustable in Administration → Settings.",[224,2486,2487,2492,2495,2499,2503],{},[239,2488,2489],{},[24,2490,2491],{},"AI__MAX_CHATS_LISTED",[239,2493,2494],{},"integer, 1–500",[239,2496,2497],{},[24,2498,2123],{},[239,2500,2501],{},[24,2502,132],{},[239,2504,2505],{},"Conversations listed per person; older ones are not deleted, only left out of the list. Also adjustable in Administration → Settings.",[224,2507,2508,2513,2516,2521,2526],{},[239,2509,2510],{},[24,2511,2512],{},"AI__COMMENT_KEEP_SECONDS",[239,2514,2515],{},"integer, ≥ 60",[239,2517,2518],{},[24,2519,2520],{},"86400",[239,2522,2523],{},[24,2524,2525],{},"ai.commentKeepSeconds",[239,2527,2528],{},"How long an AI comment on a dashboard's or a report's numbers stays for whoever reads the same numbers: within it, those numbers cost no new call. Also adjustable in Administration → Settings.",[224,2530,2531,2536,2538,2542,2547],{},[239,2532,2533],{},[24,2534,2535],{},"AI__COMMENT_MIN_SECONDS",[239,2537,2515],{},[239,2539,2540],{},[24,2541,572],{},[239,2543,2544],{},[24,2545,2546],{},"ai.commentMinSeconds",[239,2548,2549],{},"Least time between two calls for one element when a dashboard refreshes by itself with new numbers: until then the old text stays, saying the time of its numbers. A wall screen must not make a call at every refresh. Opening a page, a refresh by hand and a document are not held by it. Also adjustable in Administration → Settings.",[224,2551,2552,2557,2560,2564,2569],{},[239,2553,2554],{},[24,2555,2556],{},"AI__COMMENT_WAIT_SECONDS",[239,2558,2559],{},"integer, 1–240",[239,2561,2562],{},[24,2563,2341],{},[239,2565,2566],{},[24,2567,2568],{},"ai.commentWaitSeconds",[239,2570,2571],{},"Longest a report or a document waits for the AI comment. Past it, it goes out with a line saying the comment is not available, and the text is kept for the next one. Keep it under the ingress' read timeout (300 s in the chart). Also adjustable in Administration → Settings.",[224,2573,2574,2579,2581,2583,2588],{},[239,2575,2576],{},[24,2577,2578],{},"AI__COMMENT_MODEL",[239,2580,459],{},[239,2582,595],{},[239,2584,2585],{},[24,2586,2587],{},"ai.commentModel",[239,2589,2590,2591,2593],{},"The model of the AI comments, as ",[24,2592,2241],{}," names one. Empty: the default model. One that cannot be used means no comment: another model is never used in its place, since the numbers go where the administrator said. Also adjustable in Administration → Settings.",[2595,2596,2598],"h4",{"id":2597},"the-agents-instructions","The agents' instructions",[14,2600,2601,2602,2605,2606,484,2609,115],{},"Administration → AI → ",[95,2603,2604],{},"Agent instructions"," shows the system prompt of every AI agent: the\ndata assistant, the flow and script assistants, the conversation titles, and the dbt\nexport's descriptions and SQL translations. An administrator can rewrite an agent's text\nor restore the default; observers read it. A change applies from the next request, on every\ngateway replica, and goes to the audit log (",[24,2607,2608],{},"ai.prompt_update",[24,2610,2611],{},"ai.prompt_reset",[14,2613,2614],{},"What the administrators write is only the agent's text. At every request Tabularia appends\na context that cannot be edited: today's date, the engine's SQL dialect and the row cap,\nthe flow or the script being edited, the dialects of a translation, and, last, the language\nof the user's interface (the answer is written in it whatever language the question or the\ndata are in). The panel shows that context with example values. Texts the AI already wrote\nfor a version of a flow in a dbt export stay: a new text applies to later versions.",[703,2616,2618],{"id":2617},"agents-over-mcp","Agents over MCP",[14,2620,2621,2622,2625,2626,2628,2629,2632,2633,2636,2637,2640],{},"The MCP server at ",[24,2623,2624],{},"\u002Fmcp"," (on the gateway, under ",[24,2627,849],{}," when set): agents outside Tabularia — Claude Desktop, an IDE, another company agent — use the same tools as the assistant, signed in with an ",[18,2630,2631],{"href":211},"API token",". A read-only token only reads; a write token builds flows in drafts and proposes plans, and a plan changes nothing until it is confirmed, by the agent's human (",[24,2634,2635],{},"confirm_plan",") or by the person on the plan's page in Tabularia. Every applied action is in the audit log with ",[24,2638,2639],{},"via: mcp"," and the token's name. It needs no AI model: the model is the client's. Stateless (JSON answers, no sessions), so any gateway replica serves any call.",[218,2642,2643,2657],{},[221,2644,2645],{},[224,2646,2647,2649,2651,2653,2655],{},[227,2648,437],{},[227,2650,440],{},[227,2652,443],{},[227,2654,124],{},[227,2656,448],{},[234,2658,2659,2682,2705],{},[224,2660,2661,2666,2668,2672,2676],{},[239,2662,2663],{},[24,2664,2665],{},"MCP__ENABLED",[239,2667,1142],{},[239,2669,2670],{},[24,2671,69],{},[239,2673,2674],{},[24,2675,132],{},[239,2677,2678,2679,2681],{},"Turns the MCP server on. Off, ",[24,2680,2624],{}," answers 404 and the API tokens keep working on the rest of the API. Also adjustable in Administration → Settings.",[224,2683,2684,2689,2691,2695,2699],{},[239,2685,2686],{},[24,2687,2688],{},"MCP__CONFIRM_IN_TABULARIA_ONLY",[239,2690,1142],{},[239,2692,2693],{},[24,2694,73],{},[239,2696,2697],{},[24,2698,132],{},[239,2700,2701,2702,2704],{},"On, an agent cannot apply its own plans (",[24,2703,2635],{}," refuses with the plan's link): a person signed in to Tabularia confirms each plan on its page. Also adjustable in Administration → Settings.",[224,2706,2707,2712,2714,2718,2722],{},[239,2708,2709],{},[24,2710,2711],{},"MCP__METADATA_ONLY",[239,2713,1142],{},[239,2715,2716],{},[24,2717,73],{},[239,2719,2720],{},[24,2721,132],{},[239,2723,2724,2725,2727,2728,584],{},"On, the MCP tools that read values are neither offered nor callable, and the others leave out rows and error text. It covers ",[24,2726,2624],{}," only: an API token can still read data on the rest of the API. See ",[18,2729,2280],{"href":2279},[703,2731,2733],{"id":2732},"development-sample","Development sample",[218,2735,2736,2750],{},[221,2737,2738],{},[224,2739,2740,2742,2744,2746,2748],{},[227,2741,437],{},[227,2743,440],{},[227,2745,443],{},[227,2747,124],{},[227,2749,448],{},[234,2751,2752],{},[224,2753,2754,2759,2761,2765,2770],{},[239,2755,2756],{},[24,2757,2758],{},"PREVIEW__DEFAULT_SAMPLE_ROWS",[239,2760,661],{},[239,2762,2763],{},[24,2764,1407],{},[239,2766,2767],{},[24,2768,2769],{},"app.previewDefaultSampleRows",[239,2771,2772],{},"Above 0, every source node without a sample of its own is read only for its first N rows in editor previews and trial runs. People switch it off per node; scheduled runs and «Run in production» always read everything. Useful when every read costs (remote storage, a pay-per-use warehouse). 0 = no automatic sample. Also adjustable in Administration → Settings.",[703,2774,2776],{"id":2775},"orchestration-and-scheduling","Orchestration and scheduling",[14,2778,2779,2780,2782,2783,70,2785,2787],{},"How flows are executed: queued in the database, picked up by an orchestrator process (",[24,2781,162],{}," ",[24,2784,813],{},[24,2786,158],{},"), which waits for each step to complete before the next.",[218,2789,2790,2804],{},[221,2791,2792],{},[224,2793,2794,2796,2798,2800,2802],{},[227,2795,437],{},[227,2797,440],{},[227,2799,443],{},[227,2801,124],{},[227,2803,448],{},[234,2805,2806,2829,2850,2871,2893,2915,2937,2959,2983,3005,3025,3046],{},[224,2807,2808,2813,2815,2819,2824],{},[239,2809,2810],{},[24,2811,2812],{},"ORCHESTRATOR__REFRESH_WAIT_SECONDS",[239,2814,567],{},[239,2816,2817],{},[24,2818,1979],{},[239,2820,2821],{},[24,2822,2823],{},"orchestrator.refreshWaitSeconds",[239,2825,2826,2827,584],{},"Longest a flow waits for a Refresh node to complete before aborting rather than reading stale data. Raise it for very long refreshes. An Output node has no cap of its own: it is bounded by ",[24,2828,583],{},[224,2830,2831,2836,2838,2842,2847],{},[239,2832,2833],{},[24,2834,2835],{},"ORCHESTRATOR__LOG_RETENTION_DAYS",[239,2837,661],{},[239,2839,2840],{},[24,2841,2341],{},[239,2843,2844],{},[24,2845,2846],{},"orchestrator.logRetentionDays",[239,2848,2849],{},"After how many days a run's logs are emptied: what a Script or Container node printed, and the engine's full traceback of a failure. The runs stay, with their outcome, short error, timings and exit code. 0 keeps them for ever. With the three settings below, the orchestrators trim this history every hour and then vacuum the tables they touched. Also adjustable in Administration → Settings.",[224,2851,2852,2857,2859,2863,2868],{},[239,2853,2854],{},[24,2855,2856],{},"ORCHESTRATOR__CONTRACT_RESULTS_KEPT",[239,2858,661],{},[239,2860,2861],{},[24,2862,2123],{},[239,2864,2865],{},[24,2866,2867],{},"orchestrator.contractResultsKept",[239,2869,2870],{},"The latest data contract reports kept per datasource; older ones are deleted every hour, never one whose notice is still to be sent. 0 keeps them all. Also adjustable in Administration → Settings.",[224,2872,2873,2878,2880,2885,2890],{},[239,2874,2875],{},[24,2876,2877],{},"ORCHESTRATOR__VERSIONS_KEPT",[239,2879,661],{},[239,2881,2882],{},[24,2883,2884],{},"50",[239,2886,2887],{},[24,2888,2889],{},"orchestrator.versionsKept",[239,2891,2892],{},"The latest versions kept per flow and per saved script; the one in use is always kept. 0 keeps them all. Also adjustable in Administration → Settings.",[224,2894,2895,2900,2902,2907,2912],{},[239,2896,2897],{},[24,2898,2899],{},"ORCHESTRATOR__AI_CHAT_RETENTION_DAYS",[239,2901,661],{},[239,2903,2904],{},[24,2905,2906],{},"90",[239,2908,2909],{},[24,2910,2911],{},"orchestrator.aiChatRetentionDays",[239,2913,2914],{},"The assistant's conversations untouched for this many days are deleted, with their turns; the spending ledger stays. 0 keeps them. Also adjustable in Administration → Settings.",[224,2916,2917,2922,2924,2929,2934],{},[239,2918,2919],{},[24,2920,2921],{},"ORCHESTRATOR__POLL_INTERVAL_SECONDS",[239,2923,1895],{},[239,2925,2926],{},[24,2927,2928],{},"3",[239,2930,2931],{},[24,2932,2933],{},"orchestrator.pollIntervalSeconds",[239,2935,2936],{},"The longest wait, in seconds, between two checks of a step the flow is waiting for: the first checks come sooner (a quarter of a second, then every second for half a minute). Also adjustable in Administration → Settings.",[224,2938,2939,2944,2947,2952,2956],{},[239,2940,2941],{},[24,2942,2943],{},"ORCHESTRATOR__QUEUE_POLL_SECONDS",[239,2945,2946],{},"number, > 0",[239,2948,2949],{},[24,2950,2951],{},"1",[239,2953,2954],{},[24,2955,132],{},[239,2957,2958],{},"Seconds between two looks at the queue of flow executions. Also adjustable in Administration → Settings.",[224,2960,2961,2966,2968,2973,2978],{},[239,2962,2963],{},[24,2964,2965],{},"ORCHESTRATOR__MAX_CONCURRENT",[239,2967,1095],{},[239,2969,2970],{},[24,2971,2972],{},"20",[239,2974,2975],{},[24,2976,2977],{},"orchestrator.maxConcurrent",[239,2979,2980,2981,684],{},"Flow executions (and cells of flow groups) one orchestrator process carries at once; the others wait in the queue. Each uses a database connection while it asks the engine about a step: keep it below the pool (",[24,2982,1092],{},[224,2984,2985,2990,2992,2997,3002],{},[239,2986,2987],{},[24,2988,2989],{},"ORCHESTRATOR__QUEUE_TIMEOUT_SECONDS",[239,2991,2946],{},[239,2993,2994],{},[24,2995,2996],{},"900",[239,2998,2999],{},[24,3000,3001],{},"orchestrator.queueTimeoutSeconds",[239,3003,3004],{},"An execution still queued after this long (no orchestrator running, or all of them full) is not started any more: it is closed as failed. Also adjustable in Administration → Settings.",[224,3006,3007,3012,3014,3018,3022],{},[239,3008,3009],{},[24,3010,3011],{},"ORCHESTRATOR__HEARTBEAT_SECONDS",[239,3013,2946],{},[239,3015,3016],{},[24,3017,1125],{},[239,3019,3020],{},[24,3021,132],{},[239,3023,3024],{},"How often the process executing a flow says it is still there. Also adjustable in Administration → Settings.",[224,3026,3027,3032,3034,3038,3043],{},[239,3028,3029],{},[24,3030,3031],{},"ORCHESTRATOR__DEAD_AFTER_SECONDS",[239,3033,2946],{},[239,3035,3036],{},[24,3037,2364],{},[239,3039,3040],{},[24,3041,3042],{},"orchestrator.deadAfterSeconds",[239,3044,3045],{},"An execution silent for longer belongs to a process that died: another orchestrator closes it as interrupted. The machines' clocks must agree within this margin. Also adjustable in Administration → Settings.",[224,3047,3048,3053,3055,3060,3064],{},[239,3049,3050],{},[24,3051,3052],{},"SCHEDULING__WORKER_CAPACITY",[239,3054,567],{},[239,3056,3057],{},[24,3058,3059],{},"2",[239,3061,3062],{},[24,3063,132],{},[239,3065,3066,3067,584],{},"Flow runs one worker is assumed to carry at once: used only to highlight the crowded minutes in the schedule load heatmap. Match it to the run workers' ",[24,3068,3069],{},"CELERY__WORKER_CONCURRENCY",[703,3071,3073],{"id":3072},"database-backups","Database backups",[14,3075,3076,3077,3080,3081,484,3084,155,3087,3090,3091,3094,3095,141],{},"Kubernetes only (on Docker Compose Administration → Backups is greyed out). The automatic backup of the metadata database: an orchestrator runs ",[24,3078,3079],{},"pg_dump"," on the schedule and streams it to the engine, which stores it in the object storage and removes the oldest beyond the number to keep. ",[24,3082,3083],{},"BACKUP__ENABLED",[24,3085,3086],{},"BACKUP__SCHEDULE",[24,3088,3089],{},"BACKUP__KEEP"," are the installation's defaults, which Administration → Backups can change without a restart; where the files go is read by the engine. By default Tabularia's bucket under ",[24,3092,3093],{},"backups\u002Fpostgres\u002F",": in production give the backups a bucket of their own. Restoring one: ",[18,3096,3098],{"href":3097},"\u002Fdocs\u002Fdeploy\u002Fupgrading#when-something-goes-wrong","Upgrading",[218,3100,3101,3115],{},[221,3102,3103],{},[224,3104,3105,3107,3109,3111,3113],{},[227,3106,437],{},[227,3108,440],{},[227,3110,443],{},[227,3112,124],{},[227,3114,448],{},[234,3116,3117,3137,3165,3187,3214],{},[224,3118,3119,3123,3125,3129,3134],{},[239,3120,3121],{},[24,3122,3083],{},[239,3124,1142],{},[239,3126,3127],{},[24,3128,69],{},[239,3130,3131],{},[24,3132,3133],{},"backup.enabled",[239,3135,3136],{},"Whether the database is backed up on the schedule. Administration → Backups can turn it off or on; «Back up now» works either way.",[224,3138,3139,3143,3145,3150,3155],{},[239,3140,3141],{},[24,3142,3086],{},[239,3144,459],{},[239,3146,3147],{},[24,3148,3149],{},"0 3 * * *",[239,3151,3152],{},[24,3153,3154],{},"backup.schedule",[239,3156,3157,3158,3161,3162,3164],{},"When: a five-field cron (",[24,3159,3160],{},"minute hour day month weekday",") in ",[24,3163,906],{},". The process refuses to start with an invalid one.",[224,3166,3167,3171,3174,3179,3184],{},[239,3168,3169],{},[24,3170,3089],{},[239,3172,3173],{},"integer, 1–1000",[239,3175,3176],{},[24,3177,3178],{},"14",[239,3180,3181],{},[24,3182,3183],{},"backup.keep",[239,3185,3186],{},"How many backups stay; after each backup the oldest beyond this number are removed.",[224,3188,3189,3194,3196,3200,3204],{},[239,3190,3191],{},[24,3192,3193],{},"BACKUP__PG_DUMP",[239,3195,459],{},[239,3197,3198],{},[24,3199,3079],{},[239,3201,3202],{},[24,3203,132],{},[239,3205,3206,3207,3209,3210,3213],{},"The ",[24,3208,3079],{}," used when the image has none of the server's own version. The gateway image has those of PostgreSQL 14 to 18 and uses the server's, so that the server's own ",[24,3211,3212],{},"pg_restore"," reads the backup; this one (18's) also reads older servers.",[224,3215,3216,3221,3223,3227,3232],{},[239,3217,3218],{},[24,3219,3220],{},"BACKUP__TIMEOUT_SECONDS",[239,3222,2515],{},[239,3224,3225],{},[24,3226,572],{},[239,3228,3229],{},[24,3230,3231],{},"backup.timeoutSeconds",[239,3233,3234],{},"The longest a backup (the dump and its upload) may take before it is stopped and reported as failed. Also adjustable in Administration → Settings.",[703,3236,3238],{"id":3237},"openlineage","OpenLineage",[14,3240,3241,3242,3245,3246,3249,3250,141],{},"Optional: what every run read and wrote, sent to a catalog in the OpenLineage standard (Marquez, DataHub, Astro…). Off when neither ",[24,3243,3244],{},"OPENLINEAGE__URL"," nor ",[24,3247,3248],{},"OPENLINEAGE__FILE"," is set. See ",[18,3251,3238],{"href":3252},"\u002Fdocs\u002Fopenlineage",[218,3254,3255,3269],{},[221,3256,3257],{},[224,3258,3259,3261,3263,3265,3267],{},[227,3260,437],{},[227,3262,440],{},[227,3264,443],{},[227,3266,124],{},[227,3268,448],{},[234,3270,3271,3292,3321,3340,3358,3379,3400,3421],{},[224,3272,3273,3277,3279,3281,3286],{},[239,3274,3275],{},[24,3276,3244],{},[239,3278,459],{},[239,3280,595],{},[239,3282,3283],{},[24,3284,3285],{},"openlineage.url",[239,3287,3288,3289,141],{},"HTTP endpoint of the collector, e.g. ",[24,3290,3291],{},"http:\u002F\u002Fmarquez:5000",[224,3293,3294,3299,3301,3306,3311],{},[239,3295,3296],{},[24,3297,3298],{},"OPENLINEAGE__ENDPOINT",[239,3300,459],{},[239,3302,3303],{},[24,3304,3305],{},"api\u002Fv1\u002Flineage",[239,3307,3308],{},[24,3309,3310],{},"openlineage.endpoint",[239,3312,3313,3314,3316,3317,3320],{},"Path of the lineage endpoint on the collector: ",[24,3315,3305],{}," for Marquez and Astro, ",[24,3318,3319],{},"openapi\u002Fopenlineage\u002Fapi\u002Fv1\u002Flineage"," for DataHub.",[224,3322,3323,3328,3330,3332,3337],{},[239,3324,3325],{},[24,3326,3327],{},"OPENLINEAGE__API_KEY",[239,3329,459],{},[239,3331,595],{},[239,3333,3334],{},[24,3335,3336],{},"secrets.openlineageApiKey",[239,3338,3339],{},"Bearer token, if the collector asks for one.",[224,3341,3342,3346,3348,3350,3355],{},[239,3343,3344],{},[24,3345,3248],{},[239,3347,459],{},[239,3349,595],{},[239,3351,3352],{},[24,3353,3354],{},"openlineage.file",[239,3356,3357],{},"Also, or instead, write the events as JSON Lines to this file.",[224,3359,3360,3365,3367,3371,3376],{},[239,3361,3362],{},[24,3363,3364],{},"OPENLINEAGE__NAMESPACE",[239,3366,459],{},[239,3368,3369],{},[24,3370,1012],{},[239,3372,3373],{},[24,3374,3375],{},"openlineage.namespace",[239,3377,3378],{},"Namespace of this installation's jobs.",[224,3380,3381,3386,3388,3392,3397],{},[239,3382,3383],{},[24,3384,3385],{},"OPENLINEAGE__TIMEOUT_SECONDS",[239,3387,2946],{},[239,3389,3390],{},[24,3391,1125],{},[239,3393,3394],{},[24,3395,3396],{},"openlineage.timeoutSeconds",[239,3398,3399],{},"How long the collector may take to answer. Events are sent after the run is closed, from a background thread: a collector that is down never fails a run. Also adjustable in Administration → Settings.",[224,3401,3402,3407,3409,3411,3415],{},[239,3403,3404],{},[24,3405,3406],{},"OPENLINEAGE_URL",[239,3408,459],{},[239,3410,595],{},[239,3412,3413],{},[24,3414,132],{},[239,3416,3417,3418,3420],{},"The OpenLineage library's own variable: switches lineage on like ",[24,3419,3244],{},", configured the library's way.",[224,3422,3423,3428,3430,3432,3436],{},[239,3424,3425],{},[24,3426,3427],{},"OPENLINEAGE_CONFIG",[239,3429,459],{},[239,3431,595],{},[239,3433,3434],{},[24,3435,132],{},[239,3437,3438,3439,3442],{},"The OpenLineage library's own configuration file (",[24,3440,3441],{},"openlineage.yml","), as an alternative to the variables above.",[703,3444,3446],{"id":3445},"webhooks-and-audit-log","Webhooks and audit log",[14,3448,3449,3450,3452,3453,3455],{},"Webhook receivers are added in Administration → Webhooks (",[18,3451,212],{"href":211},"); forwarding the audit log to a SIEM is set up in Administration → SIEM (",[18,3454,207],{"href":206},"). Neither has an environment variable beyond these.",[218,3457,3458,3472],{},[221,3459,3460],{},[224,3461,3462,3464,3466,3468,3470],{},[227,3463,437],{},[227,3465,440],{},[227,3467,443],{},[227,3469,124],{},[227,3471,448],{},[234,3473,3474,3495,3517,3538],{},[224,3475,3476,3481,3483,3487,3492],{},[239,3477,3478],{},[24,3479,3480],{},"WEBHOOKS__RETENTION_DAYS",[239,3482,1095],{},[239,3484,3485],{},[24,3486,2341],{},[239,3488,3489],{},[24,3490,3491],{},"webhooks.retentionDays",[239,3493,3494],{},"Days the history of webhook calls is kept. Also adjustable in Administration → Settings.",[224,3496,3497,3502,3505,3509,3514],{},[239,3498,3499],{},[24,3500,3501],{},"WEBHOOKS__TIMEOUT_SECONDS",[239,3503,3504],{},"number, > 0 and ≤ 60",[239,3506,3507],{},[24,3508,1125],{},[239,3510,3511],{},[24,3512,3513],{},"webhooks.timeoutSeconds",[239,3515,3516],{},"How long a webhook receiver may take to answer. Also adjustable in Administration → Settings.",[224,3518,3519,3524,3526,3530,3535],{},[239,3520,3521],{},[24,3522,3523],{},"AUDIT__RETENTION_MINUTES",[239,3525,661],{},[239,3527,3528],{},[24,3529,1407],{},[239,3531,3532],{},[24,3533,3534],{},"app.auditRetentionMinutes",[239,3536,3537],{},"Audit entries older than this many minutes are deleted, once a minute. 0 = kept forever. Minutes because on a public demo the useful window is an hour (43200 = thirty days). The privacy notice can quote it.",[224,3539,3540,3545,3547,3551,3555],{},[239,3541,3542],{},[24,3543,3544],{},"AUDIT__IP_RETENTION_DAYS",[239,3546,661],{},[239,3548,3549],{},[24,3550,2906],{},[239,3552,3553],{},[24,3554,132],{},[239,3556,3557,3558,3560],{},"Client addresses and browser strings are personal data, kept for this many days: past them they are emptied from audit entries, API tokens and sessions, once an hour, and the entry itself stays (who did what, and when). 0 = kept forever. Deleting an account empties its addresses at once, failed sign-ins with its email included. Independent of ",[24,3559,3523],{},": when that one is shorter, entries go before their addresses would.",[703,3562,3564],{"id":3563},"monitoring","Monitoring",[218,3566,3567,3581],{},[221,3568,3569],{},[224,3570,3571,3573,3575,3577,3579],{},[227,3572,437],{},[227,3574,440],{},[227,3576,443],{},[227,3578,124],{},[227,3580,448],{},[234,3582,3583,3605,3625],{},[224,3584,3585,3590,3592,3597,3602],{},[239,3586,3587],{},[24,3588,3589],{},"MONITORING__NODE_EXPORTER_URL",[239,3591,459],{},[239,3593,3594],{},[24,3595,3596],{},"http:\u002F\u002Fnode-exporter:9100\u002Fmetrics",[239,3598,3599],{},[24,3600,3601],{},"monitoring.nodeExporterUrl",[239,3603,3604],{},"node-exporter the RAM badge and the Monitoring panel read the host's memory from, live. Empty = badge off (the chart deploys no node-exporter).",[224,3606,3607,3612,3614,3618,3622],{},[239,3608,3609],{},[24,3610,3611],{},"MONITORING__TIMEOUT_SECONDS",[239,3613,1895],{},[239,3615,3616],{},[24,3617,2928],{},[239,3619,3620],{},[24,3621,132],{},[239,3623,3624],{},"Timeout of that read. Also adjustable in Administration → Settings.",[224,3626,3627,3632,3634,3638,3642],{},[239,3628,3629],{},[24,3630,3631],{},"MONITORING__CACHE_SECONDS",[239,3633,1895],{},[239,3635,3636],{},[24,3637,2928],{},[239,3639,3640],{},[24,3641,132],{},[239,3643,3644],{},"Seconds one read is shared by every open page. Also adjustable in Administration → Settings.",[703,3646,3648],{"id":3647},"worker-autoscaling-from-the-panel-kubernetes","Worker autoscaling from the panel (Kubernetes)",[14,3650,3651,3652,3655,3656,695,3659,115],{},"Lets an administrator change the minimum and maximum number of worker pods from Administration → Workers. Off unless ",[24,3653,3654],{},"KUBERNETES__SCALING"," is true; the chart sets the whole block, and a service account allowed to read the two worker Deployments and change their autoscalers, with ",[24,3657,3658],{},"adminScaling.enabled",[18,3660,140],{"href":113},[218,3662,3663,3677],{},[221,3664,3665],{},[224,3666,3667,3669,3671,3673,3675],{},[227,3668,437],{},[227,3670,440],{},[227,3672,443],{},[227,3674,124],{},[227,3676,448],{},[234,3678,3679,3698,3720,3741,3758,3779,3800,3824,3843,3868,3894,3912,3930,3954,3974,3995,4016,4035,4053],{},[224,3680,3681,3685,3687,3691,3695],{},[239,3682,3683],{},[24,3684,3654],{},[239,3686,1142],{},[239,3688,3689],{},[24,3690,73],{},[239,3692,3693],{},[24,3694,3658],{},[239,3696,3697],{},"Turns the panel's autoscaling bounds on.",[224,3699,3700,3705,3707,3711,3717],{},[239,3701,3702],{},[24,3703,3704],{},"KUBERNETES__CLUSTER_VIEW",[239,3706,1142],{},[239,3708,3709],{},[24,3710,73],{},[239,3712,3713,3716],{},[24,3714,3715],{},"clusterView.enabled"," (on by default)",[239,3718,3719],{},"Turns Administration → Cluster on: the pods of Tabularia and of its users' code, their state, CPU and memory (with metrics-server) and the warning events, read-only, for administrators and observers.",[224,3721,3722,3727,3729,3734,3738],{},[239,3723,3724],{},[24,3725,3726],{},"KUBERNETES__API_URL",[239,3728,459],{},[239,3730,3731],{},[24,3732,3733],{},"https:\u002F\u002Fkubernetes.default.svc",[239,3735,3736],{},[24,3737,132],{},[239,3739,3740],{},"Kubernetes API server, from inside the cluster.",[224,3742,3743,3748,3750,3752,3755],{},[239,3744,3745],{},[24,3746,3747],{},"KUBERNETES__NAMESPACE",[239,3749,459],{},[239,3751,595],{},[239,3753,3754],{},"set by the chart (the pod's namespace)",[239,3756,3757],{},"Namespace of the release's pods and Deployments. Empty = the pod's own, read from its service account.",[224,3759,3760,3765,3767,3772,3776],{},[239,3761,3762],{},[24,3763,3764],{},"KUBERNETES__TOKEN_FILE",[239,3766,459],{},[239,3768,3769],{},[24,3770,3771],{},"\u002Fvar\u002Frun\u002Fsecrets\u002Fkubernetes.io\u002Fserviceaccount\u002Ftoken",[239,3773,3774],{},[24,3775,132],{},[239,3777,3778],{},"Service-account token the gateway authenticates with.",[224,3780,3781,3786,3788,3793,3797],{},[239,3782,3783],{},[24,3784,3785],{},"KUBERNETES__CA_FILE",[239,3787,459],{},[239,3789,3790],{},[24,3791,3792],{},"\u002Fvar\u002Frun\u002Fsecrets\u002Fkubernetes.io\u002Fserviceaccount\u002Fca.crt",[239,3794,3795],{},[24,3796,132],{},[239,3798,3799],{},"Certificate authority of the API server.",[224,3801,3802,3807,3809,3814,3818],{},[239,3803,3804],{},[24,3805,3806],{},"KUBERNETES__NAMESPACE_FILE",[239,3808,459],{},[239,3810,3811],{},[24,3812,3813],{},"\u002Fvar\u002Frun\u002Fsecrets\u002Fkubernetes.io\u002Fserviceaccount\u002Fnamespace",[239,3815,3816],{},[24,3817,132],{},[239,3819,3820,3821,3823],{},"Where the pod's namespace is read when ",[24,3822,3747],{}," is empty.",[224,3825,3826,3831,3833,3835,3840],{},[239,3827,3828],{},[24,3829,3830],{},"KUBERNETES__RUN_WORKER_DEPLOYMENT",[239,3832,459],{},[239,3834,595],{},[239,3836,3837,3838],{},"set by the chart with ",[24,3839,3658],{},[239,3841,3842],{},"Deployment of the run workers.",[224,3844,3845,3850,3852,3854,3858],{},[239,3846,3847],{},[24,3848,3849],{},"KUBERNETES__RUN_WORKER_AUTOSCALER",[239,3851,459],{},[239,3853,595],{},[239,3855,3837,3856],{},[24,3857,3658],{},[239,3859,3860,3861,70,3864,3867],{},"Their autoscaler, ",[24,3862,3863],{},"hpa\u002F\u003Cname>",[24,3865,3866],{},"scaledobject\u002F\u003Cname>"," (KEDA). Empty = none.",[224,3869,3870,3875,3877,3881,3891],{},[239,3871,3872],{},[24,3873,3874],{},"KUBERNETES__RUN_WORKER_MAX_REPLICAS",[239,3876,1095],{},[239,3878,3879],{},[24,3880,1125],{},[239,3882,3883,3886,3887,3890],{},[24,3884,3885],{},"worker.autoscaling.panelMaxReplicas"," (or ",[24,3888,3889],{},"maxReplicas",")",[239,3892,3893],{},"The highest maximum of run-worker pods the panel may set.",[224,3895,3896,3901,3903,3905,3909],{},[239,3897,3898],{},[24,3899,3900],{},"KUBERNETES__PREVIEW_WORKER_DEPLOYMENT",[239,3902,459],{},[239,3904,595],{},[239,3906,3837,3907],{},[24,3908,3658],{},[239,3910,3911],{},"Deployment of the preview workers.",[224,3913,3914,3919,3921,3923,3927],{},[239,3915,3916],{},[24,3917,3918],{},"KUBERNETES__PREVIEW_WORKER_AUTOSCALER",[239,3920,459],{},[239,3922,595],{},[239,3924,3837,3925],{},[24,3926,3658],{},[239,3928,3929],{},"Their autoscaler, as for the run workers.",[224,3931,3932,3937,3939,3944,3951],{},[239,3933,3934],{},[24,3935,3936],{},"KUBERNETES__PREVIEW_WORKER_MAX_REPLICAS",[239,3938,1095],{},[239,3940,3941],{},[24,3942,3943],{},"8",[239,3945,3946,3886,3949,3890],{},[24,3947,3948],{},"previewWorker.autoscaling.panelMaxReplicas",[24,3950,3889],{},[239,3952,3953],{},"The highest maximum of preview-worker pods the panel may set.",[224,3955,3956,3961,3963,3967,3971],{},[239,3957,3958],{},[24,3959,3960],{},"KUBERNETES__TIMEOUT_SECONDS",[239,3962,2946],{},[239,3964,3965],{},[24,3966,1125],{},[239,3968,3969],{},[24,3970,132],{},[239,3972,3973],{},"Timeout of the calls to the Kubernetes API. Also adjustable in Administration → Settings.",[224,3975,3976,3981,3983,3987,3992],{},[239,3977,3978],{},[24,3979,3980],{},"KUBERNETES__ROLLOUT",[239,3982,1142],{},[239,3984,3985],{},[24,3986,73],{},[239,3988,3989,3716],{},[24,3990,3991],{},"settingsRollout.enabled",[239,3993,3994],{},"Administration → Settings restarts the pods that read a changed setting only when they start, one at a time, by eviction (docs\u002Fengine-settings.md). Off, it names the components to restart by hand.",[224,3996,3997,4002,4004,4006,4009],{},[239,3998,3999],{},[24,4000,4001],{},"KUBERNETES__RELEASE",[239,4003,459],{},[239,4005,595],{},[239,4007,4008],{},"set by the chart",[239,4010,4011,4012,4015],{},"The Helm release: Administration → Settings selects its pods by ",[24,4013,4014],{},"app.kubernetes.io\u002Finstance"," to restart them, and names it in the command it shows when it cannot.",[224,4017,4018,4023,4025,4027,4029],{},[239,4019,4020],{},[24,4021,4022],{},"KUBERNETES__APP_NAME",[239,4024,459],{},[239,4026,595],{},[239,4028,4008],{},[239,4030,3206,4031,4034],{},[24,4032,4033],{},"app.kubernetes.io\u002Fname"," of the release's pods, so that the rollout of Administration → Settings leaves alone the other charts of an umbrella release with components of the same names.",[224,4036,4037,4042,4044,4046,4050],{},[239,4038,4039],{},[24,4040,4041],{},"KUBERNETES_SERVICE_HOST",[239,4043,459],{},[239,4045,595],{},[239,4047,4048],{},[24,4049,132],{},[239,4051,4052],{},"Set by Kubernetes in every container, never by hand: the gateway knows from it that it runs in a cluster, also when no service account token is mounted.",[224,4054,4055,4060,4062,4064,4068],{},[239,4056,4057],{},[24,4058,4059],{},"HOSTNAME",[239,4061,459],{},[239,4063,595],{},[239,4065,4066],{},[24,4067,132],{},[239,4069,4070],{},"Set by the container runtime, never by hand: the pod's name, so that the orchestrator running a rollout of Administration → Settings evicts itself last.",[703,4072,4074],{"id":4073},"scripting-environments-kubernetes","Scripting environments (Kubernetes)",[14,4076,4077,4078,4081,4082,4085,4086,484,4088,155,4090,695,4092,115],{},"Administration → Scripting environments: the Python and R environments the Script node runs in, each built once into an image by a Kubernetes Job (rootless BuildKit) and checked by a second Job. Off unless ",[24,4079,4080],{},"SCRIPTS__ENABLED"," is true; the chart sets the whole block, the three namespaces and the service accounts of the gateway and the orchestrator allowed to run Jobs there (only the orchestrator's creates the builds), with ",[24,4083,4084],{},"scripts.enabled",". The Kubernetes API is reached as in ",[24,4087,3726],{},[24,4089,3764],{},[24,4091,3785],{},[18,4093,4095],{"href":4094},"\u002Fdocs\u002Fscripting","Scripting environments",[218,4097,4098,4112],{},[221,4099,4100],{},[224,4101,4102,4104,4106,4108,4110],{},[227,4103,437],{},[227,4105,440],{},[227,4107,443],{},[227,4109,124],{},[227,4111,448],{},[234,4113,4114,4133,4156,4185,4218,4245,4266,4289,4310,4333,4355,4386,4405,4427,4447,4467,4488,4510,4530,4552,4572],{},[224,4115,4116,4120,4122,4126,4130],{},[239,4117,4118],{},[24,4119,4080],{},[239,4121,1142],{},[239,4123,4124],{},[24,4125,73],{},[239,4127,4128],{},[24,4129,4084],{},[239,4131,4132],{},"Turns the scripting environments on: the admin section and the image builds.",[224,4134,4135,4140,4142,4144,4149],{},[239,4136,4137],{},[24,4138,4139],{},"SCRIPTS__NAMESPACE",[239,4141,459],{},[239,4143,595],{},[239,4145,4146],{},[24,4147,4148],{},"scripts.namespace",[239,4150,4151,4152,4155],{},"Namespace where the scripts and the image checks run (Pod Security level ",[24,4153,4154],{},"restricted"," is enough).",[224,4157,4158,4163,4165,4167,4180],{},[239,4159,4160],{},[24,4161,4162],{},"SCRIPTS__TRIAL_NAMESPACE",[239,4164,459],{},[239,4166,595],{},[239,4168,4169,4172,4173,4176,4177],{},[24,4170,4171],{},"scripts.trialNamespace"," (default ",[24,4174,4175],{},"\u003Cnamespace>-scripts-dev","), quota ",[24,4178,4179],{},"scripts.trialQuota",[239,4181,4182,4183,141],{},"Namespace where the editor's «Run» of a Script node runs, apart from the flows' runs and with a ResourceQuota of its own, so trials never take resources from scheduled flows. A trial that does not fit in the quota fails at once, saying so. Empty = ",[24,4184,4139],{},[224,4186,4187,4192,4194,4196,4201],{},[239,4188,4189],{},[24,4190,4191],{},"SCRIPTS__BUILD_NAMESPACE",[239,4193,459],{},[239,4195,595],{},[239,4197,4198],{},[24,4199,4200],{},"scripts.buildNamespace",[239,4202,4203,4204,4207,4208,4211,4212,4214,4215,4217],{},"Namespace where the image builds run. Rootless BuildKit needs its own user namespace (seccomp and AppArmor ",[24,4205,4206],{},"Unconfined","), which only the ",[24,4209,4210],{},"privileged"," Pod Security level admits; its pods still run as a user, without privileges. Empty = ",[24,4213,4139],{},", which must then be ",[24,4216,4210],{}," too: keep them apart.",[224,4219,4220,4225,4227,4229,4234],{},[239,4221,4222],{},[24,4223,4224],{},"SCRIPTS__REGISTRY",[239,4226,459],{},[239,4228,595],{},[239,4230,4231],{},[24,4232,4233],{},"scripts.registry.repository",[239,4235,4236,4237,4240,4241,4244],{},"Where the environment images are pushed, as ",[24,4238,4239],{},"host[:port]\u002Fpath",": an environment's image is ",[24,4242,4243],{},"\u003Cregistry>\u002Ftabularia-env-\u003Cid>:v\u003Cn>",". The cluster's nodes pull from it.",[224,4246,4247,4252,4254,4258,4263],{},[239,4248,4249],{},[24,4250,4251],{},"SCRIPTS__REGISTRY_INSECURE",[239,4253,1142],{},[239,4255,4256],{},[24,4257,73],{},[239,4259,4260],{},[24,4261,4262],{},"scripts.registry.insecure",[239,4264,4265],{},"The registry speaks plain HTTP or has a self-signed certificate. A test cluster only.",[224,4267,4268,4273,4275,4277,4282],{},[239,4269,4270],{},[24,4271,4272],{},"SCRIPTS__REGISTRY_PUSH_SECRET",[239,4274,459],{},[239,4276,595],{},[239,4278,4279],{},[24,4280,4281],{},"scripts.registry.pushSecret",[239,4283,4284,4285,4288],{},"Name of a Secret of type ",[24,4286,4287],{},"kubernetes.io\u002Fdockerconfigjson"," in the build namespace, used by the builds to push. Empty = a registry that takes pushes without credentials.",[224,4290,4291,4296,4298,4300,4305],{},[239,4292,4293],{},[24,4294,4295],{},"SCRIPTS__REGISTRY_PULL_SECRET",[239,4297,459],{},[239,4299,595],{},[239,4301,4302],{},[24,4303,4304],{},"scripts.registry.pullSecret",[239,4306,4284,4307,4309],{},[24,4308,4287],{}," in the scripts namespace, used by the Jobs to pull the images. Empty = the nodes pull without credentials.",[224,4311,4312,4317,4319,4321,4323],{},[239,4313,4314],{},[24,4315,4316],{},"SCRIPTS__REGISTRY_CA_CONFIGMAP",[239,4318,459],{},[239,4320,595],{},[239,4322,4008],{},[239,4324,4325,4326,4329,4330,141],{},"A ConfigMap of the build namespace holding ",[24,4327,4328],{},"ca.crt",": the certificate of the authority that signed the registry's, when it is not a public one (a company CA). The builds verify the registry with it. The chart creates it from ",[24,4331,4332],{},"scripts.registry.caCert",[224,4334,4335,4340,4342,4347,4352],{},[239,4336,4337],{},[24,4338,4339],{},"SCRIPTS__BUILDER_IMAGE",[239,4341,459],{},[239,4343,4344],{},[24,4345,4346],{},"moby\u002Fbuildkit:v0.33.1-rootless",[239,4348,4349],{},[24,4350,4351],{},"scripts.builderImage",[239,4353,4354],{},"The image that builds the environments: BuildKit, rootless. Replace it with a mirror on a cluster without internet access.",[224,4356,4357,4362,4364,4366,4371],{},[239,4358,4359],{},[24,4360,4361],{},"SCRIPTS__BASE_IMAGES",[239,4363,459],{},[239,4365,595],{},[239,4367,4368],{},[24,4369,4370],{},"scripts.baseImages",[239,4372,4373,4374,4377,4378,4381,4382,4385],{},"JSON: the language versions offered, and the image each starts from, e.g. ",[24,4375,4376],{},"{\"python\": {\"3.12\": \"python:3.12-slim\"}, \"r\": {\"4.5\": \"rocker\u002Fr-ver:4.5.3\"}}",". Empty = Python 3.11, 3.12, 3.13, 3.14 (",[24,4379,4380],{},"python:3.x-slim",") and R 4.5, 4.6 (",[24,4383,4384],{},"rocker\u002Fr-ver","). Pin them by digest, or point them at a mirror, here.",[224,4387,4388,4393,4395,4397,4402],{},[239,4389,4390],{},[24,4391,4392],{},"SCRIPTS__PYPI_INDEX_URL",[239,4394,459],{},[239,4396,595],{},[239,4398,4399],{},[24,4400,4401],{},"scripts.pypiIndexUrl",[239,4403,4404],{},"The Python package index the builds install from. Empty = PyPI.",[224,4406,4407,4412,4414,4419,4424],{},[239,4408,4409],{},[24,4410,4411],{},"SCRIPTS__CRAN_URL",[239,4413,459],{},[239,4415,4416],{},[24,4417,4418],{},"https:\u002F\u002Fcran.r-project.org",[239,4420,4421],{},[24,4422,4423],{},"scripts.cranUrl",[239,4425,4426],{},"The CRAN repository the R builds install from, and the one the scripts' R sees: CRAN itself or one of its mirrors. CRAN publishes sources, so R packages compile during the build; the images carry the system libraries the usual packages need.",[224,4428,4429,4434,4436,4440,4444],{},[239,4430,4431],{},[24,4432,4433],{},"SCRIPTS__BUILD_TIMEOUT_SECONDS",[239,4435,2515],{},[239,4437,4438],{},[24,4439,572],{},[239,4441,4442],{},[24,4443,132],{},[239,4445,4446],{},"The longest an image build may take before it fails. Also adjustable in Administration → Settings.",[224,4448,4449,4454,4456,4460,4464],{},[239,4450,4451],{},[24,4452,4453],{},"SCRIPTS__BUILD_CPU",[239,4455,459],{},[239,4457,4458],{},[24,4459,3059],{},[239,4461,4462],{},[24,4463,132],{},[239,4465,4466],{},"CPU an environment's image build may use. With SCRIPTS__BUILD_MEMORY it sets how many compilers run at once (one per core at most), which is what makes R packages built from CRAN's sources take minutes or tens of minutes. Also adjustable in Administration → Settings.",[224,4468,4469,4474,4476,4481,4485],{},[239,4470,4471],{},[24,4472,4473],{},"SCRIPTS__BUILD_MEMORY",[239,4475,459],{},[239,4477,4478],{},[24,4479,4480],{},"4Gi",[239,4482,4483],{},[24,4484,132],{},[239,4486,4487],{},"Memory an environment's image build requests and may use: it lands only on a node that has it. One compiler runs per 1.5 GiB (arrow's C++ takes over 1 GB each); a build that needs more fails alone, saying its compiler was killed. Raise it, with SCRIPTS__BUILD_CPU, to build R environments faster on large nodes. Also adjustable in Administration → Settings.",[224,4489,4490,4495,4498,4503,4507],{},[239,4491,4492],{},[24,4493,4494],{},"SCRIPTS__CHECK_TIMEOUT_SECONDS",[239,4496,4497],{},"integer, ≥ 30",[239,4499,4500],{},[24,4501,4502],{},"300",[239,4504,4505],{},[24,4506,132],{},[239,4508,4509],{},"The longest the check of a new image may take: pulling it on a node, starting it, listing its packages. Also adjustable in Administration → Settings.",[224,4511,4512,4517,4519,4523,4527],{},[239,4513,4514],{},[24,4515,4516],{},"SCRIPTS__POLL_SECONDS",[239,4518,2946],{},[239,4520,4521],{},[24,4522,280],{},[239,4524,4525],{},[24,4526,132],{},[239,4528,4529],{},"How often the orchestrators look at the builds in progress, and the longest wait between two looks at a Script node's Job (the first come sooner). Also adjustable in Administration → Settings.",[224,4531,4532,4537,4540,4545,4549],{},[239,4533,4534],{},[24,4535,4536],{},"SCRIPTS__LOG_MAX_BYTES",[239,4538,4539],{},"integer, ≥ 4096",[239,4541,4542],{},[24,4543,4544],{},"262144",[239,4546,4547],{},[24,4548,132],{},[239,4550,4551],{},"How much of the end of a build's log is kept and shown in the panel. Also adjustable in Administration → Settings.",[224,4553,4554,4559,4561,4565,4569],{},[239,4555,4556],{},[24,4557,4558],{},"SCRIPTS__JOB_TTL_SECONDS",[239,4560,2515],{},[239,4562,4563],{},[24,4564,572],{},[239,4566,4567],{},[24,4568,132],{},[239,4570,4571],{},"Kubernetes removes a finished Job after this long, if Tabularia has not removed it first. Also adjustable in Administration → Settings.",[224,4573,4574,4579,4581,4585,4589],{},[239,4575,4576],{},[24,4577,4578],{},"SCRIPTS__LINT",[239,4580,1142],{},[239,4582,4583],{},[24,4584,69],{},[239,4586,4587],{},[24,4588,132],{},[239,4590,4591],{},"The code editor underlines what Ruff finds in a Script node's Python code (undefined names, syntax errors, unused imports), and the imports the environment does not have, while it is typed. Each check runs Ruff in the gateway for a few milliseconds, at most twice a second per person. Also adjustable in Administration → Settings.",[703,4593,4595],{"id":4594},"container-registries-kubernetes","Container registries (Kubernetes)",[14,4597,4598,4599,4603,4604,4607,4608,141],{},"Administration → Container registries: the registries the images of the Container node come from, their credentials, how to trust their certificate and the repositories allowed (",[18,4600,4602],{"href":4601},"\u002Fdocs\u002Fcontainer-registries","Container registries","). Off unless ",[24,4605,4606],{},"CONTAINERS__ENABLED"," is true; the chart sets it with ",[24,4609,4610],{},"containers.enabled",[218,4612,4613,4627],{},[221,4614,4615],{},[224,4616,4617,4619,4621,4623,4625],{},[227,4618,437],{},[227,4620,440],{},[227,4622,443],{},[227,4624,124],{},[227,4626,448],{},[234,4628,4629,4650,4677,4699,4719,4739,4759,4783,4807,4830],{},[224,4630,4631,4635,4637,4641,4645],{},[239,4632,4633],{},[24,4634,4606],{},[239,4636,1142],{},[239,4638,4639],{},[24,4640,73],{},[239,4642,4643],{},[24,4644,4610],{},[239,4646,4647,4648,141],{},"Turns on Administration → Container registries: the registries the images of the Container node come from, on Kubernetes. The Helm chart sets it with ",[24,4649,4610],{},[224,4651,4652,4657,4659,4661,4663],{},[239,4653,4654],{},[24,4655,4656],{},"CONTAINERS__NAMESPACE",[239,4658,459],{},[239,4660,595],{},[239,4662,4008],{},[239,4664,4665,4666,484,4669,4672,4673,4676],{},"Where the flows' runs run the Container nodes, and where each registry's pull Secret is kept. The chart sets it (",[24,4667,4668],{},"containers.namespace",[24,4670,4671],{},"\u003Crelease namespace>-containers"," by default), at the ",[24,4674,4675],{},"baseline"," Pod Security level.",[224,4678,4679,4684,4686,4688,4690],{},[239,4680,4681],{},[24,4682,4683],{},"CONTAINERS__TRIAL_NAMESPACE",[239,4685,459],{},[239,4687,595],{},[239,4689,4008],{},[239,4691,4692,4693,4695,4696,115],{},"Where the editor's «Run» of a Container node and «Try in the cluster» run, with a ResourceQuota of its own. Empty = ",[24,4694,4656],{},". The chart sets it (",[24,4697,4698],{},"containers.trialNamespace",[224,4700,4701,4706,4708,4712,4716],{},[239,4702,4703],{},[24,4704,4705],{},"CONTAINERS__PULL_CHECK_SECONDS",[239,4707,4497],{},[239,4709,4710],{},[24,4711,4502],{},[239,4713,4714],{},[24,4715,132],{},[239,4717,4718],{},"«Try in the cluster»: how long a node may take to download an image before the check says it did not. The check answers within 270 s (the ingress cuts at 300 s): a longer download is said to be going on, and goes on in the cluster up to this. Also adjustable in Administration → Settings.",[224,4720,4721,4726,4728,4732,4736],{},[239,4722,4723],{},[24,4724,4725],{},"CONTAINERS__POLL_SECONDS",[239,4727,2946],{},[239,4729,4730],{},[24,4731,2928],{},[239,4733,4734],{},[24,4735,132],{},[239,4737,4738],{},"The longest wait between two looks at a Job of the containers' namespaces while the gateway waits for it (the first come sooner). Also adjustable in Administration → Settings.",[224,4740,4741,4746,4748,4752,4756],{},[239,4742,4743],{},[24,4744,4745],{},"CONTAINERS__JOB_TTL_SECONDS",[239,4747,2515],{},[239,4749,4750],{},[24,4751,572],{},[239,4753,4754],{},[24,4755,132],{},[239,4757,4758],{},"Kubernetes removes a finished Job of the containers' namespaces after this long, if Tabularia has not removed it first. Also adjustable in Administration → Settings.",[224,4760,4761,4766,4768,4773,4778],{},[239,4762,4763],{},[24,4764,4765],{},"CONTAINERS__MAX_CPU",[239,4767,459],{},[239,4769,4770],{},[24,4771,4772],{},"4",[239,4774,4775],{},[24,4776,4777],{},"containers.limits.cpu",[239,4779,4780,4781,684],{},"The most CPU a Container node may ask for (its request and its limit). The chart sets it (",[24,4782,4777],{},[224,4784,4785,4790,4792,4797,4802],{},[239,4786,4787],{},[24,4788,4789],{},"CONTAINERS__MAX_MEMORY",[239,4791,459],{},[239,4793,4794],{},[24,4795,4796],{},"16Gi",[239,4798,4799],{},[24,4800,4801],{},"containers.limits.memory",[239,4803,4804,4805,684],{},"The most memory a Container node may ask for (its request and its limit). The chart sets it (",[24,4806,4801],{},[224,4808,4809,4814,4816,4820,4825],{},[239,4810,4811],{},[24,4812,4813],{},"CONTAINERS__MAX_TIMEOUT_SECONDS",[239,4815,2515],{},[239,4817,4818],{},[24,4819,2520],{},[239,4821,4822],{},[24,4823,4824],{},"containers.limits.timeoutSeconds",[239,4826,4827,4828,684],{},"The longest timeout a Container node may have. The chart sets it (",[24,4829,4824],{},[224,4831,4832,4837,4839,4843,4847],{},[239,4833,4834],{},[24,4835,4836],{},"CONTAINERS__LOG_MAX_BYTES",[239,4838,4539],{},[239,4840,4841],{},[24,4842,4544],{},[239,4844,4845],{},[24,4846,132],{},[239,4848,4849],{},"How much of the end of a container's log the run keeps and the run page shows. Also adjustable in Administration → Settings.",[703,4851,4853],{"id":4852},"notebooks-kubernetes","Notebooks (Kubernetes)",[14,4855,4856,4857,4859,4860,141],{},"The marimo notebooks' pods: one per notebook being used, its app or its editor, in the scripts namespace with the image of the notebook's Python environment, started when someone opens it and stopped when nobody uses it. On with the scripting environments (",[24,4858,4080],{},"); the chart sets the gateway's address and these limits from ",[24,4861,4862],{},"scripts.notebooks",[218,4864,4865,4879],{},[221,4866,4867],{},[224,4868,4869,4871,4873,4875,4877],{},[227,4870,437],{},[227,4872,440],{},[227,4874,443],{},[227,4876,124],{},[227,4878,448],{},[234,4880,4881,4901,4920,4938,4962,4982,5001,5017,5045,5098,5121,5138],{},[224,4882,4883,4888,4891,4896,4898],{},[239,4884,4885],{},[24,4886,4887],{},"NOTEBOOKS__IDLE_MINUTES",[239,4889,4890],{},"integer, 1–1440",[239,4892,4893],{},[24,4894,4895],{},"15",[239,4897,4008],{},[239,4899,4900],{},"A notebook's pod nobody has used for this long is stopped (an open page keeps it alive); an editor's unsaved file becomes the notebook's draft first.",[224,4902,4903,4908,4911,4915,4917],{},[239,4904,4905],{},[24,4906,4907],{},"NOTEBOOKS__MAX_LIFETIME_HOURS",[239,4909,4910],{},"integer, 1–168",[239,4912,4913],{},[24,4914,2318],{},[239,4916,4008],{},[239,4918,4919],{},"The longest a notebook's pod lives, used or not; the next visit starts a new one.",[224,4921,4922,4927,4929,4933,4935],{},[239,4923,4924],{},[24,4925,4926],{},"NOTEBOOKS__MAX_LIVE",[239,4928,3173],{},[239,4930,4931],{},[24,4932,2972],{},[239,4934,4008],{},[239,4936,4937],{},"How many notebook pods may run at once, apps and editors together; past it, opening another one says so.",[224,4939,4940,4945,4947,4951,4956],{},[239,4941,4942],{},[24,4943,4944],{},"NOTEBOOKS__MAX_VISITORS_PER_APP",[239,4946,3173],{},[239,4948,4949],{},[24,4950,1125],{},[239,4952,4953],{},[24,4954,4955],{},"scripts.notebooks.maxVisitorsPerApp",[239,4957,4958,4959,584],{},"How many people may have a notebook's app open at once, unless the notebook sets its own number. marimo gives every visitor a kernel of their own, with their own copy of the data the code reads, all in the app's one pod: past the memory limit of the notebook's environment the pod stops for everyone. Past this number the app says it is full and opens by itself as soon as someone leaves. A visitor is an app open in a browser tab (marimo's WebSocket), counted across the gateway's replicas; the editor has no limit. Size it on the environment's memory limit divided by what one visitor's data takes. Never above ",[24,4960,4961],{},"NOTEBOOKS__MAX_VISITORS_CEILING",[224,4963,4964,4968,4970,4974,4979],{},[239,4965,4966],{},[24,4967,4961],{},[239,4969,3173],{},[239,4971,4972],{},[24,4973,2884],{},[239,4975,4976],{},[24,4977,4978],{},"scripts.notebooks.maxVisitorsCeiling",[239,4980,4981],{},"The most people at once a notebook may set for its own app (whoever may edit it sets it on the notebook's page). Lowering it below what a notebook chose caps that notebook too. Also adjustable in Administration → Settings.",[224,4983,4984,4989,4992,4996,4998],{},[239,4985,4986],{},[24,4987,4988],{},"NOTEBOOKS__START_TIMEOUT_SECONDS",[239,4990,4991],{},"integer, 30–3600",[239,4993,4994],{},[24,4995,4502],{},[239,4997,4008],{},[239,4999,5000],{},"A notebook's pod that has not answered after this long has failed to start, and says why (no node free, an image not downloaded).",[224,5002,5003,5008,5010,5012,5014],{},[239,5004,5005],{},[24,5006,5007],{},"NOTEBOOKS__GATEWAY_URL",[239,5009,459],{},[239,5011,595],{},[239,5013,4008],{},[239,5015,5016],{},"The gateway's address inside the cluster, which the notebooks' pods call to read datasources. The chart sets it to the gateway's Service; empty, a notebook cannot read datasources.",[224,5018,5019,5024,5026,5030,5032],{},[239,5020,5021],{},[24,5022,5023],{},"NOTEBOOKS__POD_IP_CHECK",[239,5025,1142],{},[239,5027,5028],{},[24,5029,69],{},[239,5031,4008],{},[239,5033,5034,5035,484,5038,484,5041,5044],{},"A notebook's token is honoured only when the call comes from its own pod's address, and never with a forwarding header (",[24,5036,5037],{},"X-Forwarded-For",[24,5039,5040],{},"Forwarded",[24,5042,5043],{},"X-Real-IP","): a token the notebook's code printed is useless anywhere else. Turn it off only where the gateway cannot see the pods' addresses, behind a service mesh's sidecars (Istio, Linkerd).",[224,5046,5047,5051,5053,5055,5064],{},[239,5048,5049],{},[24,5050,411],{},[239,5052,459],{},[239,5054,595],{},[239,5056,5057,5060,5061,3890],{},[24,5058,5059],{},"scripts.notebooks.host"," (with ",[24,5062,5063],{},"origin",[239,5065,5066,5068,5069,5072,5073,5076,5077,5080,5081,5083,5084,5086,5087,5090,5091,137,5094,141],{},[39,5067,474],{}," with notebooks, set it to a host name of their own next to the interface's, routed to the gateway: without it their apps and editors do not open. The address the notebooks' apps and editors are served from, an origin of their own such as ",[24,5070,5071],{},"https:\u002F\u002Fnotebooks.example.com",": marimo shows whatever HTML and JavaScript a notebook's code writes, and on the interface's address that code would act in Tabularia with the session of whoever opens the notebook. There the gateway answers only for the notebooks, and only with a cookie that Tabularia's page obtains for one notebook with a one-use ticket. A host other than the interface's, a sibling one best; ",[24,5074,5075],{},"https",", or ",[24,5078,5079],{},"http"," only for ",[24,5082,968],{}," and its subdomains; never in ",[24,5085,500],{},". The frontend needs the same value (",[24,5088,5089],{},"NUXT_PUBLIC_NOTEBOOKS_ORIGIN","). Empty: the apps and the editors do not open, unless ",[24,5092,5093],{},"NOTEBOOKS__ALLOW_SAME_ORIGIN",[18,5095,5097],{"href":5096},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks#an-address-of-their-own","An address of their own",[224,5099,5100,5104,5106,5110,5115],{},[239,5101,5102],{},[24,5103,5093],{},[239,5105,1142],{},[239,5107,5108],{},[24,5109,73],{},[239,5111,5112],{},[24,5113,5114],{},"scripts.notebooks.allowSameOrigin",[239,5116,5117,5118,5120],{},"Without ",[24,5119,411],{},", serve the notebooks' apps and editors on the interface's own address, as before: whoever may edit a notebook could then act in Tabularia as whoever opens it. Only to try notebooks alone on one machine, never where other people sign in; the pages show a warning while it is on.",[224,5122,5123,5128,5130,5132,5135],{},[239,5124,5125],{},[24,5126,5127],{},"TABULARIA_NOTEBOOK_TOKEN",[239,5129,459],{},[239,5131,595],{},[239,5133,5134],{},"set in the notebooks' pods",[239,5136,5137],{},"Not to set: the token of a notebook's session, which the gateway puts in the pod's Secret; it holds only on the notebooks' data endpoints, and only while the session lives.",[224,5139,5140,5145,5147,5149,5151],{},[239,5141,5142],{},[24,5143,5144],{},"TABULARIA_URL",[239,5146,459],{},[239,5148,595],{},[239,5150,5134],{},[239,5152,5153,5154,5156,5157,5159],{},"Not to set: the gateway gives it to every notebook's pod, from ",[24,5155,5007],{},"; the ",[24,5158,1012],{}," module in the pod reads datasources there.",[703,5161,5163],{"id":5162},"reports","Reports",[14,5165,5166,5167,5170],{},"Pixel-perfect reports: the gateway checks a report's definition at every save, reads its datasets with the rights of whoever opens it and fills its parameters in; the engine renders it, within the rows, pages, memory and time its own ",[24,5168,5169],{},"REPORTS__*"," allow.",[218,5172,5173,5187],{},[221,5174,5175],{},[224,5176,5177,5179,5181,5183,5185],{},[227,5178,437],{},[227,5180,440],{},[227,5182,443],{},[227,5184,124],{},[227,5186,448],{},[234,5188,5189],{},[224,5190,5191,5196,5199,5204,5208],{},[239,5192,5193],{},[24,5194,5195],{},"REPORTS__API_WAIT_SECONDS",[239,5197,5198],{},"integer, 5–3600",[239,5200,5201],{},[24,5202,5203],{},"120",[239,5205,5206],{},[24,5207,132],{},[239,5209,5210,5213],{},[24,5211,5212],{},"GET \u002Freports\u002F{id}\u002Frender",", the API: how long the request waits for the file before answering 504 and stopping the render. Keep the reverse proxy's read timeout above it (the chart's ingress allows 300 s).",[305,5215,266],{"id":5216},"engine-and-workers",[14,5218,5219,5220,484,5223,484,5226,155,5229,5232],{},"The data plane: in Compose the ",[24,5221,5222],{},"backend",[24,5224,5225],{},"worker",[24,5227,5228],{},"preview-worker",[24,5230,5231],{},"beat","\nservices; on Kubernetes the engine, the two worker Deployments and beat. Same image, same\nsettings: a variable that concerns only one role says so.",[703,5234,5236],{"id":5235},"engine-api-and-previews","Engine API and previews",[14,5238,5239,5240,5243],{},"The internal API the gateway calls (never exposed publicly). It hands previews to the ",[24,5241,5242],{},"preview"," queue and waits for the answer.",[14,5245,709,5246,712,5248,484,5250,141],{},[18,5247,244],{"href":243},[24,5249,500],{},[24,5251,370],{},[218,5253,5254,5268],{},[221,5255,5256],{},[224,5257,5258,5260,5262,5264,5266],{},[227,5259,437],{},[227,5261,440],{},[227,5263,443],{},[227,5265,124],{},[227,5267,448],{},[234,5269,5270,5290],{},[224,5271,5272,5276,5279,5283,5287],{},[239,5273,5274],{},[24,5275,898],{},[239,5277,5278],{},"integer, ≥ 40",[239,5280,5281],{},[24,5282,2295],{},[239,5284,5285],{},[24,5286,132],{},[239,5288,5289],{},"Synchronous requests the engine API serves at once. Every open preview holds a thread while it waits for a worker, so this is how many previews can be in flight; they sleep and cost little. Also adjustable in Administration → Settings, applied after a restart of the engine API.",[224,5291,5292,5297,5299,5303,5308],{},[239,5293,5294],{},[24,5295,5296],{},"PREVIEW_TIMEOUT_SECONDS",[239,5298,1895],{},[239,5300,5301],{},[24,5302,5203],{},[239,5304,5305],{},[24,5306,5307],{},"engine.previewTimeoutSeconds",[239,5309,5310],{},"Longest the engine API waits for a preview worker; then it revokes the job and answers 504. Keep any reverse proxy's read timeout above it. Also adjustable in Administration → Settings, applied after a restart of the engine API.",[703,5312,5314],{"id":5313},"broker-and-cache-index-valkey-or-redis","Broker and cache index (Valkey or Redis)",[218,5316,5317,5331],{},[221,5318,5319],{},[224,5320,5321,5323,5325,5327,5329],{},[227,5322,437],{},[227,5324,440],{},[227,5326,443],{},[227,5328,124],{},[227,5330,448],{},[234,5332,5333,5354,5376,5397],{},[224,5334,5335,5340,5342,5346,5351],{},[239,5336,5337],{},[24,5338,5339],{},"REDIS__HOST",[239,5341,459],{},[239,5343,5344],{},[24,5345,968],{},[239,5347,5348],{},[24,5349,5350],{},"externalServices.redis.host",[239,5352,5353],{},"Host of the Celery broker and of the step-cache index.",[224,5355,5356,5361,5363,5368,5373],{},[239,5357,5358],{},[24,5359,5360],{},"REDIS__PORT",[239,5362,567],{},[239,5364,5365],{},[24,5366,5367],{},"6379",[239,5369,5370],{},[24,5371,5372],{},"externalServices.redis.port",[239,5374,5375],{},"Its port.",[224,5377,5378,5383,5385,5389,5394],{},[239,5379,5380],{},[24,5381,5382],{},"REDIS__DB",[239,5384,567],{},[239,5386,5387],{},[24,5388,1407],{},[239,5390,5391],{},[24,5392,5393],{},"externalServices.redis.db",[239,5395,5396],{},"Database number.",[224,5398,5399,5404,5406,5408,5413],{},[239,5400,5401],{},[24,5402,5403],{},"REDIS__PASSWORD",[239,5405,459],{},[239,5407,595],{},[239,5409,5410],{},[24,5411,5412],{},"secrets.redisPassword",[239,5414,5415],{},"Password, when the broker requires one (managed services usually do).",[703,5417,5419],{"id":5418},"object-storage","Object storage",[14,5421,5422],{},"Any S3-compatible service: MinIO, AWS S3, Cloudflare R2, Backblaze B2, Scaleway, Google Cloud Storage through its S3 API (needed by the BigQuery engine). Every datasource snapshot, cached step and run output lives here.",[14,5424,709,5425,712,5427,141],{},[18,5426,244],{"href":243},[24,5428,534],{},[218,5430,5431,5445],{},[221,5432,5433],{},[224,5434,5435,5437,5439,5441,5443],{},[227,5436,437],{},[227,5438,440],{},[227,5440,443],{},[227,5442,124],{},[227,5444,448],{},[234,5446,5447,5470,5490,5516,5541,5564],{},[224,5448,5449,5453,5455,5457,5462],{},[239,5450,5451],{},[24,5452,323],{},[239,5454,459],{},[239,5456,184],{},[239,5458,5459],{},[24,5460,5461],{},"secrets.storageAccessKey",[239,5463,5464,5466,5467,5469],{},[39,5465,474],{}," use credentials of your own (",[24,5468,327],{}," is the development MinIO's). Access key of the storage.",[224,5471,5472,5476,5478,5480,5485],{},[239,5473,5474],{},[24,5475,333],{},[239,5477,459],{},[239,5479,184],{},[239,5481,5482],{},[24,5483,5484],{},"secrets.storageSecretKey",[239,5486,5487,5489],{},[39,5488,474],{}," use credentials of your own. Secret key of the storage.",[224,5491,5492,5496,5498,5502,5506],{},[239,5493,5494],{},[24,5495,45],{},[239,5497,459],{},[239,5499,5500],{},[24,5501,2046],{},[239,5503,5504],{},[24,5505,2051],{},[239,5507,5508,5509,5511,5512,5515],{},"Bucket of every snapshot, cached step and output. The gateway (",[24,5510,2039],{},") and the frontend (",[24,5513,5514],{},"NUXT_PUBLIC_BUCKET",") need the same name; the Compose file and the chart derive them from this one.",[224,5517,5518,5523,5525,5530,5535],{},[239,5519,5520],{},[24,5521,5522],{},"STORAGE__REGION",[239,5524,459],{},[239,5526,5527],{},[24,5528,5529],{},"us-east-1",[239,5531,5532],{},[24,5533,5534],{},"externalServices.storage.region",[239,5536,5537,5538,557],{},"Region of the storage (",[24,5539,5540],{},"auto",[224,5542,5543,5548,5550,5554,5558],{},[239,5544,5545],{},[24,5546,5547],{},"STORAGE__DIRECT_READ",[239,5549,1142],{},[239,5551,5552],{},[24,5553,69],{},[239,5555,5556],{},[24,5557,132],{},[239,5559,5560,5561,5563],{},"The DuckDB and chDB engines read sources and cached steps in place, only the columns and row groups a query needs. ",[24,5562,73],{},": download each file first, for a service that does not serve range reads.",[224,5565,5566,5571,5573,5579,5583],{},[239,5567,5568],{},[24,5569,5570],{},"DUCKDB_EXTENSION_DIRECTORY",[239,5572,459],{},[239,5574,5575,5576,3890],{},"empty (the image sets ",[24,5577,5578],{},"\u002Fopt\u002Fduckdb-extensions",[239,5580,5581],{},[24,5582,132],{},[239,5584,5585,5586,5589],{},"Where DuckDB finds its extensions (",[24,5587,5588],{},"httpfs",", for reading the storage in place). The image sets it to the extensions it ships, so nothing is downloaded at runtime.",[703,5591,5593],{"id":5592},"where-the-database-backups-go","Where the database backups go",[14,5595,5596,5597,5599],{},"The gateway makes the backups of its database (see ",[95,5598,3073],{}," above); the engine stores them, since it holds the storage credentials. Every field left empty falls back to the object storage's.",[218,5601,5602,5616],{},[221,5603,5604],{},[224,5605,5606,5608,5610,5612,5614],{},[227,5607,437],{},[227,5609,440],{},[227,5611,443],{},[227,5613,124],{},[227,5615,448],{},[234,5617,5618,5640,5665,5686,5710,5734],{},[224,5619,5620,5625,5627,5629,5634],{},[239,5621,5622],{},[24,5623,5624],{},"BACKUP__BUCKET",[239,5626,459],{},[239,5628,595],{},[239,5630,5631],{},[24,5632,5633],{},"backup.bucket",[239,5635,5636,5637,5639],{},"The bucket of the backups; empty = ",[24,5638,45],{},". A bucket of their own is advised in production, so that losing one does not lose both.",[224,5641,5642,5647,5649,5653,5658],{},[239,5643,5644],{},[24,5645,5646],{},"BACKUP__PREFIX",[239,5648,459],{},[239,5650,5651],{},[24,5652,3093],{},[239,5654,5655],{},[24,5656,5657],{},"backup.prefix",[239,5659,5660,5661,5664],{},"The folder of the backups in the bucket. Only files named like a backup (",[24,5662,5663],{},"tabularia-\u003Ctime>.dump",") are listed, downloaded or removed there.",[224,5666,5667,5672,5674,5676,5681],{},[239,5668,5669],{},[24,5670,5671],{},"BACKUP__ENDPOINT",[239,5673,459],{},[239,5675,595],{},[239,5677,5678],{},[24,5679,5680],{},"backup.endpoint",[239,5682,5683,5684,141],{},"Another object storage for the backups; empty = ",[24,5685,534],{},[224,5687,5688,5693,5695,5697,5702],{},[239,5689,5690],{},[24,5691,5692],{},"BACKUP__REGION",[239,5694,459],{},[239,5696,595],{},[239,5698,5699],{},[24,5700,5701],{},"backup.region",[239,5703,5704,5705,5707,5708,141],{},"The region of ",[24,5706,5671],{},"; empty = ",[24,5709,5522],{},[224,5711,5712,5717,5719,5721,5726],{},[239,5713,5714],{},[24,5715,5716],{},"BACKUP__ACCESS_KEY",[239,5718,459],{},[239,5720,595],{},[239,5722,5723],{},[24,5724,5725],{},"secrets.backupAccessKey",[239,5727,5728,5729,155,5731,5733],{},"Keys of the backups' bucket when they are not the storage's; empty = ",[24,5730,323],{},[24,5732,333],{},". Read by the engine only: the chart keeps them out of the gateway.",[224,5735,5736,5741,5743,5745,5750],{},[239,5737,5738],{},[24,5739,5740],{},"BACKUP__SECRET_KEY",[239,5742,459],{},[239,5744,595],{},[239,5746,5747],{},[24,5748,5749],{},"secrets.backupSecretKey",[239,5751,5752,5753,141],{},"The secret of ",[24,5754,5716],{},[703,5756,5758],{"id":5757},"workers-and-task-limits-celery","Workers and task limits (Celery)",[14,5760,5761,5762,5764,5765,5768,5769,5771],{},"How long a run may take is decided by three coupled values: ",[24,5763,564],{}," (the worker kills the task), ",[24,5766,5767],{},"CELERY__TASK_SOFT_TIME_LIMIT"," (the task is told to stop shortly before) and the gateway's ",[24,5770,583],{}," (the gateway declares a silent run lost), which must stay above the hard limit. To allow longer runs, raise the hard limit and the stale timeout together.",[14,5773,709,5774,712,5776,141],{},[18,5775,244],{"href":243},[24,5777,564],{},[218,5779,5780,5794],{},[221,5781,5782],{},[224,5783,5784,5786,5788,5790,5792],{},[227,5785,437],{},[227,5787,440],{},[227,5789,443],{},[227,5791,124],{},[227,5793,448],{},[234,5795,5796,5817,5837,5864,5887,5908,5928,5948,5968,5988,6010,6030,6051,6072,6095],{},[224,5797,5798,5803,5805,5807,5811],{},[239,5799,5800],{},[24,5801,5802],{},"CELERY__BROKER_URL",[239,5804,459],{},[239,5806,595],{},[239,5808,5809],{},[24,5810,132],{},[239,5812,5813,5814,141],{},"Broker URL, to put the queue somewhere else entirely. Empty = built from ",[24,5815,5816],{},"REDIS__*",[224,5818,5819,5824,5826,5828,5832],{},[239,5820,5821],{},[24,5822,5823],{},"CELERY__RESULT_BACKEND",[239,5825,459],{},[239,5827,595],{},[239,5829,5830],{},[24,5831,132],{},[239,5833,5834,5835,141],{},"Result store, likewise. Empty = built from ",[24,5836,5816],{},[224,5838,5839,5843,5845,5849,5857],{},[239,5840,5841],{},[24,5842,3069],{},[239,5844,567],{},[239,5846,5847],{},[24,5848,3059],{},[239,5850,5851,484,5854],{},[24,5852,5853],{},"worker.concurrency",[24,5855,5856],{},"previewWorker.concurrency",[239,5858,5859,5860,5863],{},"Processes per worker container (each runs one task at a time). The preview workers have their own value (",[24,5861,5862],{},"PREVIEW_WORKER_CONCURRENCY"," in Compose).",[224,5865,5866,5870,5872,5877,5882],{},[239,5867,5868],{},[24,5869,5767],{},[239,5871,567],{},[239,5873,5874],{},[24,5875,5876],{},"3300",[239,5878,5879],{},[24,5880,5881],{},"engine.taskSoftTimeLimitSeconds",[239,5883,5884,5885,584],{},"Seconds after which a task is told to stop, so it can close files and connections and report the failure before the hard limit. Keep it below ",[24,5886,564],{},[224,5888,5889,5894,5896,5901,5905],{},[239,5890,5891],{},[24,5892,5893],{},"CELERY__TASK_SERIALIZER",[239,5895,459],{},[239,5897,5898],{},[24,5899,5900],{},"json",[239,5902,5903],{},[24,5904,132],{},[239,5906,5907],{},"Format of the task messages. JSON is a security property (no pickled objects): leave it.",[224,5909,5910,5915,5917,5921,5925],{},[239,5911,5912],{},[24,5913,5914],{},"CELERY__RESULT_SERIALIZER",[239,5916,459],{},[239,5918,5919],{},[24,5920,5900],{},[239,5922,5923],{},[24,5924,132],{},[239,5926,5927],{},"Format of the results. Leave it.",[224,5929,5930,5935,5937,5941,5945],{},[239,5931,5932],{},[24,5933,5934],{},"CELERY__TIMEZONE",[239,5936,459],{},[239,5938,5939],{},[24,5940,917],{},[239,5942,5943],{},[24,5944,132],{},[239,5946,5947],{},"Clock of beat's periodic tasks. Leave it on UTC: the gateway converts schedules to UTC before queuing them.",[224,5949,5950,5955,5957,5961,5965],{},[239,5951,5952],{},[24,5953,5954],{},"CELERY__ENABLE_UTC",[239,5956,1142],{},[239,5958,5959],{},[24,5960,69],{},[239,5962,5963],{},[24,5964,132],{},[239,5966,5967],{},"Celery's own UTC switch. Leave it.",[224,5969,5970,5975,5977,5981,5985],{},[239,5971,5972],{},[24,5973,5974],{},"CELERY__MAX_TASKS_PER_CHILD",[239,5976,567],{},[239,5978,5979],{},[24,5980,2884],{},[239,5982,5983],{},[24,5984,132],{},[239,5986,5987],{},"A worker process is replaced after this many tasks, so memory the allocator keeps does not pile up. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,5989,5990,5995,5997,5999,6003],{},[239,5991,5992],{},[24,5993,5994],{},"CELERY__MAX_MEMORY_PER_CHILD_KB",[239,5996,567],{},[239,5998,595],{},[239,6000,6001],{},[24,6002,132],{},[239,6004,6005,6006,6009],{},"Resident memory (KB) past which a worker process is replaced at the end of its task. Empty = worked out from the container's memory limit × ",[24,6007,6008],{},"CELERY__MAX_MEMORY_HEADROOM_FRAC"," ÷ concurrency, never below the floor: set it only to force a fixed value. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6011,6012,6016,6018,6023,6027],{},[239,6013,6014],{},[24,6015,6008],{},[239,6017,1895],{},[239,6019,6020],{},[24,6021,6022],{},"0.75",[239,6024,6025],{},[24,6026,132],{},[239,6028,6029],{},"Share of the container's memory limit given to the worker processes; the rest is margin for the main process and the page cache. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6031,6032,6037,6039,6044,6048],{},[239,6033,6034],{},[24,6035,6036],{},"CELERY__MAX_MEMORY_PER_CHILD_FALLBACK_KB",[239,6038,567],{},[239,6040,6041],{},[24,6042,6043],{},"1500000",[239,6045,6046],{},[24,6047,132],{},[239,6049,6050],{},"The cap used when the container has no readable memory limit. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6052,6053,6058,6060,6065,6069],{},[239,6054,6055],{},[24,6056,6057],{},"CELERY__MAX_MEMORY_PER_CHILD_FLOOR_KB",[239,6059,567],{},[239,6061,6062],{},[24,6063,6064],{},"512000",[239,6066,6067],{},[24,6068,132],{},[239,6070,6071],{},"The cap is never below this, so processes are not replaced too often. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6073,6074,6079,6081,6085,6089],{},[239,6075,6076],{},[24,6077,6078],{},"WORKERS__RUN_CONCURRENCY",[239,6080,567],{},[239,6082,6083],{},[24,6084,1407],{},[239,6086,6087],{},[24,6088,132],{},[239,6090,6091,6092,6094],{},"Processes per run-worker container, resized within seconds without stopping running tasks. 0 = keep ",[24,6093,3069],{},". Also adjustable in Administration → Workers.",[224,6096,6097,6102,6104,6108,6112],{},[239,6098,6099],{},[24,6100,6101],{},"WORKERS__PREVIEW_CONCURRENCY",[239,6103,567],{},[239,6105,6106],{},[24,6107,1407],{},[239,6109,6110],{},[24,6111,132],{},[239,6113,6114],{},"The same for the preview workers. Also adjustable in Administration → Workers.",[703,6116,6118],{"id":6117},"step-cache-and-metrics","Step cache and metrics",[14,6120,6121],{},"The editor keeps the output of intermediate steps, so the next preview starts from there instead of from the source.",[218,6123,6124,6138],{},[221,6125,6126],{},[224,6127,6128,6130,6132,6134,6136],{},[227,6129,437],{},[227,6131,440],{},[227,6133,443],{},[227,6135,124],{},[227,6137,448],{},[234,6139,6140,6161,6182,6203],{},[224,6141,6142,6147,6149,6153,6158],{},[239,6143,6144],{},[24,6145,6146],{},"CACHE__TTL_SECONDS",[239,6148,567],{},[239,6150,6151],{},[24,6152,2520],{},[239,6154,6155],{},[24,6156,6157],{},"cache.ttlSeconds",[239,6159,6160],{},"A cached step unused for this long is deleted (its parquet and its index entry). Also adjustable in Administration → Settings.",[224,6162,6163,6168,6170,6174,6179],{},[239,6164,6165],{},[24,6166,6167],{},"CACHE__SWEEP_INTERVAL_SECONDS",[239,6169,567],{},[239,6171,6172],{},[24,6173,572],{},[239,6175,6176],{},[24,6177,6178],{},"cache.sweepIntervalSeconds",[239,6180,6181],{},"How often the cache is swept. Also adjustable in Administration → Settings, applied after a restart of the scheduler (beat).",[224,6183,6184,6189,6191,6196,6200],{},[239,6185,6186],{},[24,6187,6188],{},"CACHE__MAX_STEP_ROWS",[239,6190,567],{},[239,6192,6193],{},[24,6194,6195],{},"1000000",[239,6197,6198],{},[24,6199,132],{},[239,6201,6202],{},"Steps with more rows are not cached: a copy as large as the source saves nothing over re-reading it and costs gigabytes of writes. 0 = no cap. Also adjustable in Administration → Settings.",[224,6204,6205,6210,6212,6216,6220],{},[239,6206,6207],{},[24,6208,6209],{},"METRICS__STORAGE_STATS_INTERVAL_SECONDS",[239,6211,567],{},[239,6213,6214],{},[24,6215,2364],{},[239,6217,6218],{},[24,6219,132],{},[239,6221,6222],{},"How often the size of the storage prefixes is measured and published as a metric. Also adjustable in Administration → Settings, applied after a restart of the scheduler (beat).",[703,6224,6226],{"id":6225},"embedded-engines-chdb-duckdb-polars","Embedded engines (chDB, DuckDB, Polars)",[14,6228,6229,6230,141],{},"The engines that run inside the worker process. See ",[18,6231,6233],{"href":6232},"\u002Fdocs\u002Fengines\u002Fengine-differences","engine differences",[218,6235,6236,6250],{},[221,6237,6238],{},[224,6239,6240,6242,6244,6246,6248],{},[227,6241,437],{},[227,6243,440],{},[227,6245,443],{},[227,6247,124],{},[227,6249,448],{},[234,6251,6252,6283,6304,6325,6347,6367],{},[224,6253,6254,6259,6261,6263,6268],{},[239,6255,6256],{},[24,6257,6258],{},"TMP_SIZE_LIMIT",[239,6260,459],{},[239,6262,595],{},[239,6264,6265],{},[24,6266,6267],{},"engineApi.tmpSizeLimit",[239,6269,6270,6271,6274,6275,6278,6279,6282],{},"Set by the Helm chart on the workers and the engine: the ",[24,6272,6273],{},"sizeLimit"," of their ",[24,6276,6277],{},"\u002Ftmp"," (an emptyDir), a Kubernetes quantity (",[24,6280,6281],{},"50Gi","). Past it the kubelet evicts the pod at once, so DuckDB spills at most half of it, shared by the worker's processes, and a query that needs more fails saying so. Unset (Compose): DuckDB's own cap, most of the free disk.",[224,6284,6285,6290,6292,6297,6301],{},[239,6286,6287],{},[24,6288,6289],{},"ENGINE_MAX_CROSS_JOIN_ROWS",[239,6291,567],{},[239,6293,6294],{},[24,6295,6296],{},"50000000",[239,6298,6299],{},[24,6300,132],{},[239,6302,6303],{},"Rows a cross join may produce in a run before it is refused with a clear error instead of exhausting memory. 0 = no cap. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6305,6306,6311,6313,6318,6322],{},[239,6307,6308],{},[24,6309,6310],{},"CHDB_MAX_MEMORY_USAGE",[239,6312,567],{},[239,6314,6315],{},[24,6316,6317],{},"1500000000",[239,6319,6320],{},[24,6321,132],{},[239,6323,6324],{},"Memory budget of the embedded chDB engine, in bytes; keep it under the worker's per-process cap. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6326,6327,6332,6334,6340,6344],{},[239,6328,6329],{},[24,6330,6331],{},"CHDB_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY",[239,6333,567],{},[239,6335,6336,6339],{},[24,6337,6338],{},"536870912"," (512 MiB)",[239,6341,6342],{},[24,6343,132],{},[239,6345,6346],{},"Past this, a chDB GROUP BY spills to disk. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6348,6349,6354,6356,6360,6364],{},[239,6350,6351],{},[24,6352,6353],{},"CHDB_MAX_BYTES_BEFORE_EXTERNAL_SORT",[239,6355,567],{},[239,6357,6358,6339],{},[24,6359,6338],{},[239,6361,6362],{},[24,6363,132],{},[239,6365,6366],{},"Past this, a chDB ORDER BY spills to disk. Also adjustable in Administration → Settings, applied after a restart of the workers.",[224,6368,6369,6374,6376,6380,6384],{},[239,6370,6371],{},[24,6372,6373],{},"CHDB_MAX_BYTES_IN_JOIN",[239,6375,567],{},[239,6377,6378,6339],{},[24,6379,6338],{},[239,6381,6382],{},[24,6383,132],{},[239,6385,6386],{},"Past this, a chDB join fails instead of growing. Also adjustable in Administration → Settings, applied after a restart of the workers.",[703,6388,6390],{"id":6389},"external-clickhouse-engine","External ClickHouse engine",[14,6392,6393,6394,6397,6398,6401,6402,141],{},"Optional: flows run on a remote ClickHouse server (managed or self-hosted) instead of in the worker. Off while ",[24,6395,6396],{},"CLICKHOUSE_EXTERNAL__HOST"," is empty. Use the HTTP(S) port (8123 \u002F 8443), not the native one. The connection can also be set, or changed, by an administrator in ",[39,6399,6400],{},"Administration → Settings → ClickHouse connection",", which overrides these variables (they stay the starting values) and has a connection test: see ",[18,6403,6405],{"href":6404},"\u002Fdocs\u002Fengine-settings#the-clickhouse-connection","the guide",[218,6407,6408,6422],{},[221,6409,6410],{},[224,6411,6412,6414,6416,6418,6420],{},[227,6413,437],{},[227,6415,440],{},[227,6417,443],{},[227,6419,124],{},[227,6421,448],{},[234,6423,6424,6442,6464,6486,6505,6527,6545,6570,6591,6612,6645,6673,6695,6718,6741,6760,6782],{},[224,6425,6426,6430,6432,6434,6439],{},[239,6427,6428],{},[24,6429,6396],{},[239,6431,459],{},[239,6433,595],{},[239,6435,6436],{},[24,6437,6438],{},"externalServices.clickhouse.host",[239,6440,6441],{},"Server host. Empty = engine off. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6443,6444,6449,6451,6456,6461],{},[239,6445,6446],{},[24,6447,6448],{},"CLICKHOUSE_EXTERNAL__PORT",[239,6450,567],{},[239,6452,6453],{},[24,6454,6455],{},"8123",[239,6457,6458],{},[24,6459,6460],{},"externalServices.clickhouse.port",[239,6462,6463],{},"HTTP(S) port: 8123 plain, 8443 TLS. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6465,6466,6471,6473,6478,6483],{},[239,6467,6468],{},[24,6469,6470],{},"CLICKHOUSE_EXTERNAL__USERNAME",[239,6472,459],{},[239,6474,6475],{},[24,6476,6477],{},"default",[239,6479,6480],{},[24,6481,6482],{},"externalServices.clickhouse.username",[239,6484,6485],{},"User the engine works as. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6487,6488,6493,6495,6497,6502],{},[239,6489,6490],{},[24,6491,6492],{},"CLICKHOUSE_EXTERNAL__PASSWORD",[239,6494,459],{},[239,6496,595],{},[239,6498,6499],{},[24,6500,6501],{},"secrets.clickhousePassword",[239,6503,6504],{},"Its password. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6506,6507,6512,6514,6516,6521],{},[239,6508,6509],{},[24,6510,6511],{},"CLICKHOUSE_EXTERNAL__AI_USERNAME",[239,6513,459],{},[239,6515,595],{},[239,6517,6518],{},[24,6519,6520],{},"externalServices.clickhouse.aiUsername",[239,6522,6523,6524,6526],{},"A dedicated read-only user for the AI assistant's queries, a second barrier behind the SQL allow-list. Used only when both it and its password are set; otherwise the assistant runs as the user above. Grants: ",[18,6525,2152],{"href":2151},". Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6528,6529,6534,6536,6538,6543],{},[239,6530,6531],{},[24,6532,6533],{},"CLICKHOUSE_EXTERNAL__AI_PASSWORD",[239,6535,459],{},[239,6537,595],{},[239,6539,6540],{},[24,6541,6542],{},"secrets.clickhouseAiPassword",[239,6544,6504],{},[224,6546,6547,6552,6554,6558,6563],{},[239,6548,6549],{},[24,6550,6551],{},"CLICKHOUSE_EXTERNAL__DATABASE",[239,6553,459],{},[239,6555,6556],{},[24,6557,6477],{},[239,6559,6560],{},[24,6561,6562],{},"externalServices.clickhouse.database",[239,6564,6565,6566,6569],{},"Working database; it must exist. In ",[24,6567,6568],{},"push"," mode it holds the staging tables (the user needs CREATE, INSERT and DROP on it). Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6571,6572,6577,6579,6583,6588],{},[239,6573,6574],{},[24,6575,6576],{},"CLICKHOUSE_EXTERNAL__SECURE",[239,6578,1142],{},[239,6580,6581],{},[24,6582,73],{},[239,6584,6585],{},[24,6586,6587],{},"externalServices.clickhouse.secure",[239,6589,6590],{},"TLS; managed services require it (port 8443). Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6592,6593,6598,6600,6604,6609],{},[239,6594,6595],{},[24,6596,6597],{},"CLICKHOUSE_EXTERNAL__CONNECT_TIMEOUT",[239,6599,567],{},[239,6601,6602],{},[24,6603,1125],{},[239,6605,6606],{},[24,6607,6608],{},"externalServices.clickhouse.connectTimeout",[239,6610,6611],{},"Seconds to wait for the handshake. Also adjustable in Administration → Settings.",[224,6613,6614,6619,6627,6631,6636],{},[239,6615,6616],{},[24,6617,6618],{},"CLICKHOUSE_EXTERNAL__TRANSPORT",[239,6620,6621,6622,70,6625],{},"string; ",[24,6623,6624],{},"s3",[24,6626,6568],{},[239,6628,6629],{},[24,6630,6624],{},[239,6632,6633],{},[24,6634,6635],{},"externalServices.clickhouse.transport",[239,6637,6638,6639,6641,6642,6644],{},"How the server reaches the data. ",[24,6640,6624],{},": ClickHouse reads and writes the parquet files directly on the storage, nothing passes through the worker (the storage must be reachable from the server). ",[24,6643,6568],{},": the worker uploads the source into a staging table and streams the result back; works with any server. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6646,6647,6651,6653,6655,6660],{},[239,6648,6649],{},[24,6650,57],{},[239,6652,459],{},[239,6654,595],{},[239,6656,6657],{},[24,6658,6659],{},"externalServices.clickhouse.s3Endpoint",[239,6661,6662,6663,6665,6666,6669,6670,6672],{},"The storage endpoint as the server sees it (",[24,6664,6624],{}," mode), e.g. ",[24,6667,6668],{},"https:\u002F\u002Fs3.fr-par.scw.cloud",". Empty = ",[24,6671,534],{},", right only when the server is on the same network. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6674,6675,6680,6682,6684,6689],{},[239,6676,6677],{},[24,6678,6679],{},"CLICKHOUSE_EXTERNAL__S3_NAMED_COLLECTION",[239,6681,459],{},[239,6683,595],{},[239,6685,6686],{},[24,6687,6688],{},"externalServices.clickhouse.s3NamedCollection",[239,6690,6691,6692,6526],{},"A named collection created on the server with the storage credentials, so the keys never travel in queries nor reach the ",[24,6693,6694],{},"query_log",[224,6696,6697,6702,6704,6708,6713],{},[239,6698,6699],{},[24,6700,6701],{},"CLICKHOUSE_EXTERNAL__MAX_EXECUTION_TIME",[239,6703,567],{},[239,6705,6706],{},[24,6707,1407],{},[239,6709,6710],{},[24,6711,6712],{},"externalServices.clickhouse.maxExecutionTime",[239,6714,6715,6716,684],{},"Per-query execution cap in seconds. 0 = none (previews are still bounded by ",[24,6717,5296],{},[224,6719,6720,6725,6727,6731,6736],{},[239,6721,6722],{},[24,6723,6724],{},"CLICKHOUSE_EXTERNAL__MATERIALIZE_MIN_ROWS",[239,6726,567],{},[239,6728,6729],{},[24,6730,1407],{},[239,6732,6733],{},[24,6734,6735],{},"externalServices.clickhouse.materializeMinRows",[239,6737,6738,6740],{},[24,6739,6624],{}," mode: a dataset the viewer reads with more rows than this is copied once into a MergeTree table on the server, 2–6× faster on full scans. 0 = off: the copy is built inside the request and, with large row groups, direct reads are already fast. Also adjustable in Administration → Settings.",[224,6742,6743,6748,6750,6752,6757],{},[239,6744,6745],{},[24,6746,6747],{},"CLICKHOUSE_EXTERNAL__MATERIALIZE_DATABASE",[239,6749,459],{},[239,6751,595],{},[239,6753,6754],{},[24,6755,6756],{},"externalServices.clickhouse.materializeDatabase",[239,6758,6759],{},"Database of those copies. Empty = the working database. Also adjustable in Administration → Settings, applied after a restart of the engine API and workers and scheduler (beat).",[224,6761,6762,6767,6769,6774,6779],{},[239,6763,6764],{},[24,6765,6766],{},"CLICKHOUSE_EXTERNAL__MATERIALIZE_TTL_SECONDS",[239,6768,567],{},[239,6770,6771],{},[24,6772,6773],{},"1800",[239,6775,6776],{},[24,6777,6778],{},"externalServices.clickhouse.materializeTtlSeconds",[239,6780,6781],{},"A copy unused for this long is dropped. Also adjustable in Administration → Settings.",[224,6783,6784,6789,6791,6795,6800],{},[239,6785,6786],{},[24,6787,6788],{},"CLICKHOUSE_EXTERNAL__PARQUET_SCAN_MAX_THREADS",[239,6790,567],{},[239,6792,6793],{},[24,6794,3943],{},[239,6796,6797],{},[24,6798,6799],{},"externalServices.clickhouse.parquetScanMaxThreads",[239,6801,6802,6803,6806],{},"On scans (aggregations, pivots, sorts, joins) the engine asks for at least this many threads, to hide the latency of reading from S3; never on LIMIT queries, never below the server's cores. 0 = leave ",[24,6804,6805],{},"max_threads"," alone. Also adjustable in Administration → Settings.",[703,6808,6810],{"id":6809},"bigquery-engine","BigQuery engine",[14,6812,6813,6814,6816,6817,6820,6821,6824],{},"Optional: flows run on Google BigQuery, which reads the parquet files from the bucket as temporary external tables, so ",[24,6815,534],{}," must be Google Cloud Storage (",[24,6818,6819],{},"https:\u002F\u002Fstorage.googleapis.com",", HMAC keys). The service account needs ",[95,6822,6823],{},"BigQuery Job User"," on the project and read access to the bucket. Off while the project or the credentials are empty.",[218,6826,6827,6841],{},[221,6828,6829],{},[224,6830,6831,6833,6835,6837,6839],{},[227,6832,437],{},[227,6834,440],{},[227,6836,443],{},[227,6838,124],{},[227,6840,448],{},[234,6842,6843,6862,6883,6904,6927,6950],{},[224,6844,6845,6850,6852,6854,6859],{},[239,6846,6847],{},[24,6848,6849],{},"BIGQUERY__PROJECT",[239,6851,459],{},[239,6853,595],{},[239,6855,6856],{},[24,6857,6858],{},"externalServices.bigquery.project",[239,6860,6861],{},"Google Cloud project the jobs run in. Empty = engine off.",[224,6863,6864,6869,6871,6873,6877],{},[239,6865,6866],{},[24,6867,6868],{},"BIGQUERY__CREDENTIALS_FILE",[239,6870,459],{},[239,6872,595],{},[239,6874,6875],{},[24,6876,132],{},[239,6878,6879,6880,141],{},"Path, inside the container, of the service account's JSON key. Either this or ",[24,6881,6882],{},"BIGQUERY__CREDENTIALS_B64",[224,6884,6885,6889,6891,6893,6898],{},[239,6886,6887],{},[24,6888,6882],{},[239,6890,459],{},[239,6892,595],{},[239,6894,6895],{},[24,6896,6897],{},"secrets.bigqueryCredentialsB64",[239,6899,6900,6901,115],{},"The same key in base64 on one line (",[24,6902,6903],{},"base64 -w0 key.json",[224,6905,6906,6911,6913,6915,6920],{},[239,6907,6908],{},[24,6909,6910],{},"BIGQUERY__LOCATION",[239,6912,459],{},[239,6914,595],{},[239,6916,6917],{},[24,6918,6919],{},"externalServices.bigquery.location",[239,6921,6922,6923,6926],{},"Region of the jobs: the bucket's, or the multi-region containing it (e.g. ",[24,6924,6925],{},"EU","). Empty = read from the bucket.",[224,6928,6929,6934,6936,6942,6947],{},[239,6930,6931],{},[24,6932,6933],{},"BIGQUERY__MAXIMUM_BYTES_BILLED",[239,6935,567],{},[239,6937,6938,6941],{},[24,6939,6940],{},"21474836480"," (20 GiB)",[239,6943,6944],{},[24,6945,6946],{},"externalServices.bigquery.maximumBytesBilled",[239,6948,6949],{},"Bytes billed one query may reach: BigQuery refuses a query that would go over before running it (20 GiB ≈ 0.12 $). 0 = no cap. Also adjustable in Administration → Settings.",[224,6951,6952,6957,6959,6964,6968],{},[239,6953,6954],{},[24,6955,6956],{},"BIGQUERY__CACHE_DATASET",[239,6958,459],{},[239,6960,6961],{},[24,6962,6963],{},"tabularia_cache",[239,6965,6966],{},[24,6967,132],{},[239,6969,6970,6971,6974],{},"Dataset the step cache writes expiring native tables into (created if missing, which needs ",[95,6972,6973],{},"BigQuery Data Editor","). Empty = no cache.",[703,6976,6978],{"id":6977},"imports-and-downloads","Imports and downloads",[14,6980,6981],{},"Database imports stream Arrow batches into parquet snapshots; a CSV or Excel download goes through the browser.",[218,6983,6984,6998],{},[221,6985,6986],{},[224,6987,6988,6990,6992,6994,6996],{},[227,6989,437],{},[227,6991,440],{},[227,6993,443],{},[227,6995,124],{},[227,6997,448],{},[234,6999,7000,7021,7046,7067],{},[224,7001,7002,7007,7010,7014,7018],{},[239,7003,7004],{},[24,7005,7006],{},"INGEST__PARQUET_ROW_GROUP_ROWS",[239,7008,7009],{},"integer, 1–20,000,000",[239,7011,7012],{},[24,7013,6195],{},[239,7015,7016],{},[24,7017,132],{},[239,7019,7020],{},"Rows per parquet row group written by imports. Large groups let the engines read only the columns a query needs; the group is held in memory before it is written (about 570 MB per million rows of a 50-column table), so raise the worker memory with it. Also adjustable in Administration → Settings.",[224,7022,7023,7028,7031,7036,7040],{},[239,7024,7025],{},[24,7026,7027],{},"INGEST__DB_READ_TIMEOUT_SECONDS",[239,7029,7030],{},"integer, ≥ 10",[239,7032,7033],{},[24,7034,7035],{},"3000",[239,7037,7038],{},[24,7039,132],{},[239,7041,7042,7043,7045],{},"How long an import from ClickHouse, or a write into it, waits while the server sends nothing (it may sort a whole table before the first row). Keep it below ",[24,7044,5767],{},", so people read this error and not a killed task. Also adjustable in Administration → Settings.",[224,7047,7048,7053,7055,7060,7064],{},[239,7049,7050],{},[24,7051,7052],{},"EXPORT__MAX_ROWS",[239,7054,661],{},[239,7056,7057],{},[24,7058,7059],{},"5000000",[239,7061,7062],{},[24,7063,132],{},[239,7065,7066],{},"Rows of a CSV download from the editor, the viewer or the chat: the browser holds the whole file in memory. Larger results go through an Output node. 0 = no cap. Also adjustable in Administration → Settings.",[224,7068,7069,7074,7076,7080,7084],{},[239,7070,7071],{},[24,7072,7073],{},"EXPORT__MAX_RUNNING_PER_PERSON",[239,7075,1095],{},[239,7077,7078],{},[24,7079,2928],{},[239,7081,7082],{},[24,7083,132],{},[239,7085,7086,7087,7090,7091,584],{},"Exports and documents (CSV, Excel, SQL scripts' results, reports, dashboards) one person or service account may have being prepared at once, on the queue of the flows' runs. From the interface past it people are asked to wait; code (the REST API with a token, a notebook's ",[24,7088,7089],{},"tabularia.report()",") waits for its turn, up to ",[24,7092,5195],{},[703,7094,7096],{"id":7095},"sharepoint-datasources","SharePoint datasources",[14,7098,7099],{},"Excel and CSV files on SharePoint are read through Microsoft Graph with an app registered on Entra ID; tenant, client and site belong to the connection. These two endpoints are deployment settings on purpose: whoever creates a connection cannot point the backend at another host.",[218,7101,7102,7116],{},[221,7103,7104],{},[224,7105,7106,7108,7110,7112,7114],{},[227,7107,437],{},[227,7109,440],{},[227,7111,443],{},[227,7113,124],{},[227,7115,448],{},[234,7117,7118,7142],{},[224,7119,7120,7125,7127,7132,7136],{},[239,7121,7122],{},[24,7123,7124],{},"SHAREPOINT__GRAPH_BASE",[239,7126,459],{},[239,7128,7129],{},[24,7130,7131],{},"https:\u002F\u002Fgraph.microsoft.com\u002Fv1.0",[239,7133,7134],{},[24,7135,132],{},[239,7137,7138,7139,115],{},"Microsoft Graph endpoint; change it only on a sovereign cloud (US Gov: ",[24,7140,7141],{},"https:\u002F\u002Fgraph.microsoft.us\u002Fv1.0",[224,7143,7144,7149,7151,7156,7160],{},[239,7145,7146],{},[24,7147,7148],{},"SHAREPOINT__LOGIN_BASE",[239,7150,459],{},[239,7152,7153],{},[24,7154,7155],{},"https:\u002F\u002Flogin.microsoftonline.com",[239,7157,7158],{},[24,7159,132],{},[239,7161,7162,7163,115],{},"Microsoft sign-in endpoint; likewise (US Gov: ",[24,7164,7165],{},"https:\u002F\u002Flogin.microsoftonline.us",[703,7167,7169],{"id":7168},"sftp-datasources","SFTP datasources",[14,7171,7172,7173,141],{},"Caps of the «SFTP folder» datasource, checked on the listed sizes before anything is downloaded: going over one fails the import, naming the file. See ",[18,7174,7176],{"href":7175},"\u002Fdocs\u002Fsftp","SFTP",[218,7178,7179,7193],{},[221,7180,7181],{},[224,7182,7183,7185,7187,7189,7191],{},[227,7184,437],{},[227,7186,440],{},[227,7188,443],{},[227,7190,124],{},[227,7192,448],{},[234,7194,7195,7215,7236,7258],{},[224,7196,7197,7202,7204,7208,7212],{},[239,7198,7199],{},[24,7200,7201],{},"SFTP__MAX_FILE_BYTES",[239,7203,1095],{},[239,7205,7206,6339],{},[24,7207,6338],{},[239,7209,7210],{},[24,7211,132],{},[239,7213,7214],{},"Bytes of one file: each one is downloaded to the worker's disk and read in memory to be stacked. Also adjustable in Administration → Settings.",[224,7216,7217,7222,7224,7229,7233],{},[239,7218,7219],{},[24,7220,7221],{},"SFTP__MAX_FILES",[239,7223,1095],{},[239,7225,7226],{},[24,7227,7228],{},"500",[239,7230,7231],{},[24,7232,132],{},[239,7234,7235],{},"Files one refresh may read. Also adjustable in Administration → Settings.",[224,7237,7238,7243,7245,7251,7255],{},[239,7239,7240],{},[24,7241,7242],{},"SFTP__MAX_TOTAL_BYTES",[239,7244,1095],{},[239,7246,7247,7250],{},[24,7248,7249],{},"2147483648"," (2 GiB)",[239,7252,7253],{},[24,7254,132],{},[239,7256,7257],{},"Bytes of all the matching files together. Also adjustable in Administration → Settings.",[224,7259,7260,7265,7267,7271,7275],{},[239,7261,7262],{},[24,7263,7264],{},"SFTP__TIMEOUT_SECONDS",[239,7266,2946],{},[239,7268,7269],{},[24,7270,2341],{},[239,7272,7273],{},[24,7274,132],{},[239,7276,7277],{},"Connection and SSH handshake: a silent server fails within this time. Also adjustable in Administration → Settings.",[703,7279,7281],{"id":7280},"s3-folder-datasources","S3 folder datasources",[14,7283,7284,7285,141],{},"Caps of the «S3 folder» datasource, checked on the object listing before anything is downloaded. See ",[18,7286,7288],{"href":7287},"\u002Fdocs\u002Fs3-datasource","S3 datasources",[218,7290,7291,7305],{},[221,7292,7293],{},[224,7294,7295,7297,7299,7301,7303],{},[227,7296,437],{},[227,7298,440],{},[227,7300,443],{},[227,7302,124],{},[227,7304,448],{},[234,7306,7307,7327,7346,7366,7391],{},[224,7308,7309,7314,7316,7320,7324],{},[239,7310,7311],{},[24,7312,7313],{},"S3_SOURCE__MAX_FILE_BYTES",[239,7315,1095],{},[239,7317,7318,6339],{},[24,7319,6338],{},[239,7321,7322],{},[24,7323,132],{},[239,7325,7326],{},"Bytes of one object: downloaded to the worker's disk and read in memory. Also adjustable in Administration → Settings.",[224,7328,7329,7334,7336,7340,7344],{},[239,7330,7331],{},[24,7332,7333],{},"S3_SOURCE__MAX_FILES",[239,7335,1095],{},[239,7337,7338],{},[24,7339,7228],{},[239,7341,7342],{},[24,7343,132],{},[239,7345,7235],{},[224,7347,7348,7353,7355,7359,7363],{},[239,7349,7350],{},[24,7351,7352],{},"S3_SOURCE__MAX_TOTAL_BYTES",[239,7354,1095],{},[239,7356,7357,7250],{},[24,7358,7249],{},[239,7360,7361],{},[24,7362,132],{},[239,7364,7365],{},"Bytes of all the matching objects together. Also adjustable in Administration → Settings.",[224,7367,7368,7373,7375,7380,7384],{},[239,7369,7370],{},[24,7371,7372],{},"S3_SOURCE__MAX_LISTED",[239,7374,1095],{},[239,7376,7377],{},[24,7378,7379],{},"100000",[239,7381,7382],{},[24,7383,132],{},[239,7385,7386,7387,7390],{},"Keys the globs of one refresh may scan, all their expansions together: ",[24,7388,7389],{},"**"," on a huge bucket stops here. Also adjustable in Administration → Settings.",[224,7392,7393,7398,7400,7404,7408],{},[239,7394,7395],{},[24,7396,7397],{},"S3_SOURCE__MAX_REQUEST_SECONDS",[239,7399,2946],{},[239,7401,7402],{},[24,7403,1979],{},[239,7405,7406],{},[24,7407,132],{},[239,7409,7410],{},"Wall-clock time of one object's download: a server that drips the bytes stops here. Also adjustable in Administration → Settings.",[703,7412,7414],{"id":7413},"api-datasources","API datasources",[14,7416,7417,7418,141],{},"Caps and manners of the «API call» datasource. A datasource may lower the per-call, per-refresh and row limits for itself, never raise them above these; going over one fails the refresh with a message that names it, the data is never cut silently. See ",[18,7419,7414],{"href":7420},"\u002Fdocs\u002Fapi-datasource",[218,7422,7423,7437],{},[221,7424,7425],{},[224,7426,7427,7429,7431,7433,7435],{},[227,7428,437],{},[227,7430,440],{},[227,7432,443],{},[227,7434,124],{},[227,7436,448],{},[234,7438,7439,7459,7480,7500,7521,7543,7563,7586,7609,7629,7649],{},[224,7440,7441,7446,7448,7452,7456],{},[239,7442,7443],{},[24,7444,7445],{},"API__TIMEOUT_SECONDS",[239,7447,2946],{},[239,7449,7450],{},[24,7451,2341],{},[239,7453,7454],{},[24,7455,132],{},[239,7457,7458],{},"Connection and read timeout of one request, the token request included. Also adjustable in Administration → Settings.",[224,7460,7461,7466,7468,7473,7477],{},[239,7462,7463],{},[24,7464,7465],{},"API__MAX_PAGES",[239,7467,1095],{},[239,7469,7470],{},[24,7471,7472],{},"1000",[239,7474,7475],{},[24,7476,132],{},[239,7478,7479],{},"Pages of one call: a pagination that never ends stops here. Also adjustable in Administration → Settings.",[224,7481,7482,7487,7489,7493,7497],{},[239,7483,7484],{},[24,7485,7486],{},"API__MAX_CALLS",[239,7488,1095],{},[239,7490,7491],{},[24,7492,7228],{},[239,7494,7495],{},[24,7496,132],{},[239,7498,7499],{},"Calls of one refresh (the combinations of the list variables). Also adjustable in Administration → Settings.",[224,7501,7502,7507,7509,7514,7518],{},[239,7503,7504],{},[24,7505,7506],{},"API__MAX_ROWS",[239,7508,1095],{},[239,7510,7511],{},[24,7512,7513],{},"2000000",[239,7515,7516],{},[24,7517,132],{},[239,7519,7520],{},"Rows one refresh may receive. Also adjustable in Administration → Settings.",[224,7522,7523,7528,7530,7536,7540],{},[239,7524,7525],{},[24,7526,7527],{},"API__MAX_RESPONSE_BYTES",[239,7529,1095],{},[239,7531,7532,7535],{},[24,7533,7534],{},"104857600"," (100 MiB)",[239,7537,7538],{},[24,7539,132],{},[239,7541,7542],{},"Bytes of one response, decompressed: it is held in memory to be parsed. Also adjustable in Administration → Settings.",[224,7544,7545,7550,7552,7556,7560],{},[239,7546,7547],{},[24,7548,7549],{},"API__MAX_TOTAL_BYTES",[239,7551,1095],{},[239,7553,7554,667],{},[24,7555,666],{},[239,7557,7558],{},[24,7559,132],{},[239,7561,7562],{},"Bytes of all the responses of one refresh. Also adjustable in Administration → Settings.",[224,7564,7565,7570,7572,7576,7580],{},[239,7566,7567],{},[24,7568,7569],{},"API__MAX_RETRIES",[239,7571,661],{},[239,7573,7574],{},[24,7575,4772],{},[239,7577,7578],{},[24,7579,132],{},[239,7581,7582,7583,584],{},"Retries of a request that failed with 429, 500, 502, 503, 504 or a network error, with exponential backoff or the server's ",[24,7584,7585],{},"Retry-After",[224,7587,7588,7593,7595,7599,7603],{},[239,7589,7590],{},[24,7591,7592],{},"API__MAX_RETRY_WAIT_SECONDS",[239,7594,2381],{},[239,7596,7597],{},[24,7598,5203],{},[239,7600,7601],{},[24,7602,132],{},[239,7604,7605,7606,7608],{},"A ",[24,7607,7585],{}," longer than this fails the refresh instead of holding a worker. Also adjustable in Administration → Settings.",[224,7610,7611,7616,7618,7622,7626],{},[239,7612,7613],{},[24,7614,7615],{},"API__MAX_REDIRECTS",[239,7617,661],{},[239,7619,7620],{},[24,7621,280],{},[239,7623,7624],{},[24,7625,132],{},[239,7627,7628],{},"Redirects followed per request. Also adjustable in Administration → Settings.",[224,7630,7631,7636,7638,7642,7646],{},[239,7632,7633],{},[24,7634,7635],{},"API__MAX_REQUEST_SECONDS",[239,7637,2946],{},[239,7639,7640],{},[24,7641,4502],{},[239,7643,7644],{},[24,7645,132],{},[239,7647,7648],{},"Wall-clock time of one request, from sending it to the last byte of the answer. Also adjustable in Administration → Settings.",[224,7650,7651,7656,7658,7662,7666],{},[239,7652,7653],{},[24,7654,7655],{},"API__MIN_INTERVAL_SECONDS",[239,7657,2381],{},[239,7659,7660],{},[24,7661,1407],{},[239,7663,7664],{},[24,7665,132],{},[239,7667,7668],{},"Minimum pause between two requests of one refresh; a datasource can ask for more. Also adjustable in Administration → Settings.",[703,7670,7672],{"id":7671},"placeholders","Placeholders",[14,7674,7675,7676,141],{},"Dates and lists that move by themselves in the names of inputs and outputs. See ",[18,7677,7671],{"href":7678},"\u002Fdocs\u002Fplaceholders",[218,7680,7681,7695],{},[221,7682,7683],{},[224,7684,7685,7687,7689,7691,7693],{},[227,7686,437],{},[227,7688,440],{},[227,7690,443],{},[227,7692,124],{},[227,7694,448],{},[234,7696,7697],{},[224,7698,7699,7704,7706,7710,7714],{},[239,7700,7701],{},[24,7702,7703],{},"PLACEHOLDERS__MAX_VALUES",[239,7705,1095],{},[239,7707,7708],{},[24,7709,7472],{},[239,7711,7712],{},[24,7713,132],{},[239,7715,7716,7717,584],{},"Values of one range variable, and combinations of all the variables of a file datasource; checked when the datasource is saved and at every refresh. An API call is also bounded by ",[24,7718,7486],{},[703,7720,7722],{"id":7721},"email","Email",[14,7724,7725],{},"The SMTP connections of email outputs and notices are set up in the app; the deployment decides only how their servers are trusted.",[218,7727,7728,7742],{},[221,7729,7730],{},[224,7731,7732,7734,7736,7738,7740],{},[227,7733,437],{},[227,7735,440],{},[227,7737,443],{},[227,7739,124],{},[227,7741,448],{},[234,7743,7744],{},[224,7745,7746,7751,7753,7757,7761],{},[239,7747,7748],{},[24,7749,7750],{},"SMTP__VERIFY_TLS",[239,7752,1142],{},[239,7754,7755],{},[24,7756,69],{},[239,7758,7759],{},[24,7760,132],{},[239,7762,7763,7764,7766],{},"Verify the SMTP server's certificate and name, with STARTTLS and with implicit TLS (465). ",[24,7765,73],{}," is the explicit opt-out for a relay with a self-signed certificate: the connection is still encrypted, but to a server nobody vouched for, and it receives the SMTP password.",[703,7768,5163],{"id":7769},"reports-1",[14,7771,7772,7773,7776,7777,7780],{},"What one render of a pixel-perfect report may read and use. The run workers render reports (the ",[24,7774,7775],{},"celery"," queue, as downloads); the pages are laid out by a child process of the worker, with its own memory and time, and the charts are drawn by the chart service, ECharts to SVG, a sidecar of the worker pods on Kubernetes and the ",[24,7778,7779],{},"chart-renderer"," service on Compose.",[218,7782,7783,7797],{},[221,7784,7785],{},[224,7786,7787,7789,7791,7793,7795],{},[227,7788,437],{},[227,7790,440],{},[227,7792,443],{},[227,7794,124],{},[227,7796,448],{},[234,7798,7799,7822,7844,7867,7889],{},[224,7800,7801,7806,7809,7814,7819],{},[239,7802,7803],{},[24,7804,7805],{},"REPORTS__MAX_ROWS",[239,7807,7808],{},"integer, 1–10,000,000",[239,7810,7811],{},[24,7812,7813],{},"3000000",[239,7815,7816],{},[24,7817,7818],{},"reports.maxRows",[239,7820,7821],{},"The most rows a report reads from each of its datasets; one more stops the render and names the dataset (aggregate it in SQL, or filter it). The rows stay in the worker's memory, in columns, while the report renders, and DuckDB works out its groups and totals: a million take some 500 MiB and a second or two, ten million some 2.2 GiB and ten seconds (measured), so give the worker that much for every render that may run at once.",[224,7823,7824,7829,7832,7836,7841],{},[239,7825,7826],{},[24,7827,7828],{},"REPORTS__MAX_PAGES",[239,7830,7831],{},"integer, 1–10,000",[239,7833,7834],{},[24,7835,2295],{},[239,7837,7838],{},[24,7839,7840],{},"reports.maxPages",[239,7842,7843],{},"The most pages of one report: a longer one stops with the number it would have.",[224,7845,7846,7851,7854,7859,7864],{},[239,7847,7848],{},[24,7849,7850],{},"REPORTS__RENDER_MEMORY_MB",[239,7852,7853],{},"integer, ≥ 128",[239,7855,7856],{},[24,7857,7858],{},"1024",[239,7860,7861],{},[24,7862,7863],{},"reports.renderMemoryMb",[239,7865,7866],{},"The memory of the child process that lays out a report's pages (Typst), in MiB: it needs about 4.5 MiB a page of tables (measured), so 1024 holds 200. Past it the render stops and says so; give the worker as much more memory for every render that may run at once.",[224,7868,7869,7874,7877,7881,7886],{},[239,7870,7871],{},[24,7872,7873],{},"REPORTS__RENDER_SECONDS",[239,7875,7876],{},"integer, ≥ 5",[239,7878,7879],{},[24,7880,5203],{},[239,7882,7883],{},[24,7884,7885],{},"reports.renderSeconds",[239,7887,7888],{},"How long the layout of one report may take: past it the child process is killed and the render stops.",[224,7890,7891,7896,7898,7903,7909],{},[239,7892,7893],{},[24,7894,7895],{},"REPORTS__CHART_URL",[239,7897,459],{},[239,7899,7900],{},[24,7901,7902],{},"http:\u002F\u002F127.0.0.1:8090",[239,7904,7905,7906],{},"set on the run workers from ",[24,7907,7908],{},"reports.chartRenderer",[239,7910,7911,7912,7914,7915,7917],{},"Where the workers find the chart service: the sidecar on 127.0.0.1 on Kubernetes (",[24,7913,7908],{},"), the ",[24,7916,7779],{}," service on Compose. Empty = no charts: a report that has one fails, saying so.",[703,7919,7921],{"id":7920},"dashboards","Dashboards",[14,7923,7924,7925,7927],{},"What one request for a dashboard's numbers may read. The preview workers compute them (the ",[24,7926,5242],{}," queue), with the reports' engine.",[218,7929,7930,7944],{},[221,7931,7932],{},[224,7933,7934,7936,7938,7940,7942],{},[227,7935,437],{},[227,7937,440],{},[227,7939,443],{},[227,7941,124],{},[227,7943,448],{},[234,7945,7946,7970,7996,8023,8045],{},[224,7947,7948,7953,7955,7959,7964],{},[239,7949,7950],{},[24,7951,7952],{},"DASHBOARDS__MAX_ROWS",[239,7954,7808],{},[239,7956,7957],{},[24,7958,7805],{},[239,7960,7961],{},[24,7962,7963],{},"dashboards.maxRows",[239,7965,7966,7967,7969],{},"The most rows a dashboard reads from each of its datasets; empty, ",[24,7968,7805],{},". The tiles that read a dataset with more say so and how to aggregate it, and show no number: a total is never computed on part of the rows. The rows stay in the preview worker's memory, in columns, while a request is worked out: a request of 9 tiles on a million rows of 8 columns took it from 0.3 to 1.2–1.5 GiB (measured), so give that worker as much for every request that may run at once.",[224,7971,7972,7977,7980,7984,7989],{},[239,7973,7974],{},[24,7975,7976],{},"DASHBOARDS__CACHE_SECONDS",[239,7978,7979],{},"integer, 10–604,800",[239,7981,7982],{},[24,7983,4502],{},[239,7985,7986],{},[24,7987,7988],{},"dashboards.cacheSeconds",[239,7990,7991,7992,7995],{},"How long the rows of a dataset and the numbers of a tile are shared by everyone who may read them, so that a hundred people on a dashboard run one query; a dashboard whose ",[24,7993,7994],{},"refresh_seconds"," is longer keeps them for that. Rights are checked at every request all the same. Also adjustable in Administration → Settings.",[224,7997,7998,8003,8006,8011,8016],{},[239,7999,8000],{},[24,8001,8002],{},"DASHBOARDS__CACHE_TILE_BYTES",[239,8004,8005],{},"integer, at least 1,024",[239,8007,8008],{},[24,8009,8010],{},"1048576",[239,8012,8013],{},[24,8014,8015],{},"dashboards.cacheTileBytes",[239,8017,8018,8019,8022],{},"The largest numbers of one tile kept in Valkey; above it they are worked out again at each request, from the rows kept, and counted in the ",[24,8020,8021],{},"dataprep_dashboard_cache"," metric. Also adjustable in Administration → Settings.",[224,8024,8025,8030,8033,8037,8042],{},[239,8026,8027],{},[24,8028,8029],{},"DASHBOARDS__CACHE_VALKEY_BYTES",[239,8031,8032],{},"integer, at least 1,048,576",[239,8034,8035],{},[24,8036,6338],{},[239,8038,8039],{},[24,8040,8041],{},"dashboards.cacheValkeyBytes",[239,8043,8044],{},"With Valkey using more memory than this, no tile's numbers are kept (Valkey also carries the queues, and has no limit of its own). Also adjustable in Administration → Settings.",[224,8046,8047,8052,8054,8058,8063],{},[239,8048,8049],{},[24,8050,8051],{},"DASHBOARDS__CACHE_BUCKET_BYTES",[239,8053,567],{},[239,8055,8056],{},[24,8057,6940],{},[239,8059,8060],{},[24,8061,8062],{},"dashboards.cacheBucketBytes",[239,8064,8065,8066,8069],{},"The most the rows of dashboards take on the bucket, under ",[24,8067,8068],{},"cache\u002F",": those about to expire leave first, and rows larger than this are not kept (then each new table page or click reads the source again). 0 keeps none. Also adjustable in Administration → Settings.",[305,8071,277],{"id":170},[14,8073,8074,8075,8078,8079,8081,8082,141],{},"The Nuxt server reads these at startup (",[24,8076,8077],{},"NUXT_PUBLIC_…"," is Nuxt's own runtime\nconfiguration), so one image serves every environment without a rebuild. The browser\ncalls the gateway directly; the frontend server never does. The development Compose file\nsets them in the ",[24,8080,170],{}," service itself, not from ",[24,8083,427],{},[218,8085,8086,8098],{},[221,8087,8088],{},[224,8089,8090,8092,8094,8096],{},[227,8091,437],{},[227,8093,443],{},[227,8095,124],{},[227,8097,448],{},[234,8099,8100,8122,8141,8161,8185],{},[224,8101,8102,8107,8111,8116],{},[239,8103,8104],{},[24,8105,8106],{},"NUXT_PUBLIC_API_BASE",[239,8108,8109],{},[24,8110,2022],{},[239,8112,8113],{},[24,8114,8115],{},"frontend.publicApiBase",[239,8117,8118,8119,8121],{},"The gateway's URL as the browser calls it: ",[24,8120,855],{}," when one host serves interface and API, or a full URL on another host.",[224,8123,8124,8128,8132,8136],{},[239,8125,8126],{},[24,8127,5514],{},[239,8129,8130],{},[24,8131,2046],{},[239,8133,8134],{},[24,8135,2051],{},[239,8137,8138,8139,141],{},"Default bucket; must match ",[24,8140,45],{},[224,8142,8143,8148,8153,8158],{},[239,8144,8145],{},[24,8146,8147],{},"NUXT_PUBLIC_GRAFANA_URL",[239,8149,8150],{},[24,8151,8152],{},"http:\u002F\u002Flocalhost:3001",[239,8154,8155],{},[24,8156,8157],{},"frontend.publicGrafanaUrl",[239,8159,8160],{},"Grafana as the browser reaches it, embedded in the Monitoring tab (administrators only). Optional.",[224,8162,8163,8168,8173,8178],{},[239,8164,8165],{},[24,8166,8167],{},"NUXT_PUBLIC_SOURCE_URL",[239,8169,8170],{},[24,8171,8172],{},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia",[239,8174,8175],{},[24,8176,8177],{},"frontend.publicSourceUrl",[239,8179,8180,8181,8184],{},"Where ",[39,8182,8183],{},"Source code"," in the settings menu leads. Empty: the project's repository. If you offer a changed version to others over a network, the AGPL asks you to offer them its source: point this at it.",[224,8186,8187,8191,8193,8198],{},[239,8188,8189],{},[24,8190,5089],{},[239,8192,595],{},[239,8194,8195,8196],{},"from ",[24,8197,5059],{},[239,8199,8200,8201,8203],{},"The notebooks' own address, the gateway's ",[24,8202,411],{},": the pages' Content-Security-Policy lets them show the notebooks' apps and editors from it.",[305,8205,288],{"id":8206},"compose-and-helm-only",[14,8208,8209],{},"Not read by Tabularia's code: the Compose files and the Helm chart use them to configure\ncontainers.",[218,8211,8212,8225],{},[221,8213,8214],{},[224,8215,8216,8218,8220,8223],{},[227,8217,437],{},[227,8219,443],{},[227,8221,8222],{},"Where",[227,8224,448],{},[234,8226,8227,8247,8271,8290,8309,8329,8347,8365,8382,8411,8427,8445,8474],{},[224,8228,8229,8234,8239,8244],{},[239,8230,8231],{},[24,8232,8233],{},"MINIO_IMAGE",[239,8235,8236],{},[24,8237,8238],{},"pgsty\u002Fminio:RELEASE.2026-08-04T00-00-00Z",[239,8240,8241,8242,3890],{},"Compose (",[24,8243,101],{},[239,8245,8246],{},"Image of the development MinIO (the official one was withdrawn from the registries).",[224,8248,8249,8254,8258,8261],{},[239,8250,8251],{},[24,8252,8253],{},"WITH_MSSQL",[239,8255,8256],{},[24,8257,73],{},[239,8259,8260],{},"Compose (build argument)",[239,8262,8263,8264,8266,8267,141],{},"Build argument: ",[24,8265,69],{}," adds Microsoft's SQL Server driver to the backend image you build. Not in the published images, for licensing reasons: see ",[18,8268,8270],{"href":8269},"\u002Fdocs\u002Fsqlserver","SQL Server",[224,8272,8273,8278,8283,8287],{},[239,8274,8275],{},[24,8276,8277],{},"BACKEND_MEM_LIMIT",[239,8279,8280],{},[24,8281,8282],{},"4g",[239,8284,8241,8285,3890],{},[24,8286,101],{},[239,8288,8289],{},"Memory ceiling of the engine API container.",[224,8291,8292,8297,8302,8306],{},[239,8293,8294],{},[24,8295,8296],{},"WORKER_MEM_LIMIT",[239,8298,8299],{},[24,8300,8301],{},"6g",[239,8303,8241,8304,3890],{},[24,8305,101],{},[239,8307,8308],{},"Memory ceiling of the run worker. Keep the sum of the ceilings below the machine's RAM; the per-process cap is derived from it.",[224,8310,8311,8315,8319,8323],{},[239,8312,8313],{},[24,8314,5862],{},[239,8316,8317],{},[24,8318,4772],{},[239,8320,8241,8321,3890],{},[24,8322,101],{},[239,8324,8325,8326,8328],{},"Processes of the preview worker (its ",[24,8327,3069],{},"). The per-process memory cap is the ceiling divided by this.",[224,8330,8331,8336,8340,8344],{},[239,8332,8333],{},[24,8334,8335],{},"PREVIEW_WORKER_MEM_LIMIT",[239,8337,8338],{},[24,8339,8282],{},[239,8341,8241,8342,3890],{},[24,8343,101],{},[239,8345,8346],{},"Memory ceiling of the preview worker.",[224,8348,8349,8354,8358,8362],{},[239,8350,8351],{},[24,8352,8353],{},"GRAFANA_ADMIN_USER",[239,8355,8356],{},[24,8357,364],{},[239,8359,8241,8360,3890],{},[24,8361,101],{},[239,8363,8364],{},"Grafana administrator of the development stack.",[224,8366,8367,8371,8373,8377],{},[239,8368,8369],{},[24,8370,417],{},[239,8372,184],{},[239,8374,8241,8375,3890],{},[24,8376,101],{},[239,8378,8379,8381],{},[39,8380,474],{}," change it wherever Grafana is reachable by others. Its password.",[224,8383,8384,8389,8394,8398],{},[239,8385,8386],{},[24,8387,8388],{},"SAMPLES_SCALE",[239,8390,8391],{},[24,8392,8393],{},"small",[239,8395,8241,8396,3890],{},[24,8397,101],{},[239,8399,8400,8401,8403,8404,484,8407,8410],{},"Size of the sample data: ",[24,8402,8393],{}," (seconds, fits a laptop), ",[24,8405,8406],{},"medium",[24,8408,8409],{},"robusta"," (42M order lines, minutes and a few GB). Generated once.",[224,8412,8413,8418,8420,8424],{},[239,8414,8415],{},[24,8416,8417],{},"SAMPLES_ENGINE",[239,8419,595],{},[239,8421,8241,8422,3890],{},[24,8423,101],{},[239,8425,8426],{},"Engine of the sample flows. Empty = the first one the policy allows.",[224,8428,8429,8434,8438,8442],{},[239,8430,8431],{},[24,8432,8433],{},"SAMPLES_RUN_FLOWS",[239,8435,8436],{},[24,8437,69],{},[239,8439,8241,8440,3890],{},[24,8441,101],{},[239,8443,8444],{},"Run the sample flows once at initialisation, so their outputs and views exist.",[224,8446,8447,8452,8457,8462],{},[239,8448,8449],{},[24,8450,8451],{},"FORWARDED_ALLOW_IPS",[239,8453,8454],{},[24,8455,8456],{},"127.0.0.1",[239,8458,8241,8459,8461],{},[24,8460,101],{},"), read by the gateway's server",[239,8463,8464,8465,8467,8468,8470,8471,141],{},"uvicorn's own variable: the addresses (comma-separated, networks allowed) from which the gateway believes ",[24,8466,5037],{},". From anyone else the header is ignored and the client is the connection's address, which is what the sign-in throttle, the sessions and the audit log record. Behind your own reverse proxy put its address here; never ",[24,8469,506],{}," while the gateway's port is reachable by others, or anyone can choose the address they sign in from. On Kubernetes the chart sets it from ",[24,8472,8473],{},"gateway.trustedProxies",[224,8475,8476,8481,8485,8488],{},[239,8477,8478],{},[24,8479,8480],{},"MALLOC_ARENA_MAX",[239,8482,8483],{},[24,8484,3059],{},[239,8486,8487],{},"Compose and Helm (set on the engine containers)",[239,8489,8490],{},"glibc's variable, set to 2 on the engine containers: one memory arena per thread inflates the resident memory of Polars and Arrow thread pools.",[305,8492,8494],{"id":8493},"changing-this-page","Changing this page",[14,8496,8497,8498,8505,8506,8513,8514,8517,8518,8520,8521,8527,8528,8531,8532,8535,8536,8538,8539,8542],{},"The page is generated. Names, types, defaults, bounds and Helm keys come from the code:\nthe settings classes of ",[18,8499,8502],{"href":8500,"rel":8501},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002Fgateway\u002Fapp\u002Fcore\u002Fconfig.py",[22],[24,8503,8504],{},"gateway\u002Fapp\u002Fcore\u002Fconfig.py"," and\n",[18,8507,8510],{"href":8508,"rel":8509},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002Fbackend\u002Fapp\u002Fcore\u002Fconfig.py",[22],[24,8511,8512],{},"backend\u002Fapp\u002Fcore\u002Fconfig.py",", the direct reads of the\nenvironment in both apps, ",[24,8515,8516],{},"frontend\u002Fnuxt.config.ts",", the development Compose file,\n",[24,8519,109],{}," and the chart's templates. The explanations come from\n",[18,8522,8524],{"href":30,"rel":8523},[22],[24,8525,8526],{},".github\u002Fscripts\u002Fconfig_reference.toml",".\nAfter changing either, run ",[24,8529,8530],{},"python3 .github\u002Fscripts\u002Fconfig_reference.py",";\n",[24,8533,8534],{},"--check"," (run by the ",[95,8537,5],{}," workflow, and by\n",[24,8540,8541],{},"python3 .github\u002Fscripts\u002Ftest_config_reference.py",") fails while the page and the code\ndisagree.",{"title":8544,"searchDepth":8545,"depth":8546,"links":8547},"",2,3,[8548,8549,8550,8573,8593,8594,8595],{"id":307,"depth":8545,"text":308},{"id":421,"depth":8545,"text":244},{"id":150,"depth":8545,"text":255,"children":8551},[8552,8553,8554,8555,8556,8557,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572],{"id":705,"depth":8546,"text":706},{"id":928,"depth":8546,"text":929},{"id":1165,"depth":8546,"text":1166},{"id":1494,"depth":8546,"text":1495},{"id":1989,"depth":8546,"text":1990},{"id":2137,"depth":8546,"text":2138,"children":8558},[8559],{"id":2597,"depth":8560,"text":2598},4,{"id":2617,"depth":8546,"text":2618},{"id":2732,"depth":8546,"text":2733},{"id":2775,"depth":8546,"text":2776},{"id":3072,"depth":8546,"text":3073},{"id":3237,"depth":8546,"text":3238},{"id":3445,"depth":8546,"text":3446},{"id":3563,"depth":8546,"text":3564},{"id":3647,"depth":8546,"text":3648},{"id":4073,"depth":8546,"text":4074},{"id":4594,"depth":8546,"text":4595},{"id":4852,"depth":8546,"text":4853},{"id":5162,"depth":8546,"text":5163},{"id":5216,"depth":8545,"text":266,"children":8574},[8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592],{"id":5235,"depth":8546,"text":5236},{"id":5313,"depth":8546,"text":5314},{"id":5418,"depth":8546,"text":5419},{"id":5592,"depth":8546,"text":5593},{"id":5757,"depth":8546,"text":5758},{"id":6117,"depth":8546,"text":6118},{"id":6225,"depth":8546,"text":6226},{"id":6389,"depth":8546,"text":6390},{"id":6809,"depth":8546,"text":6810},{"id":6977,"depth":8546,"text":6978},{"id":7095,"depth":8546,"text":7096},{"id":7168,"depth":8546,"text":7169},{"id":7280,"depth":8546,"text":7281},{"id":7413,"depth":8546,"text":7414},{"id":7671,"depth":8546,"text":7672},{"id":7721,"depth":8546,"text":7722},{"id":7769,"depth":8546,"text":5163},{"id":7920,"depth":8546,"text":7921},{"id":170,"depth":8545,"text":277},{"id":8206,"depth":8545,"text":288},{"id":8493,"depth":8545,"text":8494},"Every setting of Tabularia is an environment variable. This page lists all of them: the\nones the gateway and the engine read, the frontend's, and the few that only the Docker\nCompose files and the Helm chart use. It is generated from the code by\n.github\u002Fscripts\u002Fconfig_reference.py, and a\ncheck fails when a variable is added, removed or changed without the page following:\nedit the code or config_reference.toml,\nnever this page.","md",{"source":8599},"docs\u002Fconfiguration.md",true,"\u002Fdocs\u002Fconfiguration",{"title":5,"description":8596},"docs\u002Fconfiguration","iHWDufNJTH2a1mRz_zOUH3locisQ8jlnEPYv0WtZLZk",[8606,8625,8677,8706,8735,8757,8780,8800],{"title":8607,"icon":8608,"intro":8609,"items":8610},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[8611,8613,8616,8619,8622],{"path":8612,"title":8607},"\u002Fdocs\u002Fgetting-started",{"path":8614,"title":8615},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":8617,"title":8618},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":8620,"title":8621},"\u002Fdocs\u002Fconcepts","Concepts",{"path":8623,"title":8624},"\u002Fdocs\u002Foverview","Overview (README)",{"title":8626,"icon":8627,"intro":8628,"items":8629},"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.",[8630,8633,8636,8639,8642,8645,8648,8650,8652,8655,8658,8661,8664,8667,8670,8672,8675],{"path":8631,"title":8632},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":8634,"title":8635},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":8637,"title":8638},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":8640,"title":8641},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":8643,"title":8644},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":8646,"title":8647},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":8649,"title":7921},"\u002Fdocs\u002Fcapabilities\u002Fdashboards",{"path":4094,"title":8651},"Python and R",{"path":8653,"title":8654},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":8656,"title":8657},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":8659,"title":8660},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":8662,"title":8663},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":8665,"title":8666},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":8668,"title":8669},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":7678,"title":8671},"Dynamic dates",{"path":8673,"title":8674},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":6232,"title":8676},"Engine differences",{"title":8678,"icon":8679,"intro":8680,"items":8681},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[8682,8685,8688,8691,8693,8695,8697,8700,8703],{"path":8683,"title":8684},"\u002Fdocs\u002Fsources","All sources",{"path":8686,"title":8687},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":8689,"title":8690},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":7287,"title":8692},"S3 buckets",{"path":7175,"title":8694},"SFTP folders",{"path":7420,"title":8696},"HTTP APIs",{"path":8698,"title":8699},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":8701,"title":8702},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":8704,"title":8705},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":8707,"icon":8708,"intro":8709,"items":8710},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[8711,8714,8717,8719,8722,8724,8725,8727,8728,8731,8732],{"path":8712,"title":8713},"\u002Fdocs\u002Fconnections","All connections",{"path":8715,"title":8716},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":8269,"title":8718},"Microsoft SQL Server driver",{"path":8720,"title":8721},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":7175,"title":8723},"SFTP servers",{"path":7420,"title":8696},{"path":8698,"title":8726},"SharePoint",{"path":8701,"title":8702},{"path":8729,"title":8730},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":4601,"title":4602},{"path":8733,"title":8734},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":8736,"icon":8737,"intro":8738,"items":8739},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[8740,8743,8746,8748,8750,8751,8753,8755],{"path":8741,"title":8742},"\u002Fdocs\u002Fintegrations","All integrations",{"path":8744,"title":8745},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":211,"title":8747},"API, tokens and webhooks",{"path":2156,"title":8749},"Export to dbt",{"path":3252,"title":3238},{"path":8752,"title":1965},"\u002Fdocs\u002Fsso-keycloak",{"path":206,"title":8754},"Audit log to Splunk",{"path":8756,"title":3564},"\u002Fdocs\u002Fintegrations\u002Fmonitoring",{"title":8758,"icon":8759,"intro":8760,"items":8761},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[8762,8765,8768,8771,8774,8776,8778],{"path":8763,"title":8764},"\u002Fdocs\u002Fgovernance","Overview",{"path":8766,"title":8767},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":8769,"title":8770},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":8772,"title":8773},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1512,"title":8775},"SSO and group mapping",{"path":1505,"title":8777},"Keycloak example on a laptop",{"path":2151,"title":8779},"A ClickHouse user for the AI assistant",{"title":8781,"icon":8782,"intro":8783,"items":8784},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[8785,8787,8790,8793,8795,8796,8798],{"path":113,"title":8786},"Kubernetes and Helm",{"path":8788,"title":8789},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":8791,"title":8792},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":314,"title":8794},"Install and upgrade checklist",{"path":8601,"title":5},{"path":201,"title":8797},"Settings from the panel",{"path":935,"title":8799},"Database migrations",{"title":8801,"icon":8802,"intro":8803,"items":8804},"Reference","reference","Release process and the remaining reference pages.",[8805],{"path":8806,"title":8807},"\u002Fdocs\u002Frelease-process","Release process",1793656371141]