[{"data":1,"prerenderedAt":1115},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fconnections\u002Fs3":3,"docs-nav":896},{"id":4,"title":5,"body":6,"description":16,"extension":888,"meta":889,"navigation":891,"path":892,"seo":893,"stem":894,"__hash__":895},"docs\u002Fdocs\u002Fconnections\u002Fs3.md","S3 connections",{"type":7,"value":8,"toc":876},"minimark",[9,13,17,22,106,110,115,198,209,215,222,228,232,259,270,274,281,353,379,394,398,408,736,742,745,791,794,798,844,848,872],[10,11,5],"h1",{"id":12},"s3-connections",[14,15,16],"p",{},"An S3 connection reaches a bucket of any S3-compatible object storage — AWS S3, MinIO,\nCloudflare R2, Wasabi, Scaleway, Google Cloud Storage through its S3 API — to read the\nfiles of a folder into a datasource and to write a flow's result there as a Parquet or\nCSV file, or as a partitioned dataset. It is how Tabularia exchanges files with a data\nlake, a partner's bucket or a downstream tool that reads object storage.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,36],"table",{},[26,27,28],"thead",{},[29,30,31,34],"tr",{},[32,33],"th",{},[32,35],{},[37,38,39,56,74,90,98],"tbody",{},[29,40,41,45],{},[42,43,44],"td",{},"Where",[42,46,47,48,52,53],{},"A folder in Explore, ",[49,50,51],"strong",{},"New → New connection",", type ",[49,54,55],{},"S3 \u002F object storage",[29,57,58,61],{},[42,59,60],{},"Reads",[42,62,63,64,67,68,73],{},"A datasource ",[49,65,66],{},"«S3 folder»",": the files of a folder that match a glob, stacked into one table (",[69,70,72],"a",{"href":71},"\u002Fdocs\u002Fs3-datasource","S3 folder datasource",")",[29,75,76,79],{},[42,77,78],{},"Writes",[42,80,81,82,85,86,73],{},"An Output node ",[49,83,84],{},"«File on S3 \u002F object storage»",": one file, or a hive-partitioned dataset; and the S3 copy of an Output that publishes a datasource (",[69,87,89],{"href":88},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",[29,91,92,95],{},[42,93,94],{},"Formats",[42,96,97],{},"Reading: CSV, TSV, Parquet, Excel, NDJSON. Writing: Parquet, CSV",[29,99,100,103],{},[42,101,102],{},"Permissions",[42,104,105],{},"CONNECT on the connection's folder, to create, test and use it",[18,107,109],{"id":108},"how-it-works","How it works",[111,112,114],"h3",{"id":113},"the-fields","The fields",[23,116,117,127],{},[26,118,119],{},[29,120,121,124],{},[32,122,123],{},"Field",[32,125,126],{},"Meaning",[37,128,129,154,166,174,182],{},[29,130,131,134],{},[42,132,133],{},"Endpoint URL",[42,135,136,137,141,142,145,146,149,150,153],{},"Empty for AWS. Otherwise the service's S3 address: ",[138,139,140],"code",{},"https:\u002F\u002Fs3.fr-par.scw.cloud"," (Scaleway), ",[138,143,144],{},"https:\u002F\u002F\u003Caccount>.r2.cloudflarestorage.com"," (R2), ",[138,147,148],{},"https:\u002F\u002Fstorage.googleapis.com"," (GCS with HMAC keys), ",[138,151,152],{},"http:\u002F\u002Fminio.internal:9000"," (MinIO).",[29,155,156,159],{},[42,157,158],{},"Access key ID",[42,160,161,162,165],{},"The key's identifier (",[138,163,164],{},"AKIA…"," on AWS).",[29,167,168,171],{},[42,169,170],{},"Secret access key",[42,172,173],{},"Encrypted at rest and never shown again; empty when editing keeps the stored one.",[29,175,176,179],{},[42,177,178],{},"Default bucket",[42,180,181],{},"Optional. Used by every datasource and Output that leaves its own bucket empty.",[29,183,184,187],{},[42,185,186],{},"Region",[42,188,189,190,193,194,197],{},"Optional: ",[138,191,192],{},"eu-west-1",", ",[138,195,196],{},"fr-par",". Set it on AWS; MinIO usually needs none.",[14,199,200,201,204,205,208],{},"With an endpoint set, requests use ",[49,202,203],{},"path-style"," addresses (",[138,206,207],{},"endpoint\u002Fbucket\u002Fkey","),\nwhich MinIO requires and the other services accept. The secret travels encrypted to the\nworker and is decrypted only to sign the requests.",[14,210,211,214],{},[49,212,213],{},"Test connection"," lists one object of the default bucket, or, without a default bucket,\nlists the buckets. A key restricted to one bucket therefore needs the default bucket set\nfor the test to pass.",[14,216,217],{},[218,219],"img",{"alt":220,"src":221},"The New connection dialog with type S3 \u002F object storage: endpoint empty for AWS, an example access key ID, the secret hidden, default bucket acme-exchange, region eu-west-1","\u002Fmedia\u002Fguide\u002Fconnections\u002Fs3-connection.png",[14,223,224],{},[225,226,227],"em",{},"The connection of the example below: AWS (endpoint empty), the key's ID and secret, the default bucket and the region.",[111,229,231],{"id":230},"reading","Reading",[14,233,234,235,238,239,242,243,246,247,251,252,255,256,258],{},"A datasource «S3 folder» (",[49,236,237],{},"New → Datasource from a database",", then the S3 connection)\ntakes a bucket, a folder (a key prefix), a glob over the file names and a format. At each\nrefresh every matching object is downloaded to the worker, read, and the rows stacked into\none table, each row carrying ",[138,240,241],{},"_file"," and ",[138,244,245],{},"_file_modified_at",". The objects are left where\nthey are. Folder and glob may hold ",[69,248,250],{"href":249},"\u002Fdocs\u002Fplaceholders","placeholders",", such as\n",[138,253,254],{},"daily\u002F{yesterday:yyyy\u002FMM\u002Fdd}\u002F",". The whole page: ",[69,257,72],{"href":71},".",[14,260,261,262,265,266,269],{},"The datasource is a ",[49,263,264],{},"snapshot",": the files are read at the refresh and kept as Parquet in\nTabularia's storage; the bucket is not read again until the next refresh. (The in-place\nreading of the DuckDB and chDB engines, ",[138,267,268],{},"STORAGE__DIRECT_READ",", concerns Tabularia's own\nstorage, not the buckets of S3 connections.)",[111,271,273],{"id":272},"writing","Writing",[14,275,276,277,280],{},"An Output node with destination ",[49,278,279],{},"File on S3 \u002F object storage",":",[23,282,283,291],{},[26,284,285],{},[29,286,287,289],{},[32,288,123],{},[32,290,126],{},[37,292,293,301,309,320,334,345],{},[29,294,295,298],{},[42,296,297],{},"S3 connection",[42,299,300],{},"An S3 connection you have CONNECT on.",[29,302,303,306],{},[42,304,305],{},"Bucket",[42,307,308],{},"Empty = the connection's default bucket.",[29,310,311,314],{},[42,312,313],{},"Key \u002F path",[42,315,316,317,258],{},"The object's key, or the prefix of a partitioned dataset. Placeholders allowed: ",[138,318,319],{},"exports\u002F{today:yyyy\u002FMM}\u002Fsales_{date}.parquet",[29,321,322,325],{},[42,323,324],{},"Format",[42,326,327,330,331,258],{},[49,328,329],{},"Parquet"," or ",[49,332,333],{},"CSV",[29,335,336,339],{},[42,337,338],{},"Partition by",[42,340,341,342,258],{},"Optional columns: the output becomes a hive tree ",[138,343,344],{},"key\u002Fcolumn=value\u002F…",[29,346,347,350],{},[42,348,349],{},"Time zone",[42,351,352],{},"The zone of the dates in the key; empty = UTC.",[354,355,356,363,376],"ul",{},[357,358,359,362],"li",{},[49,360,361],{},"Without partitions"," one object is written at the key, replacing an object with the\nsame key. Parquet is copied as Tabularia computed it; CSV is converted on the worker,\nstreaming. The key is used as written: no extension is added.",[357,364,365,368,369,371,372,375],{},[49,366,367],{},"With partitions"," the output is written as ",[138,370,344],{}," files, the partition\ncolumns kept inside the files too, ready for the partition pruning of Trino, Athena,\nDuckDB or Spark. After uploading, the objects under the prefix that this run did not\nwrite are ",[49,373,374],{},"deleted",", so a partition gone from the data does not linger and no row is\ncounted twice. At most 1,000 partitions: more stops the run, asking whether those are\nthe right columns. An empty result writes nothing and fails.",[357,377,378],{},"Large files are uploaded in parts.",[14,380,381,382,385,386,389,390,393],{},"The ",[49,383,384],{},"datasource Output"," can also keep a copy on S3: ",[49,387,388],{},"Also copy the file to external\nS3",", with an S3 connection, a bucket and a ",[49,391,392],{},"Path in the bucket",". The copy is always\nParquet, written after the datasource, and best effort: if it fails, the run still\nsucceeds and the error is recorded in the history.",[18,395,397],{"id":396},"example-a-nightly-exchange-with-a-partner-bucket","Example: a nightly exchange with a partner bucket",[14,399,400,401,404,405,258],{},"A distributor sends the day's sell-out as CSV files into ",[138,402,403],{},"s3:\u002F\u002Facme-exchange\u002Finbound\u002F",",\nand expects the margin report back under ",[138,406,407],{},"outbound\u002F",[409,410,411,673,696,712],"ol",{},[357,412,413,416,417,420,421,662,665,668,669,672],{},[49,414,415],{},"The key."," On AWS, an IAM user ",[138,418,419],{},"tabularia-exchange"," with this policy:",[422,423,428],"pre",{"className":424,"code":425,"language":426,"meta":427,"style":427},"language-json shiki shiki-themes github-dark-dimmed github-light","{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"ListTheBucket\",\n      \"Effect\": \"Allow\",\n      \"Action\": \"s3:ListBucket\",\n      \"Resource\": \"arn:aws:s3:::acme-exchange\"\n    },\n    {\n      \"Sid\": \"ReadInbound\",\n      \"Effect\": \"Allow\",\n      \"Action\": \"s3:GetObject\",\n      \"Resource\": \"arn:aws:s3:::acme-exchange\u002Finbound\u002F*\"\n    },\n    {\n      \"Sid\": \"WriteOutbound\",\n      \"Effect\": \"Allow\",\n      \"Action\": [\"s3:PutObject\", \"s3:DeleteObject\", \"s3:AbortMultipartUpload\"],\n      \"Resource\": \"arn:aws:s3:::acme-exchange\u002Foutbound\u002F*\"\n    }\n  ]\n}\n","json","",[138,429,430,439,456,465,471,484,497,510,521,527,532,544,555,567,577,582,587,599,610,634,644,650,656],{"__ignoreMap":427},[431,432,435],"span",{"class":433,"line":434},"line",1,[431,436,438],{"class":437},"ssh_m","{\n",[431,440,442,446,449,453],{"class":433,"line":441},2,[431,443,445],{"class":444},"sJK54","  \"Version\"",[431,447,448],{"class":437},": ",[431,450,452],{"class":451},"sXfbr","\"2012-10-17\"",[431,454,455],{"class":437},",\n",[431,457,459,462],{"class":433,"line":458},3,[431,460,461],{"class":444},"  \"Statement\"",[431,463,464],{"class":437},": [\n",[431,466,468],{"class":433,"line":467},4,[431,469,470],{"class":437},"    {\n",[431,472,474,477,479,482],{"class":433,"line":473},5,[431,475,476],{"class":444},"      \"Sid\"",[431,478,448],{"class":437},[431,480,481],{"class":451},"\"ListTheBucket\"",[431,483,455],{"class":437},[431,485,487,490,492,495],{"class":433,"line":486},6,[431,488,489],{"class":444},"      \"Effect\"",[431,491,448],{"class":437},[431,493,494],{"class":451},"\"Allow\"",[431,496,455],{"class":437},[431,498,500,503,505,508],{"class":433,"line":499},7,[431,501,502],{"class":444},"      \"Action\"",[431,504,448],{"class":437},[431,506,507],{"class":451},"\"s3:ListBucket\"",[431,509,455],{"class":437},[431,511,513,516,518],{"class":433,"line":512},8,[431,514,515],{"class":444},"      \"Resource\"",[431,517,448],{"class":437},[431,519,520],{"class":451},"\"arn:aws:s3:::acme-exchange\"\n",[431,522,524],{"class":433,"line":523},9,[431,525,526],{"class":437},"    },\n",[431,528,530],{"class":433,"line":529},10,[431,531,470],{"class":437},[431,533,535,537,539,542],{"class":433,"line":534},11,[431,536,476],{"class":444},[431,538,448],{"class":437},[431,540,541],{"class":451},"\"ReadInbound\"",[431,543,455],{"class":437},[431,545,547,549,551,553],{"class":433,"line":546},12,[431,548,489],{"class":444},[431,550,448],{"class":437},[431,552,494],{"class":451},[431,554,455],{"class":437},[431,556,558,560,562,565],{"class":433,"line":557},13,[431,559,502],{"class":444},[431,561,448],{"class":437},[431,563,564],{"class":451},"\"s3:GetObject\"",[431,566,455],{"class":437},[431,568,570,572,574],{"class":433,"line":569},14,[431,571,515],{"class":444},[431,573,448],{"class":437},[431,575,576],{"class":451},"\"arn:aws:s3:::acme-exchange\u002Finbound\u002F*\"\n",[431,578,580],{"class":433,"line":579},15,[431,581,526],{"class":437},[431,583,585],{"class":433,"line":584},16,[431,586,470],{"class":437},[431,588,590,592,594,597],{"class":433,"line":589},17,[431,591,476],{"class":444},[431,593,448],{"class":437},[431,595,596],{"class":451},"\"WriteOutbound\"",[431,598,455],{"class":437},[431,600,602,604,606,608],{"class":433,"line":601},18,[431,603,489],{"class":444},[431,605,448],{"class":437},[431,607,494],{"class":451},[431,609,455],{"class":437},[431,611,613,615,618,621,623,626,628,631],{"class":433,"line":612},19,[431,614,502],{"class":444},[431,616,617],{"class":437},": [",[431,619,620],{"class":451},"\"s3:PutObject\"",[431,622,193],{"class":437},[431,624,625],{"class":451},"\"s3:DeleteObject\"",[431,627,193],{"class":437},[431,629,630],{"class":451},"\"s3:AbortMultipartUpload\"",[431,632,633],{"class":437},"],\n",[431,635,637,639,641],{"class":433,"line":636},20,[431,638,515],{"class":444},[431,640,448],{"class":437},[431,642,643],{"class":451},"\"arn:aws:s3:::acme-exchange\u002Foutbound\u002F*\"\n",[431,645,647],{"class":433,"line":646},21,[431,648,649],{"class":437},"    }\n",[431,651,653],{"class":433,"line":652},22,[431,654,655],{"class":437},"  ]\n",[431,657,659],{"class":433,"line":658},23,[431,660,661],{"class":437},"}\n",[663,664],"br",{},[138,666,667],{},"s3:ListBucket"," serves the test, the datasource's file listing and the cleanup of a\npartitioned output. ",[138,670,671],{},"s3:DeleteObject"," is needed only for partitioned outputs; a\nsingle-file output never deletes.",[357,674,675,678,679,682,683,685,686,689,690,692,693,695],{},[49,676,677],{},"The connection."," In the folder ",[49,680,681],{},"Partners",": type ",[49,684,55],{},", endpoint\nempty, the access key ID and secret, default bucket ",[138,687,688],{},"acme-exchange",", region\n",[138,691,192],{},". ",[49,694,213],{}," lists one object of the bucket.",[357,697,698,701,702,705,706,709,710,258],{},[49,699,700],{},"Reading."," A datasource «S3 folder»: folder ",[138,703,704],{},"inbound",", files ",[138,707,708],{},"sellout_*.csv",", format\nfrom the extension, refresh on a schedule at 05:30. Every row says which file it came\nfrom in ",[138,711,241],{},[357,713,714,717,718,720,721,724,725,727,728,731,732,735],{},[49,715,716],{},"Writing."," The flow joins the sell-out with the product catalogue and ends in an\nOutput node: ",[49,719,279],{},", the same connection, bucket empty, key\n",[138,722,723],{},"outbound\u002Fmargin",", format ",[49,726,329],{},", partition by ",[138,729,730],{},"anno_mese",". Every run rewrites\n",[138,733,734],{},"outbound\u002Fmargin\u002Fanno_mese=2026-10\u002F…"," and removes the files of months no longer in\nthe result.",[14,737,738,739,741],{},"On MinIO the same steps work with the endpoint ",[138,740,152],{},", region\nempty, and a MinIO policy with the same actions on the same resources.",[18,743,102],{"id":744},"permissions",[23,746,747,757],{},[26,748,749],{},[29,750,751,754],{},[32,752,753],{},"To",[32,755,756],{},"You need",[37,758,759,767,775,783],{},[29,760,761,764],{},[42,762,763],{},"create, test, edit or delete the connection",[42,765,766],{},"CONNECT on its folder",[29,768,769,772],{},[42,770,771],{},"create an «S3 folder» datasource",[42,773,774],{},"CONNECT on the connection's folder and EDIT on the datasource's",[29,776,777,780],{},[42,778,779],{},"refresh it",[42,781,782],{},"CONNECT on the connection's folder and RUN on the datasource's",[29,784,785,788],{},[42,786,787],{},"run a flow with an S3 Output or an S3 copy",[42,789,790],{},"RUN on the flow and CONNECT on the connection's folder",[14,792,793],{},"Whoever has CONNECT on the connection can read and write whatever its key can reach:\nscope the key to the bucket and prefixes the job needs.",[18,795,797],{"id":796},"limits-and-good-to-know","Limits and good to know",[354,799,800,819,826,829,837],{},[357,801,802,803,193,806,455,809,193,812,815,816,258],{},"Reading is capped per refresh (",[138,804,805],{},"S3_SOURCE__MAX_FILE_BYTES",[138,807,808],{},"S3_SOURCE__MAX_FILES",[138,810,811],{},"S3_SOURCE__MAX_TOTAL_BYTES",[138,813,814],{},"S3_SOURCE__MAX_LISTED","), checked before anything is\ndownloaded: see ",[69,817,72],{"href":818},"\u002Fdocs\u002Fs3-datasource#caps",[357,820,821,822,825],{},"An object key is at most 1,024 bytes; a key resolved from placeholders is checked.\n",[138,823,824],{},".."," and empty segments are refused.",[357,827,828],{},"Writing a partitioned dataset deletes the objects under its prefix that the run did not\nwrite: give it a prefix of its own.",[357,830,831,832,836],{},"The workers reach the endpoint: on Kubernetes with the network policy, its address must\nbe allowed (",[69,833,835],{"href":834},"\u002Fdocs\u002Fconnections#network","Network",").",[357,838,839,840,843],{},"An S3 connection is not Tabularia's own storage (",[138,841,842],{},"STORAGE__…","): it is an external bucket\nthat flows read from and write to.",[18,845,847],{"id":846},"related","Related",[354,849,850,859,866],{},[357,851,852,193,856],{},[69,853,855],{"href":854},"\u002Fdocs\u002Fconnections","Connections",[69,857,89],{"href":858},"\u002Fdocs\u002Fconnections\u002Fdestinations#a-file-on-s3",[357,860,861,193,863],{},[69,862,72],{"href":71},[69,864,865],{"href":249},"Placeholders",[357,867,868],{},[69,869,871],{"href":870},"\u002Fdocs\u002Fsources","Sources",[873,874,875],"style",{},"html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .sJK54, html code.shiki .sJK54{--shiki-default:#8DDB8C;--shiki-light:#005CC5}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":427,"searchDepth":441,"depth":458,"links":877},[878,879,884,885,886,887],{"id":20,"depth":441,"text":21},{"id":108,"depth":441,"text":109,"children":880},[881,882,883],{"id":113,"depth":458,"text":114},{"id":230,"depth":458,"text":231},{"id":272,"depth":458,"text":273},{"id":396,"depth":441,"text":397},{"id":744,"depth":441,"text":102},{"id":796,"depth":441,"text":797},{"id":846,"depth":441,"text":847},"md",{"source":890},"docs\u002Fconnections\u002Fs3.md",true,"\u002Fdocs\u002Fconnections\u002Fs3",{"title":5,"description":16},"docs\u002Fconnections\u002Fs3","LXYi2ijZsp9VGW4x35uUL6opM-fe0AXHjyMHEVYMbVA",[897,916,971,1000,1027,1056,1081,1107],{"title":898,"icon":899,"intro":900,"items":901},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[902,904,907,910,913],{"path":903,"title":898},"\u002Fdocs\u002Fgetting-started",{"path":905,"title":906},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":908,"title":909},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":911,"title":912},"\u002Fdocs\u002Fconcepts","Concepts",{"path":914,"title":915},"\u002Fdocs\u002Foverview","Overview (README)",{"title":917,"icon":918,"intro":919,"items":920},"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.",[921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,965,968],{"path":922,"title":923},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":925,"title":926},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":928,"title":929},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":931,"title":932},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":934,"title":935},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":937,"title":938},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":940,"title":941},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":943,"title":944},"\u002Fdocs\u002Fscripting","Python and R",{"path":946,"title":947},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":949,"title":950},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":952,"title":953},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":955,"title":956},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":958,"title":959},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":961,"title":962},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":249,"title":964},"Dynamic dates",{"path":966,"title":967},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":969,"title":970},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":871,"icon":972,"intro":973,"items":974},"sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[975,977,980,983,985,988,991,994,997],{"path":870,"title":976},"All sources",{"path":978,"title":979},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":981,"title":982},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":71,"title":984},"S3 buckets",{"path":986,"title":987},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":989,"title":990},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":992,"title":993},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":995,"title":996},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":998,"title":999},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":855,"icon":1001,"intro":1002,"items":1003},"connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[1004,1006,1009,1012,1014,1016,1017,1019,1020,1023,1026],{"path":854,"title":1005},"All connections",{"path":1007,"title":1008},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":1010,"title":1011},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":892,"title":1013},"S3 and compatible storage",{"path":986,"title":1015},"SFTP servers",{"path":989,"title":990},{"path":992,"title":1018},"SharePoint",{"path":995,"title":996},{"path":1021,"title":1022},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1024,"title":1025},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":88,"title":89},{"title":1028,"icon":1029,"intro":1030,"items":1031},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1032,1035,1038,1041,1044,1047,1050,1053],{"path":1033,"title":1034},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1036,"title":1037},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":1039,"title":1040},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":1042,"title":1043},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":1045,"title":1046},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1048,"title":1049},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1051,"title":1052},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1054,"title":1055},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1057,"icon":1058,"intro":1059,"items":1060},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1061,1064,1066,1069,1072,1075,1078],{"path":1062,"title":1063},"\u002Fdocs\u002Fgovernance","Overview",{"path":1065,"title":102},"\u002Fdocs\u002Fgovernance\u002Fpermissions",{"path":1067,"title":1068},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1070,"title":1071},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1073,"title":1074},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1076,"title":1077},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1079,"title":1080},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1082,"icon":1083,"intro":1084,"items":1085},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1086,1089,1092,1095,1098,1101,1104],{"path":1087,"title":1088},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1090,"title":1091},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1093,"title":1094},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1096,"title":1097},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1099,"title":1100},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1102,"title":1103},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1105,"title":1106},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1108,"icon":1109,"intro":1110,"items":1111},"Reference","reference","Release process and the remaining reference pages.",[1112],{"path":1113,"title":1114},"\u002Fdocs\u002Frelease-process","Release process",1793656371976]