[{"data":1,"prerenderedAt":2599},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fdeploy\u002Fminikube":3,"docs-nav":2378},{"id":4,"title":5,"body":6,"description":16,"extension":2370,"meta":2371,"navigation":2373,"path":2374,"seo":2375,"stem":2376,"__hash__":2377},"docs\u002Fdocs\u002Fdeploy\u002Fminikube.md","Try Tabularia on your computer with minikube",{"type":7,"value":8,"toc":2354},"minimark",[9,13,17,20,38,41,62,67,175,179,184,201,207,213,244,263,267,270,274,333,337,382,386,413,418,424,463,467,473,482,489,511,526,543,549,573,579,584,587,605,620,624,693,696,708,712,715,738,806,818,821,825,828,897,902,909,918,926,935,940,971,988,996,1000,1006,1024,1060,1078,1101,1105,1108,1124,1130,1151,1158,1176,1179,1193,1200,1208,1212,1215,1244,1254,1276,1288,1294,1317,1334,1342,1346,1349,1352,1360,1366,1436,1446,1474,1498,1515,1524,1528,1531,1537,1553,1581,1587,1607,1629,1644,1652,1670,1685,1719,1731,1739,1743,1752,1764,1767,1773,1785,1798,1807,1823,1832,1865,1880,1885,1897,1900,1904,1909,1925,1939,1947,1982,1990,2031,2040,2059,2072,2088,2103,2133,2146,2172,2183,2191,2224,2242,2266,2277,2292,2310,2315,2350],[10,11,5],"h1",{"id":12},"try-tabularia-on-your-computer-with-minikube",[14,15,16],"p",{},"This guide installs Tabularia on one computer, step by step. You do not need to know\nKubernetes: every command is given in full, and each step says what it does and how to\ncheck that it worked. It works on Windows, macOS and Linux.",[14,18,19],{},"What you get at the end:",[21,22,23,32,35],"ul",{},[24,25,26,27,31],"li",{},"Tabularia in your browser at ",[28,29,30],"code",{},"http:\u002F\u002Flocalhost:8080",", with you as its administrator;",[24,33,34],{},"your data kept in a bucket of your cloud object storage (Scaleway, AWS or any\nS3-compatible service), not on your laptop;",[24,36,37],{},"optionally, flows that run on your ClickHouse service, and Python and R scripts in\nflows.",[14,39,40],{},"Plan about an hour the first time, most of it waiting for downloads.",[42,43,44],"blockquote",{},[14,45,46,50,51,56,57,61],{},[47,48,49],"strong",{},"A trial, not a server."," Everything runs on your computer: when it sleeps or shuts\ndown, Tabularia stops. To install Tabularia for a team, on a real Kubernetes cluster,\nsee ",[52,53,55],"a",{"href":54},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",". To try it on one computer the way a company\nruns it (several nodes, a private registry), see ",[52,58,60],{"href":59},"\u002Fdocs\u002Fdeploy\u002Fkind","the kind guide",".",[63,64,66],"h2",{"id":65},"what-you-will-set-up","What you will set up",[68,69,70,86],"table",{},[71,72,73],"thead",{},[74,75,76,80,83],"tr",{},[77,78,79],"th",{},"Piece",[77,81,82],{},"What it is",[77,84,85],{},"Where it runs",[87,88,89,103,116,132,148,161],"tbody",{},[74,90,91,97,100],{},[92,93,94],"td",{},[47,95,96],{},"Docker",[92,98,99],{},"Runs the programs below in isolated boxes (containers)",[92,101,102],{},"your computer",[74,104,105,110,113],{},[92,106,107],{},[47,108,109],{},"minikube",[92,111,112],{},"A small Kubernetes: it starts and watches the containers",[92,114,115],{},"your computer, inside Docker",[74,117,118,123,129],{},[92,119,120],{},[47,121,122],{},"Tabularia",[92,124,125,126],{},"The application, installed with ",[47,127,128],{},"Helm",[92,130,131],{},"inside minikube",[74,133,134,143,146],{},[92,135,136,139,140],{},[47,137,138],{},"PostgreSQL"," and ",[47,141,142],{},"Valkey",[92,144,145],{},"Tabularia's own database and job queue",[92,147,131],{},[74,149,150,155,158],{},[92,151,152],{},[47,153,154],{},"Your bucket",[92,156,157],{},"Every dataset, upload and flow output",[92,159,160],{},"your cloud",[74,162,163,170,173],{},[92,164,165,166],{},"ClickHouse ",[167,168,169],"em",{},"(optional)",[92,171,172],{},"Runs flows on your ClickHouse service",[92,174,160],{},[63,176,178],{"id":177},"before-you-start","Before you start",[14,180,181],{},[47,182,183],{},"Your computer",[21,185,186,189,192,195,198],{},[24,187,188],{},"16 GB of memory (RAM), or 8 GB if you skip Python and R scripts;",[24,190,191],{},"4 processor cores;",[24,193,194],{},"40 GB of free disk space;",[24,196,197],{},"Windows 10 or 11, macOS 12 or later, or a recent Linux;",[24,199,200],{},"the right to install programs (only for step 1).",[14,202,203,206],{},[47,204,205],{},"Your cloud account",", with object storage. You will create a bucket and a key in step 4.",[14,208,209,212],{},[47,210,211],{},"A terminal",", the window where you type commands:",[21,214,215,228,238],{},[24,216,217,220,221,224,225,61],{},[47,218,219],{},"Windows",": open the Start menu, type ",[28,222,223],{},"PowerShell",", open ",[47,226,227],{},"Windows PowerShell",[24,229,230,233,234,237],{},[47,231,232],{},"macOS",": open ",[47,235,236],{},"Terminal"," (Applications → Utilities).",[24,239,240,243],{},[47,241,242],{},"Linux",": your usual terminal.",[14,245,246,247,139,250,253,254,257,258,139,260,262],{},"Copy each command exactly, one at a time, and press Enter. When a command differs\nbetween systems, the guide shows one block per system. Text between ",[28,248,249],{},"\u003C",[28,251,252],{},">",", such\nas ",[28,255,256],{},"\u003Cyour-password>",", is a placeholder: replace all of it, ",[28,259,249],{},[28,261,252],{}," included, with\nyour own value.",[63,264,266],{"id":265},"step-1--install-the-tools","Step 1 — Install the tools",[14,268,269],{},"You need four programs: Docker, minikube, kubectl (the command that talks to\nKubernetes) and Helm (the command that installs Tabularia).",[14,271,272],{},[47,273,219],{},[275,276,277,295,327],"ol",{},[24,278,279,280,283,284,290,291,294],{},"Install ",[47,281,282],{},"Docker Desktop"," from ",[52,285,289],{"href":286,"rel":287},"https:\u002F\u002Fwww.docker.com\u002Fproducts\u002Fdocker-desktop\u002F",[288],"nofollow","docker.com",".\nDuring the installation keep ",[47,292,293],{},"Use WSL 2"," selected. Restart the computer when asked,\nthen open Docker Desktop once and wait until it says it is running.",[24,296,297,298],{},"In PowerShell, install the other three:",[299,300,305],"pre",{"className":301,"code":302,"language":303,"meta":304,"style":304},"language-powershell shiki shiki-themes github-dark-dimmed github-light","winget install --exact --id Kubernetes.minikube\nwinget install --exact --id Kubernetes.kubectl\nwinget install --exact --id Helm.Helm\n","powershell","",[28,306,307,315,321],{"__ignoreMap":304},[308,309,312],"span",{"class":310,"line":311},"line",1,[308,313,314],{},"winget install --exact --id Kubernetes.minikube\n",[308,316,318],{"class":310,"line":317},2,[308,319,320],{},"winget install --exact --id Kubernetes.kubectl\n",[308,322,324],{"class":310,"line":323},3,[308,325,326],{},"winget install --exact --id Helm.Helm\n",[24,328,329,332],{},[47,330,331],{},"Close PowerShell and open it again",", so it finds the new commands.",[14,334,335],{},[47,336,232],{},[275,338,339,347],{},[24,340,279,341,283,343,346],{},[47,342,282],{},[52,344,289],{"href":286,"rel":345},[288],"\nand open it once.",[24,348,349,350,355,356],{},"With ",[52,351,354],{"href":352,"rel":353},"https:\u002F\u002Fbrew.sh",[288],"Homebrew",":",[299,357,361],{"className":358,"code":359,"language":360,"meta":304,"style":304},"language-bash shiki shiki-themes github-dark-dimmed github-light","brew install minikube kubectl helm\n","bash",[28,362,363],{"__ignoreMap":304},[308,364,365,369,373,376,379],{"class":310,"line":311},[308,366,368],{"class":367},"sqRhv","brew",[308,370,372],{"class":371},"sXfbr"," install",[308,374,375],{"class":371}," minikube",[308,377,378],{"class":371}," kubectl",[308,380,381],{"class":371}," helm\n",[14,383,384],{},[47,385,242],{},[14,387,388,389,394,395,400,401,406,407,412],{},"Install Docker Engine (",[52,390,393],{"href":391,"rel":392},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F",[288],"docs.docker.com\u002Fengine\u002Finstall","),\nthen minikube (",[52,396,399],{"href":397,"rel":398},"https:\u002F\u002Fminikube.sigs.k8s.io\u002Fdocs\u002Fstart\u002F",[288],"minikube.sigs.k8s.io","),\nkubectl (",[52,402,405],{"href":403,"rel":404},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Ftasks\u002Ftools\u002F",[288],"kubernetes.io",") and Helm\n(",[52,408,411],{"href":409,"rel":410},"https:\u002F\u002Fhelm.sh\u002Fdocs\u002Fintro\u002Finstall\u002F",[288],"helm.sh",") following their pages.",[42,414,415],{},[14,416,417],{},"Docker Desktop is free for personal use, education and small businesses. Larger\ncompanies need a paid Docker subscription: check with your IT department.",[14,419,420,423],{},[47,421,422],{},"Check:"," each of these prints a version number, not an error.",[299,425,427],{"className":358,"code":426,"language":360,"meta":304,"style":304},"docker version\nminikube version\nkubectl version --client\nhelm version\n",[28,428,429,437,443,455],{"__ignoreMap":304},[308,430,431,434],{"class":310,"line":311},[308,432,433],{"class":367},"docker",[308,435,436],{"class":371}," version\n",[308,438,439,441],{"class":310,"line":317},[308,440,109],{"class":367},[308,442,436],{"class":371},[308,444,445,448,451],{"class":310,"line":323},[308,446,447],{"class":367},"kubectl",[308,449,450],{"class":371}," version",[308,452,454],{"class":453},"swcJU"," --client\n",[308,456,458,461],{"class":310,"line":457},4,[308,459,460],{"class":367},"helm",[308,462,436],{"class":371},[63,464,466],{"id":465},"step-2--start-minikube","Step 2 — Start minikube",[14,468,469,472],{},[47,470,471],{},"Windows only: give Docker enough memory first."," Docker Desktop on Windows gets half of\nthe computer's memory by default, too little for 12 GB. In PowerShell:",[299,474,476],{"className":301,"code":475,"language":303,"meta":304,"style":304},"notepad \"$env:USERPROFILE\\.wslconfig\"\n",[28,477,478],{"__ignoreMap":304},[308,479,480],{"class":310,"line":311},[308,481,475],{},[14,483,484,485,488],{},"Notepad asks to create the file: answer ",[47,486,487],{},"Yes",", write these two lines, save, close:",[299,490,494],{"className":491,"code":492,"language":493,"meta":304,"style":304},"language-ini shiki shiki-themes github-dark-dimmed github-light","[wsl2]\nmemory=14GB\n","ini",[28,495,496,501],{"__ignoreMap":304},[308,497,498],{"class":310,"line":311},[308,499,500],{"class":367},"[wsl2]\n",[308,502,503,507],{"class":310,"line":317},[308,504,506],{"class":505},"s6PUj","memory",[308,508,510],{"class":509},"ssh_m","=14GB\n",[14,512,513,514,517,518,521,522,525],{},"Then quit Docker Desktop (its icon near the clock → ",[47,515,516],{},"Quit","), run ",[28,519,520],{},"wsl --shutdown",", and\nopen Docker Desktop again. On a computer with 8 GB, skip this and use ",[28,523,524],{},"--memory=6g"," below.",[14,527,528,531,532,535,536,539,540,61],{},[47,529,530],{},"macOS only:"," in Docker Desktop → ",[47,533,534],{},"Settings"," → ",[47,537,538],{},"Resources",", set Memory to at least\n14 GB (6 GB on an 8 GB computer), then ",[47,541,542],{},"Apply & restart",[14,544,545,548],{},[47,546,547],{},"Start minikube"," (all systems):",[299,550,552],{"className":358,"code":551,"language":360,"meta":304,"style":304},"minikube start --driver=docker --cpus=4 --memory=12g --disk-size=40g\n",[28,553,554],{"__ignoreMap":304},[308,555,556,558,561,564,567,570],{"class":310,"line":311},[308,557,109],{"class":367},[308,559,560],{"class":371}," start",[308,562,563],{"class":453}," --driver=docker",[308,565,566],{"class":453}," --cpus=4",[308,568,569],{"class":453}," --memory=12g",[308,571,572],{"class":453}," --disk-size=40g\n",[14,574,575,576,578],{},"Without Python and R scripts, ",[28,577,524],{}," is enough. The first start downloads about\n1 GB and takes a few minutes.",[42,580,581],{},[14,582,583],{},"Choose the memory now: minikube keeps the size it was created with. Changing it later\nmeans deleting minikube and starting again from this step.",[14,585,586],{},"Then turn on the component that brings the browser to Tabularia:",[299,588,590],{"className":358,"code":589,"language":360,"meta":304,"style":304},"minikube addons enable ingress\n",[28,591,592],{"__ignoreMap":304},[308,593,594,596,599,602],{"class":310,"line":311},[308,595,109],{"class":367},[308,597,598],{"class":371}," addons",[308,600,601],{"class":371}," enable",[308,603,604],{"class":371}," ingress\n",[14,606,607,609,610,613,614,616,617,61],{},[47,608,422],{}," ",[28,611,612],{},"kubectl get nodes"," shows one line, ",[28,615,109],{},", with STATUS ",[28,618,619],{},"Ready",[63,621,623],{"id":622},"step-3--download-tabularia","Step 3 — Download Tabularia",[275,625,626,634,644,655],{},[24,627,628,629,61],{},"Open ",[52,630,633],{"href":631,"rel":632},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Freleases\u002Flatest",[288],"the latest release",[24,635,636,637,640,641,61],{},"Under ",[47,638,639],{},"Assets",", click ",[47,642,643],{},"Source code (zip)",[24,645,646,647,650,651,654],{},"Unzip it, for example in your Documents folder. You get a folder such as\n",[28,648,649],{},"Tabularia-1.3.0",", with a folder ",[28,652,653],{},"infrastructure"," inside.",[24,656,657,658,661,662],{},"Open your terminal ",[47,659,660],{},"in that folder",":\n",[21,663,664,676,684],{},[24,665,666,668,669,672,673,61],{},[47,667,219],{},": open the folder in File Explorer, right-click an empty area,\n",[47,670,671],{},"Open in Terminal",". On Windows 10: hold Shift, right-click, ",[47,674,675],{},"Open PowerShell\nwindow here",[24,677,678,680,681,61],{},[47,679,232],{},": in Finder, right-click the folder → ",[47,682,683],{},"New Terminal at Folder",[24,685,686,688,689,692],{},[47,687,242],{},": ",[28,690,691],{},"cd"," into it.",[14,694,695],{},"Every command from here on runs in that folder.",[14,697,698,609,700,703,704,707],{},[47,699,422],{},[28,701,702],{},"helm show chart infrastructure\u002Fhelm\u002Ftabularia"," prints the chart's name,\n",[28,705,706],{},"tabularia",", and its version.",[63,709,711],{"id":710},"step-4--prepare-your-cloud-bucket","Step 4 — Prepare your cloud bucket",[14,713,714],{},"Tabularia keeps every dataset, upload and result in an S3-compatible bucket. In your\ncloud provider's console:",[275,716,717,726,732],{},[24,718,719,722,723,61],{},[47,720,721],{},"Create a bucket",", private (not public), in the region closest to you. Choose a\nname of your own, for example ",[28,724,725],{},"tabularia-yourcompany",[24,727,728,731],{},[47,729,730],{},"Create an access key and its secret key"," allowed to read, write, list and delete\nobjects in that bucket. Copy both: the secret key is shown only once.",[24,733,734,737],{},[47,735,736],{},"Note the endpoint and the region"," of the bucket:",[68,739,740,753],{},[71,741,742],{},[74,743,744,747,750],{},[77,745,746],{},"Provider",[77,748,749],{},"Endpoint",[77,751,752],{},"Region, for example",[87,754,755,779,795],{},[74,756,757,760,774],{},[92,758,759],{},"Scaleway",[92,761,762,765,766,769,770,773],{},[28,763,764],{},"https:\u002F\u002Fs3.fr-par.scw.cloud"," (or ",[28,767,768],{},"nl-ams",", ",[28,771,772],{},"pl-waw",")",[92,775,776],{},[28,777,778],{},"fr-par",[74,780,781,784,790],{},[92,782,783],{},"AWS",[92,785,786,789],{},[28,787,788],{},"https:\u002F\u002Fs3.eu-west-1.amazonaws.com"," (your region)",[92,791,792],{},[28,793,794],{},"eu-west-1",[74,796,797,800,803],{},[92,798,799],{},"Other S3-compatible",[92,801,802],{},"the S3 address in your provider's documentation",[92,804,805],{},"its region",[42,807,808],{},[14,809,810,813,814,817],{},[47,811,812],{},"Scaleway:"," an API key works on its ",[47,815,816],{},"preferred project"," for Object Storage. When\nyou create the key (IAM → API keys), choose the project that holds the bucket.\nOtherwise the key is valid but Tabularia cannot see the bucket.",[14,819,820],{},"This bucket is your data. Costs are your provider's storage and traffic prices.",[63,822,824],{"id":823},"step-5--create-your-keys-and-passwords","Step 5 — Create your keys and passwords",[14,826,827],{},"Tabularia needs three secret values that you generate once, plus a password you choose.\nOpen a text file (or your password manager) to keep them; you will paste them in step 7.",[68,829,830,843],{},[71,831,832],{},[74,833,834,837,840],{},[77,835,836],{},"Name",[77,838,839],{},"What it does",[77,841,842],{},"How to make it",[87,844,845,858,871,884],{},[74,846,847,852,855],{},[92,848,849],{},[28,850,851],{},"fernetKey",[92,853,854],{},"Encrypts the passwords of the connections people save",[92,856,857],{},"command A",[74,859,860,865,868],{},[92,861,862],{},[28,863,864],{},"jwtSecret",[92,866,867],{},"Signs the sign-in sessions",[92,869,870],{},"command B",[74,872,873,878,881],{},[92,874,875],{},[28,876,877],{},"dbPassword",[92,879,880],{},"Password of Tabularia's PostgreSQL database",[92,882,883],{},"command B, run again",[74,885,886,891,894],{},[92,887,888],{},[28,889,890],{},"adminPassword",[92,892,893],{},"Your password in Tabularia",[92,895,896],{},"choose one: 12 characters or more, not a common one",[14,898,899],{},[47,900,901],{},"Windows (PowerShell)",[14,903,904,905,908],{},"Command A, the Fernet key (44 characters, ending with ",[28,906,907],{},"=","):",[299,910,912],{"className":301,"code":911,"language":303,"meta":304,"style":304},"$b = New-Object byte[] 32; [Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($b); [Convert]::ToBase64String($b).Replace('+','-').Replace('\u002F','_')\n",[28,913,914],{"__ignoreMap":304},[308,915,916],{"class":310,"line":311},[308,917,911],{},[14,919,920,921,923,924,908],{},"Command B, a 64-character code (run it twice: once for ",[28,922,864],{},", once for\n",[28,925,877],{},[299,927,929],{"className":301,"code":928,"language":303,"meta":304,"style":304},"$b = New-Object byte[] 32; [Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($b); -join ($b | ForEach-Object { $_.ToString('x2') })\n",[28,930,931],{"__ignoreMap":304},[308,932,933],{"class":310,"line":311},[308,934,928],{},[14,936,937],{},[47,938,939],{},"macOS and Linux",[299,941,943],{"className":358,"code":942,"language":360,"meta":304,"style":304},"openssl rand -base64 32 | tr '+\u002F' '-_'\n",[28,944,945],{"__ignoreMap":304},[308,946,947,950,953,956,959,962,965,968],{"class":310,"line":311},[308,948,949],{"class":367},"openssl",[308,951,952],{"class":371}," rand",[308,954,955],{"class":453}," -base64",[308,957,958],{"class":453}," 32",[308,960,961],{"class":505}," |",[308,963,964],{"class":367}," tr",[308,966,967],{"class":371}," '+\u002F'",[308,969,970],{"class":371}," '-_'\n",[299,972,974],{"className":358,"code":973,"language":360,"meta":304,"style":304},"openssl rand -hex 32\n",[28,975,976],{"__ignoreMap":304},[308,977,978,980,982,985],{"class":310,"line":311},[308,979,949],{"class":367},[308,981,952],{"class":371},[308,983,984],{"class":453}," -hex",[308,986,987],{"class":453}," 32\n",[42,989,990],{},[14,991,992,995],{},[47,993,994],{},"Keep the Fernet key."," If it changes, the passwords saved in Tabularia's connections\ncan no longer be read and must be typed again.",[63,997,999],{"id":998},"step-6--start-postgresql-and-valkey","Step 6 — Start PostgreSQL and Valkey",[14,1001,1002,1003,1005],{},"These two programs hold Tabularia's own records and its job queue. Create their space\nin minikube, give PostgreSQL its password (the ",[28,1004,877],{}," of step 5), and start them:",[299,1007,1009],{"className":358,"code":1008,"language":360,"meta":304,"style":304},"kubectl create namespace tabularia-deps\n",[28,1010,1011],{"__ignoreMap":304},[308,1012,1013,1015,1018,1021],{"class":310,"line":311},[308,1014,447],{"class":367},[308,1016,1017],{"class":371}," create",[308,1019,1020],{"class":371}," namespace",[308,1022,1023],{"class":371}," tabularia-deps\n",[299,1025,1027],{"className":358,"code":1026,"language":360,"meta":304,"style":304},"kubectl create secret generic postgres --namespace tabularia-deps --from-literal=password=\u003CdbPassword>\n",[28,1028,1029],{"__ignoreMap":304},[308,1030,1031,1033,1035,1038,1041,1044,1047,1050,1053,1055,1057],{"class":310,"line":311},[308,1032,447],{"class":367},[308,1034,1017],{"class":371},[308,1036,1037],{"class":371}," secret",[308,1039,1040],{"class":371}," generic",[308,1042,1043],{"class":371}," postgres",[308,1045,1046],{"class":453}," --namespace",[308,1048,1049],{"class":371}," tabularia-deps",[308,1051,1052],{"class":453}," --from-literal=password=",[308,1054,249],{"class":505},[308,1056,877],{"class":453},[308,1058,1059],{"class":505},">\n",[299,1061,1063],{"className":358,"code":1062,"language":360,"meta":304,"style":304},"kubectl apply -f infrastructure\u002Fminikube\u002Fdependencies.yaml\n",[28,1064,1065],{"__ignoreMap":304},[308,1066,1067,1069,1072,1075],{"class":310,"line":311},[308,1068,447],{"class":367},[308,1070,1071],{"class":371}," apply",[308,1073,1074],{"class":453}," -f",[308,1076,1077],{"class":371}," infrastructure\u002Fminikube\u002Fdependencies.yaml\n",[14,1079,1080,1082,1083,1086,1087,139,1090,1093,1094,1097,1098,61],{},[47,1081,422],{}," after a minute, ",[28,1084,1085],{},"kubectl get pods --namespace tabularia-deps"," shows two lines,\n",[28,1088,1089],{},"postgres-…",[28,1091,1092],{},"valkey-…",", both with READY ",[28,1095,1096],{},"1\u002F1"," and STATUS ",[28,1099,1100],{},"Running",[63,1102,1104],{"id":1103},"step-7--write-your-settings","Step 7 — Write your settings",[14,1106,1107],{},"Copy the example settings file (the same command works on all systems):",[299,1109,1111],{"className":358,"code":1110,"language":360,"meta":304,"style":304},"cp infrastructure\u002Fminikube\u002Fvalues.example.yaml my-values.yaml\n",[28,1112,1113],{"__ignoreMap":304},[308,1114,1115,1118,1121],{"class":310,"line":311},[308,1116,1117],{"class":367},"cp",[308,1119,1120],{"class":371}," infrastructure\u002Fminikube\u002Fvalues.example.yaml",[308,1122,1123],{"class":371}," my-values.yaml\n",[14,1125,628,1126,1129],{},[28,1127,1128],{},"my-values.yaml"," in a plain text editor:",[21,1131,1132,1139,1146],{},[24,1133,1134,688,1136],{},[47,1135,219],{},[28,1137,1138],{},"notepad my-values.yaml",[24,1140,1141,688,1143],{},[47,1142,232],{},[28,1144,1145],{},"open -e my-values.yaml",[24,1147,1148,1150],{},[47,1149,242],{},": your usual editor.",[14,1152,1153,1154,1157],{},"Replace every ",[28,1155,1156],{},"\u003C…>",": the bucket of step 4, the keys of step 5, your email. Keep the\ndouble quotes around each value. For example:",[299,1159,1163],{"className":1160,"code":1161,"language":1162,"meta":304,"style":304},"language-yaml shiki shiki-themes github-dark-dimmed github-light","    endpoint: \"\u003Chttps:\u002F\u002Fs3.fr-par.scw.cloud>\"\n","yaml",[28,1164,1165],{"__ignoreMap":304},[308,1166,1167,1171,1173],{"class":310,"line":311},[308,1168,1170],{"class":1169},"shb1k","    endpoint",[308,1172,688],{"class":509},[308,1174,1175],{"class":371},"\"\u003Chttps:\u002F\u002Fs3.fr-par.scw.cloud>\"\n",[14,1177,1178],{},"becomes",[299,1180,1182],{"className":1160,"code":1181,"language":1162,"meta":304,"style":304},"    endpoint: \"https:\u002F\u002Fs3.fr-par.scw.cloud\"\n",[28,1183,1184],{"__ignoreMap":304},[308,1185,1186,1188,1190],{"class":310,"line":311},[308,1187,1170],{"class":1169},[308,1189,688],{"class":509},[308,1191,1192],{"class":371},"\"https:\u002F\u002Fs3.fr-par.scw.cloud\"\n",[14,1194,1195,1196,1199],{},"Leave the lines that start with ",[28,1197,1198],{},"#"," as they are for now: they are the optional parts of\nsteps 9 and 10.",[42,1201,1202],{},[14,1203,1204,1207],{},[47,1205,1206],{},"Spaces matter in this file."," Do not change how far each line starts from the left,\nand never use the Tab key in it.",[63,1209,1211],{"id":1210},"step-8--install-tabularia-and-open-it","Step 8 — Install Tabularia and open it",[14,1213,1214],{},"Install it:",[299,1216,1218],{"className":358,"code":1217,"language":360,"meta":304,"style":304},"helm install tabularia infrastructure\u002Fhelm\u002Ftabularia --namespace tabularia --create-namespace --values my-values.yaml\n",[28,1219,1220],{"__ignoreMap":304},[308,1221,1222,1224,1226,1229,1232,1234,1236,1239,1242],{"class":310,"line":311},[308,1223,460],{"class":367},[308,1225,372],{"class":371},[308,1227,1228],{"class":371}," tabularia",[308,1230,1231],{"class":371}," infrastructure\u002Fhelm\u002Ftabularia",[308,1233,1046],{"class":453},[308,1235,1228],{"class":371},[308,1237,1238],{"class":453}," --create-namespace",[308,1240,1241],{"class":453}," --values",[308,1243,1123],{"class":371},[14,1245,1246,1247,139,1250,1253],{},"Helm answers with a few lines starting with ",[28,1248,1249],{},"NAME: tabularia",[28,1251,1252],{},"STATUS: deployed",".\nminikube now downloads Tabularia's programs, about 1.5 GB, and starts them. Follow it:",[299,1255,1257],{"className":358,"code":1256,"language":360,"meta":304,"style":304},"kubectl get pods --namespace tabularia --watch\n",[28,1258,1259],{"__ignoreMap":304},[308,1260,1261,1263,1266,1269,1271,1273],{"class":310,"line":311},[308,1262,447],{"class":367},[308,1264,1265],{"class":371}," get",[308,1267,1268],{"class":371}," pods",[308,1270,1046],{"class":453},[308,1272,1228],{"class":371},[308,1274,1275],{"class":453}," --watch\n",[14,1277,1278,1279,1097,1281,1283,1284,1287],{},"Wait until every line shows READY ",[28,1280,1096],{},[28,1282,1100],{}," (5 to 15 minutes the\nfirst time), then press ",[47,1285,1286],{},"Ctrl+C"," to stop watching.",[14,1289,1290,1293],{},[47,1291,1292],{},"Open the door from your browser to Tabularia."," This command keeps running while you\nuse Tabularia; leave its window open:",[299,1295,1297],{"className":358,"code":1296,"language":360,"meta":304,"style":304},"kubectl port-forward --namespace ingress-nginx service\u002Fingress-nginx-controller 8080:80\n",[28,1298,1299],{"__ignoreMap":304},[308,1300,1301,1303,1306,1308,1311,1314],{"class":310,"line":311},[308,1302,447],{"class":367},[308,1304,1305],{"class":371}," port-forward",[308,1307,1046],{"class":453},[308,1309,1310],{"class":371}," ingress-nginx",[308,1312,1313],{"class":371}," service\u002Fingress-nginx-controller",[308,1315,1316],{"class":371}," 8080:80\n",[14,1318,628,1319,1324,1325,1328,1329,1331,1332,61],{},[47,1320,1321],{},[52,1322,30],{"href":30,"rel":1323},[288]," in your browser and sign in with the ",[28,1326,1327],{},"adminEmail"," and\n",[28,1330,890],{}," of ",[28,1333,1128],{},[14,1335,1336,1337,1341],{},"Tabularia is installed. The ",[52,1338,1340],{"href":1339},"\u002Fdocs\u002Fgetting-started-docker-compose","getting started walkthrough","\nshows how to upload a file of your own and build a first flow (its sections 6b and 7):\nthe screens are the same.",[63,1343,1345],{"id":1344},"step-9--optional-run-flows-on-clickhouse","Step 9 — Optional: run flows on ClickHouse",[14,1347,1348],{},"Tabularia can send the work of a flow to your ClickHouse service instead of doing it on\nyour computer. ClickHouse then reads and writes the files of your bucket directly, so\nthe service should be in the same cloud and region as the bucket.",[14,1350,1351],{},"You need:",[21,1353,1354,1357],{},[24,1355,1356],{},"a ClickHouse service reachable over the internet with HTTPS (port 8443);",[24,1358,1359],{},"a ClickHouse user and its password.",[14,1361,1362,1365],{},[47,1363,1364],{},"1. In ClickHouse",", in your service's SQL console, as its administrator user:",[299,1367,1371],{"className":1368,"code":1369,"language":1370,"meta":304,"style":304},"language-sql shiki shiki-themes github-dark-dimmed github-light","CREATE DATABASE IF NOT EXISTS tabularia;\nCREATE NAMED COLLECTION tabularia_s3 AS\n    access_key_id = '\u003Caccess key of the bucket>',\n    secret_access_key = '\u003Csecret key of the bucket>';\n","sql",[28,1372,1373,1394,1410,1423],{"__ignoreMap":304},[308,1374,1375,1378,1381,1385,1388,1391],{"class":310,"line":311},[308,1376,1377],{"class":505},"CREATE",[308,1379,1380],{"class":505}," DATABASE",[308,1382,1384],{"class":1383},"saVmf"," IF",[308,1386,1387],{"class":505}," NOT",[308,1389,1390],{"class":505}," EXISTS",[308,1392,1393],{"class":509}," tabularia;\n",[308,1395,1396,1398,1401,1404,1407],{"class":310,"line":317},[308,1397,1377],{"class":505},[308,1399,1400],{"class":509}," NAMED ",[308,1402,1403],{"class":505},"COLLECTION",[308,1405,1406],{"class":509}," tabularia_s3 ",[308,1408,1409],{"class":505},"AS\n",[308,1411,1412,1415,1417,1420],{"class":310,"line":323},[308,1413,1414],{"class":509},"    access_key_id ",[308,1416,907],{"class":505},[308,1418,1419],{"class":371}," '\u003Caccess key of the bucket>'",[308,1421,1422],{"class":509},",\n",[308,1424,1425,1428,1430,1433],{"class":310,"line":457},[308,1426,1427],{"class":509},"    secret_access_key ",[308,1429,907],{"class":505},[308,1431,1432],{"class":371}," '\u003Csecret key of the bucket>'",[308,1434,1435],{"class":509},";\n",[14,1437,1438,1439,1442,1443,61],{},"The ",[167,1440,1441],{},"named collection"," keeps the bucket's keys inside ClickHouse, so they never travel\nin the queries Tabularia sends. If the user Tabularia signs in with is not the\nadministrator, also run ",[28,1444,1445],{},"GRANT NAMED COLLECTION ON tabularia_s3 TO \u003Cclickhouse-user>;",[14,1447,1448,1453,1454,1457,1458,1461,1462,1465,1466,1469,1470,1473],{},[47,1449,1450,1451],{},"2. In ",[28,1452,1128],{},", remove the ",[28,1455,1456],{},"# "," at the start of the ",[28,1459,1460],{},"clickhouse:"," block and of\nthe ",[28,1463,1464],{},"clickhousePassword"," line, keeping the spaces after it so each line starts where its\nneighbours do. Fill in the host, the user, the password, and as ",[28,1467,1468],{},"s3Endpoint"," the same\naddress as ",[28,1471,1472],{},"storage.endpoint",". Then apply the change:",[299,1475,1477],{"className":358,"code":1476,"language":360,"meta":304,"style":304},"helm upgrade tabularia infrastructure\u002Fhelm\u002Ftabularia --namespace tabularia --values my-values.yaml\n",[28,1478,1479],{"__ignoreMap":304},[308,1480,1481,1483,1486,1488,1490,1492,1494,1496],{"class":310,"line":311},[308,1482,460],{"class":367},[308,1484,1485],{"class":371}," upgrade",[308,1487,1228],{"class":371},[308,1489,1231],{"class":371},[308,1491,1046],{"class":453},[308,1493,1228],{"class":371},[308,1495,1241],{"class":453},[308,1497,1123],{"class":371},[14,1499,1500,1503,1504,1507,1508,1511,1512,1514],{},[47,1501,1502],{},"3. In Tabularia",", after a minute: ",[47,1505,1506],{},"Administration → Engines"," lists ClickHouse.\nChoose it as your ",[47,1509,1510],{},"Preferred engine"," in ",[47,1513,534],{},", or as the engine of a flow.",[14,1516,1517,1519,1520,1523],{},[47,1518,422],{}," with ClickHouse as your preferred engine, open a datasource in the ",[47,1521,1522],{},"Viewer",":\nits rows appear.",[63,1525,1527],{"id":1526},"step-10--optional-python-and-r-in-flows","Step 10 — Optional: Python and R in flows",[14,1529,1530],{},"A Script node runs Python or R code as a step of a flow, in an environment your\nadministrator prepares. On minikube it needs the 12 GB of step 2.",[14,1532,1533,1536],{},[47,1534,1535],{},"1. A place for the environments' images."," minikube has one built in:",[299,1538,1540],{"className":358,"code":1539,"language":360,"meta":304,"style":304},"minikube addons enable registry\n",[28,1541,1542],{"__ignoreMap":304},[308,1543,1544,1546,1548,1550],{"class":310,"line":311},[308,1545,109],{"class":367},[308,1547,598],{"class":371},[308,1549,601],{"class":371},[308,1551,1552],{"class":371}," registry\n",[299,1554,1556],{"className":358,"code":1555,"language":360,"meta":304,"style":304},"kubectl get service registry --namespace kube-system -o jsonpath=\"{.spec.clusterIP}\"\n",[28,1557,1558],{"__ignoreMap":304},[308,1559,1560,1562,1564,1567,1570,1572,1575,1578],{"class":310,"line":311},[308,1561,447],{"class":367},[308,1563,1265],{"class":371},[308,1565,1566],{"class":371}," service",[308,1568,1569],{"class":371}," registry",[308,1571,1046],{"class":453},[308,1573,1574],{"class":371}," kube-system",[308,1576,1577],{"class":453}," -o",[308,1579,1580],{"class":371}," jsonpath=\"{.spec.clusterIP}\"\n",[14,1582,1583,1584,61],{},"The second command prints an address such as ",[28,1585,1586],{},"10.101.227.179",[14,1588,1589,1453,1593,1457,1595,1598,1599,1602,1603,1606],{},[47,1590,1450,1591],{},[28,1592,1128],{},[28,1594,1456],{},[28,1596,1597],{},"scripts:"," block (keeping\nthe spaces after it), put that address in ",[28,1600,1601],{},"repository"," (for example\n",[28,1604,1605],{},"\"10.101.227.179:80\u002Ftabularia\"","), then apply:",[299,1608,1609],{"className":358,"code":1476,"language":360,"meta":304,"style":304},[28,1610,1611],{"__ignoreMap":304},[308,1612,1613,1615,1617,1619,1621,1623,1625,1627],{"class":310,"line":311},[308,1614,460],{"class":367},[308,1616,1485],{"class":371},[308,1618,1228],{"class":371},[308,1620,1231],{"class":371},[308,1622,1046],{"class":453},[308,1624,1228],{"class":371},[308,1626,1241],{"class":453},[308,1628,1123],{"class":371},[14,1630,1631,1634,1635,1638,1639,1643],{},[47,1632,1633],{},"3. A second bucket, for the scripts only."," In your cloud console, create a bucket\nsuch as ",[28,1636,1637],{},"tabularia-yourcompany-scripts",", and a key that can read, write and delete\nobjects in it but not list it. Add a rule that deletes its objects after one day.\n",[52,1640,1642],{"href":1641},"\u002Fdocs\u002Fscripting#the-scripts-bucket","The scripts bucket"," explains why and shows the\npolicies for each provider.",[14,1645,1646,769,1649,355],{},[47,1647,1648],{},"4. In Tabularia",[47,1650,1651],{},"Administration → Scripting environments",[275,1653,1654,1661,1664],{},[24,1655,1656,1657,1660],{},"fill in the scripts bucket (endpoint, region, bucket, the two keys) and press\n",[47,1658,1659],{},"Test",";",[24,1662,1663],{},"create an environment, for example Python 3.12 with the packages your scripts need;",[24,1665,1666,1667,1669],{},"wait until it is ",[47,1668,619],{},": a few minutes for Python, ten or more for R, whose\npackages are compiled.",[14,1671,1672,1673,1676,1677,1681,1682,61],{},"Then add a ",[47,1674,1675],{},"Script"," node to a flow. ",[52,1678,1680],{"href":1679},"\u002Fdocs\u002Fscripting","Python and R in flows"," explains the\nnode, the editor and the variables. You can also keep a script on its own in a folder,\nwith its versions: ",[47,1683,1684],{},"Explore → New → Script (Python or R)",[14,1686,1687,1688,1691,1692,1695,1696,1699,1700,1702,1703,1706,1707,1709,1710,1713,1714,1718],{},"A Python environment also runs ",[47,1689,1690],{},"marimo notebooks",", apps your colleagues open in the\nbrowser: ",[47,1693,1694],{},"Explore → New → Notebook (marimo)",". They open from an address of their own,\n",[28,1697,1698],{},"http:\u002F\u002Fnotebooks.localhost:8080",", which the ",[28,1701,1597],{}," block already names: your browser\nfinds it on your computer by itself, through the same ",[28,1704,1705],{},"port-forward",". If you changed the\nport of the ",[28,1708,1705],{},", change it in ",[28,1711,1712],{},"origin"," too. ",[52,1715,1717],{"href":1716},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as\napps"," explains them, and why the separate address.",[42,1720,1721],{},[14,1722,1723,1724,1726,1727,1730],{},"The registry's address changes if you turn the add-on off and on again. Then put the\nnew address in ",[28,1725,1128],{}," and run the ",[28,1728,1729],{},"helm upgrade"," of point 2 again.",[42,1732,1733],{},[14,1734,1735,1736,1738],{},"The chart also adds a network rule that keeps the scripts and the image builds away\nfrom Tabularia's own pods and from the cloud's metadata address. minikube's network\ndoes not apply such rules: here the rule is written but has no effect. A company\ncluster applies it; ",[52,1737,60],{"href":59}," builds one on your computer.",[63,1740,1742],{"id":1741},"every-day","Every day",[14,1744,1745,1748,1749,1751],{},[47,1746,1747],{},"Stop",": press Ctrl+C in the window of the ",[28,1750,1705],{},", then:",[299,1753,1755],{"className":358,"code":1754,"language":360,"meta":304,"style":304},"minikube stop\n",[28,1756,1757],{"__ignoreMap":304},[308,1758,1759,1761],{"class":310,"line":311},[308,1760,109],{"class":367},[308,1762,1763],{"class":371}," stop\n",[14,1765,1766],{},"Nothing is lost: Tabularia's records stay on minikube's disk, your data in the bucket.",[14,1768,1769,1772],{},[47,1770,1771],{},"Start again",": open Docker Desktop, then:",[299,1774,1776],{"className":358,"code":1775,"language":360,"meta":304,"style":304},"minikube start\n",[28,1777,1778],{"__ignoreMap":304},[308,1779,1780,1782],{"class":310,"line":311},[308,1781,109],{"class":367},[308,1783,1784],{"class":371}," start\n",[14,1786,1787,1788,1791,1792,1794,1795,61],{},"Wait for the pods as in step 8 (",[28,1789,1790],{},"kubectl get pods --namespace tabularia","), run the\n",[28,1793,1705],{}," command again, and open ",[52,1796,30],{"href":30,"rel":1797},[288],[14,1799,1800,688,1803,1806],{},[47,1801,1802],{},"See what runs",[47,1804,1805],{},"Administration → Cluster"," in Tabularia shows its pods, and the\nscripts and containers while they run, refreshed every three seconds: their state,\nrestarts, CPU and memory, and the warning events. CPU and memory need minikube's\nmetrics-server, turned on once:",[299,1808,1810],{"className":358,"code":1809,"language":360,"meta":304,"style":304},"minikube addons enable metrics-server\n",[28,1811,1812],{"__ignoreMap":304},[308,1813,1814,1816,1818,1820],{"class":310,"line":311},[308,1815,109],{"class":367},[308,1817,598],{"class":371},[308,1819,601],{"class":371},[308,1821,1822],{"class":371}," metrics-server\n",[14,1824,1825,1828,1829,1831],{},[47,1826,1827],{},"Install a newer release",": back up the database first, then download and unzip the\nrelease as in step 3, copy ",[28,1830,1128],{}," into the new folder, open the terminal there,\nand run:",[299,1833,1835],{"className":358,"code":1834,"language":360,"meta":304,"style":304},"helm upgrade tabularia infrastructure\u002Fhelm\u002Ftabularia --namespace tabularia --values my-values.yaml --wait --timeout 20m\n",[28,1836,1837],{"__ignoreMap":304},[308,1838,1839,1841,1843,1845,1847,1849,1851,1853,1856,1859,1862],{"class":310,"line":311},[308,1840,460],{"class":367},[308,1842,1485],{"class":371},[308,1844,1228],{"class":371},[308,1846,1231],{"class":371},[308,1848,1046],{"class":453},[308,1850,1228],{"class":371},[308,1852,1241],{"class":453},[308,1854,1855],{"class":371}," my-values.yaml",[308,1857,1858],{"class":453}," --wait",[308,1860,1861],{"class":453}," --timeout",[308,1863,1864],{"class":371}," 20m\n",[14,1866,1867,1868,1871,1872,1875,1876,61],{},"Then reload the page in the browser with ",[47,1869,1870],{},"Ctrl+Shift+R"," (macOS: ",[47,1873,1874],{},"Cmd+Shift+R","): a\ntab left open keeps running the old version. The backup, the checks after the upgrade\nand the way back are in ",[52,1877,1879],{"href":1878},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading Tabularia",[14,1881,1882,355],{},[47,1883,1884],{},"Remove everything",[299,1886,1888],{"className":358,"code":1887,"language":360,"meta":304,"style":304},"minikube delete\n",[28,1889,1890],{"__ignoreMap":304},[308,1891,1892,1894],{"class":310,"line":311},[308,1893,109],{"class":367},[308,1895,1896],{"class":371}," delete\n",[14,1898,1899],{},"This deletes minikube with Tabularia, PostgreSQL and Valkey. Your buckets stay in your\ncloud: delete them from your provider's console if you no longer need them.",[63,1901,1903],{"id":1902},"when-something-goes-wrong","When something goes wrong",[14,1905,1906],{},[47,1907,1908],{},"See the state of everything:",[299,1910,1912],{"className":358,"code":1911,"language":360,"meta":304,"style":304},"kubectl get pods --all-namespaces\n",[28,1913,1914],{"__ignoreMap":304},[308,1915,1916,1918,1920,1922],{"class":310,"line":311},[308,1917,447],{"class":367},[308,1919,1265],{"class":371},[308,1921,1268],{"class":371},[308,1923,1924],{"class":453}," --all-namespaces\n",[14,1926,1927,1928,1097,1930,1932,1933,139,1935,1938],{},"A healthy installation shows READY ",[28,1929,1096],{},[28,1931,1100],{}," on every line of the\nnamespaces ",[28,1934,706],{},[28,1936,1937],{},"tabularia-deps",". The table below starts from what you see.",[14,1940,1941],{},[47,1942,1943,1946],{},[28,1944,1945],{},"minikube start"," fails",[21,1948,1949,1963,1976],{},[24,1950,1951,1954,1955,1958,1959,1962],{},[167,1952,1953],{},"\"Virtualization is not enabled\""," or ",[167,1956,1957],{},"\"WSL 2 is not installed\""," (Windows): turn on\nvirtualization in the computer's BIOS settings (ask IT), or run ",[28,1960,1961],{},"wsl --install"," in a\nPowerShell opened as administrator, restart, and try again.",[24,1964,1965,1954,1968,1971,1972,1975],{},[167,1966,1967],{},"\"Docker Desktop has only … memory\"",[167,1969,1970],{},"\"more than your system limit\"",": Docker has less\nmemory than ",[28,1973,1974],{},"--memory"," asks. Raise Docker's memory (step 2) or ask minikube for less.",[24,1977,1978,1981],{},[167,1979,1980],{},"Docker is not running",": open Docker Desktop and wait until it is ready.",[14,1983,1984],{},[47,1985,1986,1989],{},[28,1987,1988],{},"helm install"," stops with an error",[21,1991,1992,2001,2010],{},[24,1993,1994,1997,1998,2000],{},[167,1995,1996],{},"\"secrets.… is required\"",": that value of ",[28,1999,1128],{}," is empty.",[24,2002,2003,2006,2007,61],{},[167,2004,2005],{},"\"yaml: line N: …\"",": the file's spacing is broken around line N: a Tab, a missing\nquote, or a line moved left or right. Compare it with ",[28,2008,2009],{},"values.example.yaml",[24,2011,2012,2015,2016,2018,2019,2022,2023,2026,2027,2030],{},[167,2013,2014],{},"\"cannot reuse a name that is still in use\"",": Tabularia is already installed. Use\n",[28,2017,1729],{}," (same command, ",[28,2020,2021],{},"upgrade"," instead of ",[28,2024,2025],{},"install",", without\n",[28,2028,2029],{},"--create-namespace",").",[14,2032,2033,2039],{},[47,2034,2035,2036],{},"A pod stays ",[28,2037,2038],{},"Pending",": minikube has no memory left for it. See why:",[299,2041,2043],{"className":358,"code":2042,"language":360,"meta":304,"style":304},"kubectl describe pods --namespace tabularia\n",[28,2044,2045],{"__ignoreMap":304},[308,2046,2047,2049,2052,2054,2056],{"class":310,"line":311},[308,2048,447],{"class":367},[308,2050,2051],{"class":371}," describe",[308,2053,1268],{"class":371},[308,2055,1046],{"class":453},[308,2057,2058],{"class":371}," tabularia\n",[14,2060,2061,2064,2065,2068,2069,2071],{},[167,2062,2063],{},"\"Insufficient memory\""," near the end means minikube is too small. Run ",[28,2066,2067],{},"minikube delete",",\nstart again from step 2 with more ",[28,2070,1974],{},", and repeat steps 6 and 8.",[14,2073,2074,2083,2084,2087],{},[47,2075,2076,2077,1954,2080],{},"A pod shows ",[28,2078,2079],{},"ErrImagePull",[28,2081,2082],{},"ImagePullBackOff",": minikube cannot download it. A\ncompany VPN or proxy often blocks it: disconnect the VPN, or ask IT to allow\n",[28,2085,2086],{},"registry-1.docker.io",". Then wait: minikube retries on its own.",[14,2089,2090,2099,2100,2102],{},[47,2091,2076,2092,2095,2096],{},[28,2093,2094],{},"CrashLoopBackOff",", or stays at READY ",[28,2097,2098],{},"0\u002F1",": it starts and stops. Copy\nits full name from ",[28,2101,1790],{}," and read why:",[299,2104,2106],{"className":358,"code":2105,"language":360,"meta":304,"style":304},"kubectl logs \u003Cpod-name> --namespace tabularia --previous\n",[28,2107,2108],{"__ignoreMap":304},[308,2109,2110,2112,2115,2118,2121,2124,2126,2128,2130],{"class":310,"line":311},[308,2111,447],{"class":367},[308,2113,2114],{"class":371}," logs",[308,2116,2117],{"class":505}," \u003C",[308,2119,2120],{"class":371},"pod-nam",[308,2122,2123],{"class":509},"e",[308,2125,252],{"class":505},[308,2127,1046],{"class":453},[308,2129,1228],{"class":371},[308,2131,2132],{"class":453}," --previous\n",[14,2134,2135,2136,2139,2140,2143,2144,355],{},"(if it answers that there is no previous container, run it again without ",[28,2137,2138],{},"--previous",").\nThe last lines say what is wrong, for example ",[167,2141,2142],{},"\"Configuration NOT safe for production:\nJWT__SECRET is too short\"",". It is usually a value of ",[28,2145,1128],{},[21,2147,2148,2154,2157,2162,2167],{},[24,2149,2150,2151,2153],{},"a ",[28,2152,1156],{}," placeholder left in place;",[24,2155,2156],{},"the Fernet key is not the 44 characters of command A;",[24,2158,2159,2161],{},[28,2160,864],{}," is shorter than 32 characters;",[24,2163,2164,2166],{},[28,2165,890],{}," is shorter than 12 characters or too common;",[24,2168,2169,2171],{},[28,2170,877],{}," is not the password given to PostgreSQL in step 6.",[14,2173,2174,2175,1726,2177,2179,2180,2182],{},"Fix ",[28,2176,1128],{},[28,2178,1729],{}," command of the \"Every day\" section. While\na new pod fails, the previous one, if there is one, keeps Tabularia running: your change\nis in effect only when every pod shows ",[28,2181,1096],{}," again.",[14,2184,2185],{},[47,2186,2187,2188],{},"The browser cannot open ",[52,2189,30],{"href":30,"rel":2190},[288],[21,2192,2193,2198],{},[24,2194,1438,2195,2197],{},[28,2196,1705],{}," window was closed, or minikube stopped: start them again.",[24,2199,2200,2203,2204,2206,2207,2210,2211,2215,2216,1511,2219,1726,2221,2223],{},[167,2201,2202],{},"\"address already in use\""," in the ",[28,2205,1705],{}," window: another program uses port 8080.\nUse ",[28,2208,2209],{},"8081:80"," in the command and open ",[52,2212,2213],{"href":2213,"rel":2214},"http:\u002F\u002Flocalhost:8081",[288]," (with notebooks, write\n",[28,2217,2218],{},"http:\u002F\u002Fnotebooks.localhost:8081",[28,2220,1712],{},[28,2222,1729],{}," again).",[14,2225,2226,2229,2230,139,2232,1331,2234,2236,2237,2239,2240,61],{},[47,2227,2228],{},"Signing in fails",": use the ",[28,2231,1327],{},[28,2233,890],{},[28,2235,1128],{},". The\nadministrator is created on the very first start only: changing ",[28,2238,890],{},"\nafterwards does not change it. Once signed in, change your password from ",[47,2241,534],{},[14,2243,2244,2247,2248,769,2251,1422,2254,769,2257,2260,2261,2263,2264,61],{},[47,2245,2246],{},"Uploads or previews fail with a storage error"," (",[167,2249,2250],{},"403",[167,2252,2253],{},"Access Denied",[167,2255,2256],{},"SignatureDoesNotMatch",[167,2258,2259],{},"NoSuchBucket","): check in ",[28,2262,1128],{}," the bucket's endpoint,\nregion and name, and both keys; on Scaleway, the key's preferred project (step 4).\nAfter a change, run ",[28,2265,1729],{},[14,2267,2268,2271,2272,2274,2275,2030],{},[47,2269,2270],{},"After an upgrade the page looks or behaves like before",": reload with ",[47,2273,1870],{},"\n(macOS: ",[47,2276,1874],{},[14,2278,2279,2282,2283,2285,2286,2288,2289,2291],{},[47,2280,2281],{},"ClickHouse is missing from Administration → Engines",": the ",[28,2284,1460],{}," block of\n",[28,2287,1128],{}," is still commented out, or ",[28,2290,1729],{}," was not run after editing it.",[14,2293,2294,2247,2297,769,2299,2302,2303,2306,2307,2309],{},[47,2295,2296],{},"Flows on ClickHouse fail reading the data",[167,2298,2253],{},[167,2300,2301],{},"named collection does not\nexist","): check the named collection of step 9 and its ",[28,2304,2305],{},"GRANT",", and that ",[28,2308,1468],{}," is the\nbucket's address as seen from the ClickHouse service.",[14,2311,2312],{},[47,2313,2314],{},"Scripting environments",[21,2316,2317,2329,2335,2344],{},[24,2318,2319,2282,2322,2285,2324,2288,2326,2328],{},[167,2320,2321],{},"Scripting environments is greyed out in Administration",[28,2323,1597],{},[28,2325,1128],{},[28,2327,1729],{}," was not run.",[24,2330,2331,2334],{},[167,2332,2333],{},"An environment stays \"Building\" for a long time",": R environments compile their\npackages; ten to twenty minutes is normal.",[24,2336,2337,2340,2341,2343],{},[167,2338,2339],{},"\"The image build ran out of memory\"",": minikube is too small for the build; start\nminikube with more ",[28,2342,1974],{}," (step 2).",[24,2345,2346,2349],{},[167,2347,2348],{},"Scripts fail because their image cannot be downloaded",": the registry's address\nchanged (step 10, last note).",[2351,2352,2353],"style",{},"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);}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .shb1k, html code.shiki .shb1k{--shiki-default:#8DDB8C;--shiki-light:#22863A}html pre.shiki code .saVmf, html code.shiki .saVmf{--shiki-default:#DCBDFB;--shiki-light:#6F42C1}",{"title":304,"searchDepth":317,"depth":323,"links":2355},[2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369],{"id":65,"depth":317,"text":66},{"id":177,"depth":317,"text":178},{"id":265,"depth":317,"text":266},{"id":465,"depth":317,"text":466},{"id":622,"depth":317,"text":623},{"id":710,"depth":317,"text":711},{"id":823,"depth":317,"text":824},{"id":998,"depth":317,"text":999},{"id":1103,"depth":317,"text":1104},{"id":1210,"depth":317,"text":1211},{"id":1344,"depth":317,"text":1345},{"id":1526,"depth":317,"text":1527},{"id":1741,"depth":317,"text":1742},{"id":1902,"depth":317,"text":1903},"md",{"source":2372},"docs\u002Fdeploy\u002Fminikube.md",true,"\u002Fdocs\u002Fdeploy\u002Fminikube",{"title":5,"description":16},"docs\u002Fdeploy\u002Fminikube","k25tZjHIHfKXFzEFfSQChUCa-1bbd81L9EQdqlE-z2w",[2379,2396,2450,2482,2514,2543,2569,2591],{"title":2380,"icon":2381,"intro":2382,"items":2383},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[2384,2386,2388,2390,2393],{"path":2385,"title":2380},"\u002Fdocs\u002Fgetting-started",{"path":1339,"title":2387},"Walkthrough with Docker Compose",{"path":2374,"title":2389},"Try it on your computer (minikube)",{"path":2391,"title":2392},"\u002Fdocs\u002Fconcepts","Concepts",{"path":2394,"title":2395},"\u002Fdocs\u002Foverview","Overview (README)",{"title":2397,"icon":2398,"intro":2399,"items":2400},"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.",[2401,2404,2407,2410,2413,2416,2419,2422,2424,2427,2429,2432,2435,2438,2441,2444,2447],{"path":2402,"title":2403},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":2405,"title":2406},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":2408,"title":2409},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":2411,"title":2412},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":2414,"title":2415},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":2417,"title":2418},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":2420,"title":2421},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":1679,"title":2423},"Python and R",{"path":2425,"title":2426},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":1716,"title":2428},"marimo notebooks as apps",{"path":2430,"title":2431},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":2433,"title":2434},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":2436,"title":2437},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":2439,"title":2440},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":2442,"title":2443},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":2445,"title":2446},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":2448,"title":2449},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":2451,"icon":2452,"intro":2453,"items":2454},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[2455,2458,2461,2464,2467,2470,2473,2476,2479],{"path":2456,"title":2457},"\u002Fdocs\u002Fsources","All sources",{"path":2459,"title":2460},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":2462,"title":2463},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":2465,"title":2466},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":2468,"title":2469},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":2471,"title":2472},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":2474,"title":2475},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":2477,"title":2478},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":2480,"title":2481},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":2483,"icon":2484,"intro":2485,"items":2486},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[2487,2490,2493,2496,2499,2501,2502,2504,2505,2508,2511],{"path":2488,"title":2489},"\u002Fdocs\u002Fconnections","All connections",{"path":2491,"title":2492},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":2494,"title":2495},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":2497,"title":2498},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":2468,"title":2500},"SFTP servers",{"path":2471,"title":2472},{"path":2474,"title":2503},"SharePoint",{"path":2477,"title":2478},{"path":2506,"title":2507},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":2509,"title":2510},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":2512,"title":2513},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":2515,"icon":2516,"intro":2517,"items":2518},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[2519,2522,2525,2528,2531,2534,2537,2540],{"path":2520,"title":2521},"\u002Fdocs\u002Fintegrations","All integrations",{"path":2523,"title":2524},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":2526,"title":2527},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":2529,"title":2530},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":2532,"title":2533},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":2535,"title":2536},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":2538,"title":2539},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":2541,"title":2542},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":2544,"icon":2545,"intro":2546,"items":2547},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[2548,2551,2554,2557,2560,2563,2566],{"path":2549,"title":2550},"\u002Fdocs\u002Fgovernance","Overview",{"path":2552,"title":2553},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":2555,"title":2556},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":2558,"title":2559},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":2561,"title":2562},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":2564,"title":2565},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":2567,"title":2568},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":2570,"icon":2571,"intro":2572,"items":2573},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[2574,2575,2577,2579,2582,2585,2588],{"path":54,"title":55},{"path":59,"title":2576},"A company-like cluster on one computer (kind)",{"path":1878,"title":2578},"Upgrading, backups and restore",{"path":2580,"title":2581},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":2583,"title":2584},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":2586,"title":2587},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":2589,"title":2590},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":2592,"icon":2593,"intro":2594,"items":2595},"Reference","reference","Release process and the remaining reference pages.",[2596],{"path":2597,"title":2598},"\u002Fdocs\u002Frelease-process","Release process",1793656372397]