[{"data":1,"prerenderedAt":2070},["ShallowReactive",2],{"docs-\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean\u002F":3,"docs-nav":1617},{"id":4,"title":5,"body":6,"description":125,"extension":1606,"layout":1607,"meta":1608,"navGroup":1607,"navGroupOrder":1607,"navOrder":1607,"navTitle":1609,"navigation":215,"originalPath":1610,"path":1611,"redirect":1607,"seo":1612,"stem":1613,"updated":1614,"version":1615,"__hash__":1616},"docs\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean.md","Installing FlowFuse on a Digital Ocean Kubernetes cluster",{"type":7,"value":8,"toc":1593},"minimark",[9,13,18,23,34,38,56,60,63,71,75,101,108,112,119,944,947,1041,1045,1048,1076,1086,1090,1093,1183,1190,1201,1345,1351,1371,1375,1378,1405,1412,1415,1529,1539,1542,1583,1589],[10,11,5],"h1",{"id":12},"installing-flowfuse-on-a-digital-ocean-kubernetes-cluster",[14,15,17],"h2",{"id":16},"prerequisites","Prerequisites",[19,20,22],"h3",{"id":21},"digital-ocean-account","Digital Ocean Account",[24,25,26,27],"p",{},"You will need an active Digital Oceans Account, you can sign up\nfor an account ",[28,29,33],"a",{"href":30,"rel":31},"https:\u002F\u002Fcloud.digitalocean.com\u002Fregistrations\u002Fnew",[32],"nofollow","here",[19,35,37],{"id":36},"utilities","Utilities",[39,40,41,49],"ul",{},[42,43,44,45],"li",{},"kubectl - ",[28,46,47],{"href":47,"rel":48},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Ftasks\u002Ftools\u002F",[32],[42,50,51,52],{},"helm - ",[28,53,54],{"href":54,"rel":55},"https:\u002F\u002Fhelm.sh\u002Fdocs\u002Fintro\u002Finstall\u002F",[32],[19,57,59],{"id":58},"dns","DNS",[24,61,62],{},"You will need a domain that FlowFuse will run on and access to configure\na wildcard entry for that domain in it's root DNS server.",[24,64,65,66,70],{},"In this guide I will use ",[67,68,69],"code",{},"example.com"," as the domain, remember to substitute your domain.",[14,72,74],{"id":73},"create-cluster","Create Cluster",[39,76,77,80,83,86,89,92,98],{},[42,78,79],{},"Click on the big green \"Create\" button at the top of the screen",[42,81,82],{},"Select \"Kubernetes\" from the list",[42,84,85],{},"Pick a suitable region (normally the one physically closest to you)",[42,87,88],{},"Reduce the number of nodes from 3 to 2",[42,90,91],{},"Reduce the \"Node Plan\" to 1GB Ram\u002F2vCPU",[42,93,94,95],{},"Change the cluster name to ",[67,96,97],{},"k8s-flowforge",[42,99,100],{},"Hit \"Create Cluster\" button",[24,102,103,104,107],{},"When the cluster has finished provisioning you should be able to download\nthe ",[67,105,106],{},"k8s-flowforge-kubeconfig.yaml"," file which will allow you to connect to the cluster.",[14,109,111],{"id":110},"install-traefik","Install Traefik",[24,113,114,115,118],{},"Prepare values for the Traefik Helm chart by creating a file called ",[67,116,117],{},"traefik-values.yaml"," with the following content:",[120,121,126],"pre",{"className":122,"code":123,"language":124,"meta":125,"style":125},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","service:\n  enabled: true\n  type: LoadBalancer\n  annotations:\n    service.beta.kubernetes.io\u002Fdo-loadbalancer-enable-proxy-protocol: \"true\"\n  spec:\n    externalTrafficPolicy: Cluster\n\ndeployment:\n  replicas: 2\n\nports:\n  web:\n    port: 8000\n    expose:\n      default: true\n    exposedPort: 80\n    protocol: TCP\n    forwardedHeaders:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n    proxyProtocol:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n  websecure:\n    port: 8443\n    expose:\n      default: true\n    exposedPort: 443\n    protocol: TCP\n    http:\n      middlewares:\n        - traefik-force-https@kubernetescrd\n        - traefik-large-body@kubernetescrd\n      # Disable TLS since NLB handles termination\n      tls:\n        enabled: false\n    forwardedHeaders:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n    proxyProtocol:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n\ningressClass:\n  enabled: true\n  isDefaultClass: false\n  name: traefik\n\nadditionalArguments:\n  - \"--entryPoints.web.proxyProtocol.insecure=true\"\n  - \"--entryPoints.websecure.proxyProtocol.insecure=true\"\n  - \"--entryPoints.web.forwardedHeaders.insecure=true\"\n  - \"--entryPoints.websecure.forwardedHeaders.insecure=true\"\n\nproviders:\n  kubernetesIngress:\n    enabled: true\n  kubernetesCRD:\n    enabled: true\n\napi:\n  dashboard: false\n  insecure: false\n\nlogs:\n  access:\n    enabled: true\n    fields:\n      headers:\n        defaultMode: keep\n\nextraObjects:\n  - apiVersion: traefik.io\u002Fv1alpha1\n    kind: Middleware\n    metadata:\n      name: force-https\n      namespace: traefik\n    spec:\n      headers:\n        customRequestHeaders:\n          X-Forwarded-Proto: \"https\"\n  - apiVersion: traefik.io\u002Fv1alpha1\n    kind: Middleware\n    metadata:\n      name: large-body\n      namespace: traefik\n    spec:\n      buffering:\n        maxRequestBodyBytes: 10485760\n","yaml","",[67,127,128,141,154,166,174,191,199,210,217,225,237,242,250,258,269,277,287,298,309,317,325,338,346,353,364,372,382,389,398,408,417,425,433,441,449,456,464,475,482,489,500,507,514,525,530,538,547,557,568,573,581,594,606,618,630,635,643,651,661,669,678,683,691,701,711,716,724,732,741,749,757,768,773,781,794,805,813,824,834,842,849,857,872,883,892,899,909,918,925,933],{"__ignoreMap":125},[129,130,133,137],"span",{"class":131,"line":132},"line",1,[129,134,136],{"class":135},"swJcz","service",[129,138,140],{"class":139},"sMK4o",":\n",[129,142,144,147,150],{"class":131,"line":143},2,[129,145,146],{"class":135},"  enabled",[129,148,149],{"class":139},":",[129,151,153],{"class":152},"sfNiH"," true\n",[129,155,157,160,162],{"class":131,"line":156},3,[129,158,159],{"class":135},"  type",[129,161,149],{"class":139},[129,163,165],{"class":164},"sfazB"," LoadBalancer\n",[129,167,169,172],{"class":131,"line":168},4,[129,170,171],{"class":135},"  annotations",[129,173,140],{"class":139},[129,175,177,180,182,185,188],{"class":131,"line":176},5,[129,178,179],{"class":135},"    service.beta.kubernetes.io\u002Fdo-loadbalancer-enable-proxy-protocol",[129,181,149],{"class":139},[129,183,184],{"class":139}," \"",[129,186,187],{"class":164},"true",[129,189,190],{"class":139},"\"\n",[129,192,194,197],{"class":131,"line":193},6,[129,195,196],{"class":135},"  spec",[129,198,140],{"class":139},[129,200,202,205,207],{"class":131,"line":201},7,[129,203,204],{"class":135},"    externalTrafficPolicy",[129,206,149],{"class":139},[129,208,209],{"class":164}," Cluster\n",[129,211,213],{"class":131,"line":212},8,[129,214,216],{"emptyLinePlaceholder":215},true,"\n",[129,218,220,223],{"class":131,"line":219},9,[129,221,222],{"class":135},"deployment",[129,224,140],{"class":139},[129,226,228,231,233],{"class":131,"line":227},10,[129,229,230],{"class":135},"  replicas",[129,232,149],{"class":139},[129,234,236],{"class":235},"sbssI"," 2\n",[129,238,240],{"class":131,"line":239},11,[129,241,216],{"emptyLinePlaceholder":215},[129,243,245,248],{"class":131,"line":244},12,[129,246,247],{"class":135},"ports",[129,249,140],{"class":139},[129,251,253,256],{"class":131,"line":252},13,[129,254,255],{"class":135},"  web",[129,257,140],{"class":139},[129,259,261,264,266],{"class":131,"line":260},14,[129,262,263],{"class":135},"    port",[129,265,149],{"class":139},[129,267,268],{"class":235}," 8000\n",[129,270,272,275],{"class":131,"line":271},15,[129,273,274],{"class":135},"    expose",[129,276,140],{"class":139},[129,278,280,283,285],{"class":131,"line":279},16,[129,281,282],{"class":135},"      default",[129,284,149],{"class":139},[129,286,153],{"class":152},[129,288,290,293,295],{"class":131,"line":289},17,[129,291,292],{"class":135},"    exposedPort",[129,294,149],{"class":139},[129,296,297],{"class":235}," 80\n",[129,299,301,304,306],{"class":131,"line":300},18,[129,302,303],{"class":135},"    protocol",[129,305,149],{"class":139},[129,307,308],{"class":164}," TCP\n",[129,310,312,315],{"class":131,"line":311},19,[129,313,314],{"class":135},"    forwardedHeaders",[129,316,140],{"class":139},[129,318,320,323],{"class":131,"line":319},20,[129,321,322],{"class":135},"      trustedIPs",[129,324,140],{"class":139},[129,326,328,331,333,336],{"class":131,"line":327},21,[129,329,330],{"class":139},"        -",[129,332,184],{"class":139},[129,334,335],{"class":164},"10.0.0.0\u002F8",[129,337,190],{"class":139},[129,339,341,344],{"class":131,"line":340},22,[129,342,343],{"class":135},"    proxyProtocol",[129,345,140],{"class":139},[129,347,349,351],{"class":131,"line":348},23,[129,350,322],{"class":135},[129,352,140],{"class":139},[129,354,356,358,360,362],{"class":131,"line":355},24,[129,357,330],{"class":139},[129,359,184],{"class":139},[129,361,335],{"class":164},[129,363,190],{"class":139},[129,365,367,370],{"class":131,"line":366},25,[129,368,369],{"class":135},"  websecure",[129,371,140],{"class":139},[129,373,375,377,379],{"class":131,"line":374},26,[129,376,263],{"class":135},[129,378,149],{"class":139},[129,380,381],{"class":235}," 8443\n",[129,383,385,387],{"class":131,"line":384},27,[129,386,274],{"class":135},[129,388,140],{"class":139},[129,390,392,394,396],{"class":131,"line":391},28,[129,393,282],{"class":135},[129,395,149],{"class":139},[129,397,153],{"class":152},[129,399,401,403,405],{"class":131,"line":400},29,[129,402,292],{"class":135},[129,404,149],{"class":139},[129,406,407],{"class":235}," 443\n",[129,409,411,413,415],{"class":131,"line":410},30,[129,412,303],{"class":135},[129,414,149],{"class":139},[129,416,308],{"class":164},[129,418,420,423],{"class":131,"line":419},31,[129,421,422],{"class":135},"    http",[129,424,140],{"class":139},[129,426,428,431],{"class":131,"line":427},32,[129,429,430],{"class":135},"      middlewares",[129,432,140],{"class":139},[129,434,436,438],{"class":131,"line":435},33,[129,437,330],{"class":139},[129,439,440],{"class":164}," traefik-force-https@kubernetescrd\n",[129,442,444,446],{"class":131,"line":443},34,[129,445,330],{"class":139},[129,447,448],{"class":164}," traefik-large-body@kubernetescrd\n",[129,450,452],{"class":131,"line":451},35,[129,453,455],{"class":454},"sHwdD","      # Disable TLS since NLB handles termination\n",[129,457,459,462],{"class":131,"line":458},36,[129,460,461],{"class":135},"      tls",[129,463,140],{"class":139},[129,465,467,470,472],{"class":131,"line":466},37,[129,468,469],{"class":135},"        enabled",[129,471,149],{"class":139},[129,473,474],{"class":152}," false\n",[129,476,478,480],{"class":131,"line":477},38,[129,479,314],{"class":135},[129,481,140],{"class":139},[129,483,485,487],{"class":131,"line":484},39,[129,486,322],{"class":135},[129,488,140],{"class":139},[129,490,492,494,496,498],{"class":131,"line":491},40,[129,493,330],{"class":139},[129,495,184],{"class":139},[129,497,335],{"class":164},[129,499,190],{"class":139},[129,501,503,505],{"class":131,"line":502},41,[129,504,343],{"class":135},[129,506,140],{"class":139},[129,508,510,512],{"class":131,"line":509},42,[129,511,322],{"class":135},[129,513,140],{"class":139},[129,515,517,519,521,523],{"class":131,"line":516},43,[129,518,330],{"class":139},[129,520,184],{"class":139},[129,522,335],{"class":164},[129,524,190],{"class":139},[129,526,528],{"class":131,"line":527},44,[129,529,216],{"emptyLinePlaceholder":215},[129,531,533,536],{"class":131,"line":532},45,[129,534,535],{"class":135},"ingressClass",[129,537,140],{"class":139},[129,539,541,543,545],{"class":131,"line":540},46,[129,542,146],{"class":135},[129,544,149],{"class":139},[129,546,153],{"class":152},[129,548,550,553,555],{"class":131,"line":549},47,[129,551,552],{"class":135},"  isDefaultClass",[129,554,149],{"class":139},[129,556,474],{"class":152},[129,558,560,563,565],{"class":131,"line":559},48,[129,561,562],{"class":135},"  name",[129,564,149],{"class":139},[129,566,567],{"class":164}," traefik\n",[129,569,571],{"class":131,"line":570},49,[129,572,216],{"emptyLinePlaceholder":215},[129,574,576,579],{"class":131,"line":575},50,[129,577,578],{"class":135},"additionalArguments",[129,580,140],{"class":139},[129,582,584,587,589,592],{"class":131,"line":583},51,[129,585,586],{"class":139},"  -",[129,588,184],{"class":139},[129,590,591],{"class":164},"--entryPoints.web.proxyProtocol.insecure=true",[129,593,190],{"class":139},[129,595,597,599,601,604],{"class":131,"line":596},52,[129,598,586],{"class":139},[129,600,184],{"class":139},[129,602,603],{"class":164},"--entryPoints.websecure.proxyProtocol.insecure=true",[129,605,190],{"class":139},[129,607,609,611,613,616],{"class":131,"line":608},53,[129,610,586],{"class":139},[129,612,184],{"class":139},[129,614,615],{"class":164},"--entryPoints.web.forwardedHeaders.insecure=true",[129,617,190],{"class":139},[129,619,621,623,625,628],{"class":131,"line":620},54,[129,622,586],{"class":139},[129,624,184],{"class":139},[129,626,627],{"class":164},"--entryPoints.websecure.forwardedHeaders.insecure=true",[129,629,190],{"class":139},[129,631,633],{"class":131,"line":632},55,[129,634,216],{"emptyLinePlaceholder":215},[129,636,638,641],{"class":131,"line":637},56,[129,639,640],{"class":135},"providers",[129,642,140],{"class":139},[129,644,646,649],{"class":131,"line":645},57,[129,647,648],{"class":135},"  kubernetesIngress",[129,650,140],{"class":139},[129,652,654,657,659],{"class":131,"line":653},58,[129,655,656],{"class":135},"    enabled",[129,658,149],{"class":139},[129,660,153],{"class":152},[129,662,664,667],{"class":131,"line":663},59,[129,665,666],{"class":135},"  kubernetesCRD",[129,668,140],{"class":139},[129,670,672,674,676],{"class":131,"line":671},60,[129,673,656],{"class":135},[129,675,149],{"class":139},[129,677,153],{"class":152},[129,679,681],{"class":131,"line":680},61,[129,682,216],{"emptyLinePlaceholder":215},[129,684,686,689],{"class":131,"line":685},62,[129,687,688],{"class":135},"api",[129,690,140],{"class":139},[129,692,694,697,699],{"class":131,"line":693},63,[129,695,696],{"class":135},"  dashboard",[129,698,149],{"class":139},[129,700,474],{"class":152},[129,702,704,707,709],{"class":131,"line":703},64,[129,705,706],{"class":135},"  insecure",[129,708,149],{"class":139},[129,710,474],{"class":152},[129,712,714],{"class":131,"line":713},65,[129,715,216],{"emptyLinePlaceholder":215},[129,717,719,722],{"class":131,"line":718},66,[129,720,721],{"class":135},"logs",[129,723,140],{"class":139},[129,725,727,730],{"class":131,"line":726},67,[129,728,729],{"class":135},"  access",[129,731,140],{"class":139},[129,733,735,737,739],{"class":131,"line":734},68,[129,736,656],{"class":135},[129,738,149],{"class":139},[129,740,153],{"class":152},[129,742,744,747],{"class":131,"line":743},69,[129,745,746],{"class":135},"    fields",[129,748,140],{"class":139},[129,750,752,755],{"class":131,"line":751},70,[129,753,754],{"class":135},"      headers",[129,756,140],{"class":139},[129,758,760,763,765],{"class":131,"line":759},71,[129,761,762],{"class":135},"        defaultMode",[129,764,149],{"class":139},[129,766,767],{"class":164}," keep\n",[129,769,771],{"class":131,"line":770},72,[129,772,216],{"emptyLinePlaceholder":215},[129,774,776,779],{"class":131,"line":775},73,[129,777,778],{"class":135},"extraObjects",[129,780,140],{"class":139},[129,782,784,786,789,791],{"class":131,"line":783},74,[129,785,586],{"class":139},[129,787,788],{"class":135}," apiVersion",[129,790,149],{"class":139},[129,792,793],{"class":164}," traefik.io\u002Fv1alpha1\n",[129,795,797,800,802],{"class":131,"line":796},75,[129,798,799],{"class":135},"    kind",[129,801,149],{"class":139},[129,803,804],{"class":164}," Middleware\n",[129,806,808,811],{"class":131,"line":807},76,[129,809,810],{"class":135},"    metadata",[129,812,140],{"class":139},[129,814,816,819,821],{"class":131,"line":815},77,[129,817,818],{"class":135},"      name",[129,820,149],{"class":139},[129,822,823],{"class":164}," force-https\n",[129,825,827,830,832],{"class":131,"line":826},78,[129,828,829],{"class":135},"      namespace",[129,831,149],{"class":139},[129,833,567],{"class":164},[129,835,837,840],{"class":131,"line":836},79,[129,838,839],{"class":135},"    spec",[129,841,140],{"class":139},[129,843,845,847],{"class":131,"line":844},80,[129,846,754],{"class":135},[129,848,140],{"class":139},[129,850,852,855],{"class":131,"line":851},81,[129,853,854],{"class":135},"        customRequestHeaders",[129,856,140],{"class":139},[129,858,860,863,865,867,870],{"class":131,"line":859},82,[129,861,862],{"class":135},"          X-Forwarded-Proto",[129,864,149],{"class":139},[129,866,184],{"class":139},[129,868,869],{"class":164},"https",[129,871,190],{"class":139},[129,873,875,877,879,881],{"class":131,"line":874},83,[129,876,586],{"class":139},[129,878,788],{"class":135},[129,880,149],{"class":139},[129,882,793],{"class":164},[129,884,886,888,890],{"class":131,"line":885},84,[129,887,799],{"class":135},[129,889,149],{"class":139},[129,891,804],{"class":164},[129,893,895,897],{"class":131,"line":894},85,[129,896,810],{"class":135},[129,898,140],{"class":139},[129,900,902,904,906],{"class":131,"line":901},86,[129,903,818],{"class":135},[129,905,149],{"class":139},[129,907,908],{"class":164}," large-body\n",[129,910,912,914,916],{"class":131,"line":911},87,[129,913,829],{"class":135},[129,915,149],{"class":139},[129,917,567],{"class":164},[129,919,921,923],{"class":131,"line":920},88,[129,922,839],{"class":135},[129,924,140],{"class":139},[129,926,928,931],{"class":131,"line":927},89,[129,929,930],{"class":135},"      buffering",[129,932,140],{"class":139},[129,934,936,939,941],{"class":131,"line":935},90,[129,937,938],{"class":135},"        maxRequestBodyBytes",[129,940,149],{"class":139},[129,942,943],{"class":235}," 10485760\n",[24,945,946],{},"Install the Traefik with the following command:",[120,948,952],{"className":949,"code":950,"language":951,"meta":125,"style":125},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","helm repo add traefik https:\u002F\u002Ftraefik.github.io\u002Fcharts\nhelm repo update\nhelm --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml upgrade --install traefik traefik\u002Ftraefik \\\n  --create-namespace \\\n  -n traefik \\\n  -f traefik-values.yaml \\\n  --wait \\\n  --atomic\n","bash",[67,953,954,972,981,1003,1010,1019,1029,1036],{"__ignoreMap":125},[129,955,956,960,963,966,969],{"class":131,"line":132},[129,957,959],{"class":958},"sBMFI","helm",[129,961,962],{"class":164}," repo",[129,964,965],{"class":164}," add",[129,967,968],{"class":164}," traefik",[129,970,971],{"class":164}," https:\u002F\u002Ftraefik.github.io\u002Fcharts\n",[129,973,974,976,978],{"class":131,"line":143},[129,975,959],{"class":958},[129,977,962],{"class":164},[129,979,980],{"class":164}," update\n",[129,982,983,985,988,991,994,996,999],{"class":131,"line":156},[129,984,959],{"class":958},[129,986,987],{"class":164}," --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml",[129,989,990],{"class":164}," upgrade",[129,992,993],{"class":164}," --install",[129,995,968],{"class":164},[129,997,998],{"class":164}," traefik\u002Ftraefik",[129,1000,1002],{"class":1001},"sTEyZ"," \\\n",[129,1004,1005,1008],{"class":131,"line":168},[129,1006,1007],{"class":164},"  --create-namespace",[129,1009,1002],{"class":1001},[129,1011,1012,1015,1017],{"class":131,"line":176},[129,1013,1014],{"class":164},"  -n",[129,1016,968],{"class":164},[129,1018,1002],{"class":1001},[129,1020,1021,1024,1027],{"class":131,"line":193},[129,1022,1023],{"class":164},"  -f",[129,1025,1026],{"class":164}," traefik-values.yaml",[129,1028,1002],{"class":1001},[129,1030,1031,1034],{"class":131,"line":201},[129,1032,1033],{"class":164},"  --wait",[129,1035,1002],{"class":1001},[129,1037,1038],{"class":131,"line":212},[129,1039,1040],{"class":164},"  --atomic\n",[19,1042,1044],{"id":1043},"setup-dns","Setup DNS",[24,1046,1047],{},"Run the following to get the external IP address of the Traefik controller",[120,1049,1051],{"className":949,"code":1050,"language":951,"meta":125,"style":125},"kubectl --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml \\\n  -n traefik get service traefik\n",[67,1052,1053,1062],{"__ignoreMap":125},[129,1054,1055,1058,1060],{"class":131,"line":132},[129,1056,1057],{"class":958},"kubectl",[129,1059,987],{"class":164},[129,1061,1002],{"class":1001},[129,1063,1064,1066,1068,1071,1074],{"class":131,"line":143},[129,1065,1014],{"class":164},[129,1067,968],{"class":164},[129,1069,1070],{"class":164}," get",[129,1072,1073],{"class":164}," service",[129,1075,567],{"class":164},[24,1077,1078,1079,1082,1083],{},"You will need to update the entry in your DNS server to point\n",[67,1080,1081],{},"*.example.com"," to the IP address listed under ",[67,1084,1085],{},"EXTERNAL-IP",[14,1087,1089],{"id":1088},"install-cert-manager","Install Cert-manager",[24,1091,1092],{},"This will use LetsEncrypt to issue certificates for both the FlowFuse application\nbut also for the Node-RED instances.",[120,1094,1096],{"className":949,"code":1095,"language":951,"meta":125,"style":125},"helm repo add jetstack https:\u002F\u002Fcharts.jetstack.io\nhelm repo update\nhelm install \\\n  --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml \\\n  cert-manager jetstack\u002Fcert-manager \\\n  --namespace cert-manager \\\n  --create-namespace \\\n  --version v1.13.3 \\\n  --set installCRDs=true\n",[67,1097,1098,1112,1120,1129,1136,1146,1156,1162,1172],{"__ignoreMap":125},[129,1099,1100,1102,1104,1106,1109],{"class":131,"line":132},[129,1101,959],{"class":958},[129,1103,962],{"class":164},[129,1105,965],{"class":164},[129,1107,1108],{"class":164}," jetstack",[129,1110,1111],{"class":164}," https:\u002F\u002Fcharts.jetstack.io\n",[129,1113,1114,1116,1118],{"class":131,"line":143},[129,1115,959],{"class":958},[129,1117,962],{"class":164},[129,1119,980],{"class":164},[129,1121,1122,1124,1127],{"class":131,"line":156},[129,1123,959],{"class":958},[129,1125,1126],{"class":164}," install",[129,1128,1002],{"class":1001},[129,1130,1131,1134],{"class":131,"line":168},[129,1132,1133],{"class":164},"  --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml",[129,1135,1002],{"class":1001},[129,1137,1138,1141,1144],{"class":131,"line":176},[129,1139,1140],{"class":164},"  cert-manager",[129,1142,1143],{"class":164}," jetstack\u002Fcert-manager",[129,1145,1002],{"class":1001},[129,1147,1148,1151,1154],{"class":131,"line":193},[129,1149,1150],{"class":164},"  --namespace",[129,1152,1153],{"class":164}," cert-manager",[129,1155,1002],{"class":1001},[129,1157,1158,1160],{"class":131,"line":201},[129,1159,1007],{"class":164},[129,1161,1002],{"class":1001},[129,1163,1164,1167,1170],{"class":131,"line":212},[129,1165,1166],{"class":164},"  --version",[129,1168,1169],{"class":164}," v1.13.3",[129,1171,1002],{"class":1001},[129,1173,1174,1177,1180],{"class":131,"line":219},[129,1175,1176],{"class":164},"  --set",[129,1178,1179],{"class":164}," installCRDs=",[129,1181,1182],{"class":139},"true\n",[24,1184,1185,1186,1189],{},"After installing you will need to create a ",[67,1187,1188],{},"ClusterIssuer"," to access LetsEncrypt.",[24,1191,1192,1193,1196,1197,1200],{},"Create the following YAML file called ",[67,1194,1195],{},"letsencrypt.yml",", please replace\n",[67,1198,1199],{},"user@example.com"," with your email address.",[120,1202,1204],{"className":122,"code":1203,"language":124,"meta":125,"style":125},"apiVersion: cert-manager.io\u002Fv1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt\nspec:\n  acme:\n    # The ACME server URL\n    server: https:\u002F\u002Facme-v02.api.letsencrypt.org\u002Fdirectory\n    # Email address used for ACME registration\n    email: user@example.com\n    # Name of a secret used to store the ACME account private key\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    # Enable the HTTP-01 challenge provider\n    solvers:\n      - http01:\n          ingress:\n            ingressClassName: traefik\n",[67,1205,1206,1216,1226,1233,1242,1249,1256,1261,1271,1276,1286,1291,1298,1307,1312,1319,1329,1336],{"__ignoreMap":125},[129,1207,1208,1211,1213],{"class":131,"line":132},[129,1209,1210],{"class":135},"apiVersion",[129,1212,149],{"class":139},[129,1214,1215],{"class":164}," cert-manager.io\u002Fv1\n",[129,1217,1218,1221,1223],{"class":131,"line":143},[129,1219,1220],{"class":135},"kind",[129,1222,149],{"class":139},[129,1224,1225],{"class":164}," ClusterIssuer\n",[129,1227,1228,1231],{"class":131,"line":156},[129,1229,1230],{"class":135},"metadata",[129,1232,140],{"class":139},[129,1234,1235,1237,1239],{"class":131,"line":168},[129,1236,562],{"class":135},[129,1238,149],{"class":139},[129,1240,1241],{"class":164}," letsencrypt\n",[129,1243,1244,1247],{"class":131,"line":176},[129,1245,1246],{"class":135},"spec",[129,1248,140],{"class":139},[129,1250,1251,1254],{"class":131,"line":193},[129,1252,1253],{"class":135},"  acme",[129,1255,140],{"class":139},[129,1257,1258],{"class":131,"line":201},[129,1259,1260],{"class":454},"    # The ACME server URL\n",[129,1262,1263,1266,1268],{"class":131,"line":212},[129,1264,1265],{"class":135},"    server",[129,1267,149],{"class":139},[129,1269,1270],{"class":164}," https:\u002F\u002Facme-v02.api.letsencrypt.org\u002Fdirectory\n",[129,1272,1273],{"class":131,"line":219},[129,1274,1275],{"class":454},"    # Email address used for ACME registration\n",[129,1277,1278,1281,1283],{"class":131,"line":227},[129,1279,1280],{"class":135},"    email",[129,1282,149],{"class":139},[129,1284,1285],{"class":164}," user@example.com\n",[129,1287,1288],{"class":131,"line":239},[129,1289,1290],{"class":454},"    # Name of a secret used to store the ACME account private key\n",[129,1292,1293,1296],{"class":131,"line":244},[129,1294,1295],{"class":135},"    privateKeySecretRef",[129,1297,140],{"class":139},[129,1299,1300,1302,1304],{"class":131,"line":252},[129,1301,818],{"class":135},[129,1303,149],{"class":139},[129,1305,1306],{"class":164}," letsencrypt-prod\n",[129,1308,1309],{"class":131,"line":260},[129,1310,1311],{"class":454},"    # Enable the HTTP-01 challenge provider\n",[129,1313,1314,1317],{"class":131,"line":271},[129,1315,1316],{"class":135},"    solvers",[129,1318,140],{"class":139},[129,1320,1321,1324,1327],{"class":131,"line":279},[129,1322,1323],{"class":139},"      -",[129,1325,1326],{"class":135}," http01",[129,1328,140],{"class":139},[129,1330,1331,1334],{"class":131,"line":289},[129,1332,1333],{"class":135},"          ingress",[129,1335,140],{"class":139},[129,1337,1338,1341,1343],{"class":131,"line":300},[129,1339,1340],{"class":135},"            ingressClassName",[129,1342,149],{"class":139},[129,1344,567],{"class":164},[24,1346,1347,1348,1350],{},"Then use ",[67,1349,1057],{}," to install this",[120,1352,1354],{"className":949,"code":1353,"language":951,"meta":125,"style":125},"kubectl --kubeconfig=.\u002Fk8s-flowforge-kubeconfig.yaml apply -f letsencrypt.yml\n",[67,1355,1356],{"__ignoreMap":125},[129,1357,1358,1360,1362,1365,1368],{"class":131,"line":132},[129,1359,1057],{"class":958},[129,1361,987],{"class":164},[129,1363,1364],{"class":164}," apply",[129,1366,1367],{"class":164}," -f",[129,1369,1370],{"class":164}," letsencrypt.yml\n",[14,1372,1374],{"id":1373},"install-flowfuse","Install FlowFuse",[24,1376,1377],{},"Then setup the FlowFuse Helm repository",[120,1379,1381],{"className":949,"code":1380,"language":951,"meta":125,"style":125},"helm repo add flowforge https:\u002F\u002Fflowfuse.github.io\u002Fhelm\nhelm repo update\n",[67,1382,1383,1397],{"__ignoreMap":125},[129,1384,1385,1387,1389,1391,1394],{"class":131,"line":132},[129,1386,959],{"class":958},[129,1388,962],{"class":164},[129,1390,965],{"class":164},[129,1392,1393],{"class":164}," flowforge",[129,1395,1396],{"class":164}," https:\u002F\u002Fflowfuse.github.io\u002Fhelm\n",[129,1398,1399,1401,1403],{"class":131,"line":143},[129,1400,959],{"class":958},[129,1402,962],{"class":164},[129,1404,980],{"class":164},[24,1406,1407,1408,1411],{},"Now create a ",[67,1409,1410],{},"customizations.yml"," file. This is how we configure the\nFlowFuse instance.",[24,1413,1414],{},"The following is the bare minimum to get started:",[120,1416,1418],{"className":122,"code":1417,"language":124,"meta":125,"style":125},"forge:\n  domain: example.com\n  https: true\n  localPostgresql: true\n  projectSelector: \n  managementSelector: \n  broker:\n    enabled: true\npostgresql:\n  global:\n    storageClass: do-block-storage\ningress:\n  certManagerIssuer: letsencrypt\n",[67,1419,1420,1427,1437,1446,1455,1465,1474,1481,1489,1496,1503,1513,1520],{"__ignoreMap":125},[129,1421,1422,1425],{"class":131,"line":132},[129,1423,1424],{"class":135},"forge",[129,1426,140],{"class":139},[129,1428,1429,1432,1434],{"class":131,"line":143},[129,1430,1431],{"class":135},"  domain",[129,1433,149],{"class":139},[129,1435,1436],{"class":164}," example.com\n",[129,1438,1439,1442,1444],{"class":131,"line":156},[129,1440,1441],{"class":135},"  https",[129,1443,149],{"class":139},[129,1445,153],{"class":152},[129,1447,1448,1451,1453],{"class":131,"line":168},[129,1449,1450],{"class":135},"  localPostgresql",[129,1452,149],{"class":139},[129,1454,153],{"class":152},[129,1456,1457,1460,1462],{"class":131,"line":176},[129,1458,1459],{"class":135},"  projectSelector",[129,1461,149],{"class":139},[129,1463,1464],{"class":1001}," \n",[129,1466,1467,1470,1472],{"class":131,"line":193},[129,1468,1469],{"class":135},"  managementSelector",[129,1471,149],{"class":139},[129,1473,1464],{"class":1001},[129,1475,1476,1479],{"class":131,"line":201},[129,1477,1478],{"class":135},"  broker",[129,1480,140],{"class":139},[129,1482,1483,1485,1487],{"class":131,"line":212},[129,1484,656],{"class":135},[129,1486,149],{"class":139},[129,1488,153],{"class":152},[129,1490,1491,1494],{"class":131,"line":219},[129,1492,1493],{"class":135},"postgresql",[129,1495,140],{"class":139},[129,1497,1498,1501],{"class":131,"line":227},[129,1499,1500],{"class":135},"  global",[129,1502,140],{"class":139},[129,1504,1505,1508,1510],{"class":131,"line":239},[129,1506,1507],{"class":135},"    storageClass",[129,1509,149],{"class":139},[129,1511,1512],{"class":164}," do-block-storage\n",[129,1514,1515,1518],{"class":131,"line":244},[129,1516,1517],{"class":135},"ingress",[129,1519,140],{"class":139},[129,1521,1522,1525,1527],{"class":131,"line":252},[129,1523,1524],{"class":135},"  certManagerIssuer",[129,1526,149],{"class":139},[129,1528,1241],{"class":164},[24,1530,1531,1532,1534,1535,1538],{},"Again, please replace ",[67,1533,69],{}," with the domain you configured\nearlier in the ",[28,1536,1044],{"href":1537},"#setup-dns"," section",[24,1540,1541],{},"Then we use this to install FlowFuse",[120,1543,1545],{"className":949,"code":1544,"language":951,"meta":125,"style":125},"helm upgrade --install --kubeconfig .\u002Fk8s-flowforge-kubeconfig.yaml \\\n  flowforge flowforge\u002Fflowforge -f customizations.yml \\\n  --wait\n",[67,1546,1547,1563,1578],{"__ignoreMap":125},[129,1548,1549,1551,1553,1555,1558,1561],{"class":131,"line":132},[129,1550,959],{"class":958},[129,1552,990],{"class":164},[129,1554,993],{"class":164},[129,1556,1557],{"class":164}," --kubeconfig",[129,1559,1560],{"class":164}," .\u002Fk8s-flowforge-kubeconfig.yaml",[129,1562,1002],{"class":1001},[129,1564,1565,1568,1571,1573,1576],{"class":131,"line":143},[129,1566,1567],{"class":164},"  flowforge",[129,1569,1570],{"class":164}," flowforge\u002Fflowforge",[129,1572,1367],{"class":164},[129,1574,1575],{"class":164}," customizations.yml",[129,1577,1002],{"class":1001},[129,1579,1580],{"class":131,"line":156},[129,1581,1582],{"class":164},"  --wait\n",[24,1584,1585,1586],{},"Once complete you should be able to sign into the FlowFuse setup wizard\nat ",[67,1587,1588],{},"http:\u002F\u002Fforge.example.com",[1590,1591,1592],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":125,"searchDepth":168,"depth":168,"links":1594},[1595,1600,1601,1604,1605],{"id":16,"depth":143,"text":17,"children":1596},[1597,1598,1599],{"id":21,"depth":156,"text":22},{"id":36,"depth":156,"text":37},{"id":58,"depth":156,"text":59},{"id":73,"depth":143,"text":74},{"id":110,"depth":143,"text":111,"children":1602},[1603],{"id":1043,"depth":156,"text":1044},{"id":1088,"depth":143,"text":1089},{"id":1373,"depth":143,"text":1374},"md",null,{},"Digital Ocean Kubernetes Installation","install\u002Fkubernetes\u002Fdigital-ocean.md","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",{"title":5,"description":125},"docs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean","2026-03-11 16:10:42 +0100","2.33.2","e-8a6eG-gR7lMZ8VIXH1TzlyVManDI1Kcw8J8orTg80",[1618,1625,1644,1655],{"name":1619,"order":132,"children":1620},"FlowFuse User Manuals",[1621],{"title":1622,"path":1623,"group":1619,"groupOrder":132,"order":143,"children":1624},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":1626,"order":168,"children":1627},"FlowFuse Self-Hosted",[1628,1632],{"title":1629,"path":1630,"group":1626,"groupOrder":168,"order":132,"children":1631},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":1633,"path":1634,"group":1626,"groupOrder":168,"order":156,"children":1635},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[1636,1640],{"title":1637,"path":1638,"order":1607,"children":1639},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":1641,"path":1642,"order":1607,"children":1643},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":1645,"order":176,"children":1646},"Support",[1647,1651],{"title":1648,"path":1649,"group":1645,"groupOrder":176,"order":156,"children":1650},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":1652,"path":1653,"group":1645,"groupOrder":176,"order":1607,"children":1654},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":1656,"order":1607,"children":1657},"Other",[1658,1706,1718,1797,1845,1864,1936,1947],{"title":1659,"path":1660,"order":1607,"children":1661},"admin","\u002Fdocs\u002Fadmin",[1662,1666,1678,1686,1690,1694,1698,1702],{"title":1663,"path":1664,"order":132,"children":1665},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":1667,"path":1668,"order":1607,"children":1669},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[1670,1674],{"title":1671,"path":1672,"order":1607,"children":1673},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":1675,"path":1676,"order":1607,"children":1677},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":1679,"path":1680,"order":1607,"children":1681},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[1682],{"title":1683,"path":1684,"order":1607,"children":1685},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":1687,"path":1688,"order":1607,"children":1689},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":1691,"path":1692,"order":1607,"children":1693},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":1695,"path":1696,"order":1607,"children":1697},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":1699,"path":1700,"order":1607,"children":1701},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":1703,"path":1704,"order":1607,"children":1705},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":1707,"path":1708,"order":1607,"children":1709},"cloud","\u002Fdocs\u002Fcloud",[1710,1714],{"title":1711,"path":1712,"order":132,"children":1713},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":1715,"path":1716,"order":1607,"children":1717},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":1719,"path":1720,"order":1607,"children":1721},"contribute","\u002Fdocs\u002Fcontribute",[1722,1725,1729,1733,1737,1741,1745,1753,1789,1793],{"title":1711,"path":1723,"order":132,"children":1724},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":1726,"path":1727,"order":1607,"children":1728},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":1730,"path":1731,"order":1607,"children":1732},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":1734,"path":1735,"order":1607,"children":1736},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":1738,"path":1739,"order":1607,"children":1740},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":1742,"path":1743,"order":1607,"children":1744},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":1746,"path":1747,"order":1607,"children":1748},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[1749],{"title":1750,"path":1751,"order":1607,"children":1752},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":1754,"path":1755,"order":1607,"children":1756},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[1757,1761,1765,1769,1773,1777,1781,1785],{"title":1758,"path":1759,"order":1607,"children":1760},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":1762,"path":1763,"order":1607,"children":1764},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":1766,"path":1767,"order":1607,"children":1768},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":1770,"path":1771,"order":1607,"children":1772},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":1774,"path":1775,"order":1607,"children":1776},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":1778,"path":1779,"order":1607,"children":1780},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":1782,"path":1783,"order":1607,"children":1784},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":1786,"path":1787,"order":1607,"children":1788},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":1790,"path":1791,"order":1607,"children":1792},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":1794,"path":1795,"order":1607,"children":1796},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":1798,"path":1799,"order":1607,"children":1800},"device-agent","\u002Fdocs\u002Fdevice-agent",[1801,1805,1808,1812,1816,1820],{"title":1802,"path":1803,"order":132,"children":1804},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":1629,"path":1806,"order":143,"children":1807},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":1809,"path":1810,"order":168,"children":1811},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":1813,"path":1814,"order":176,"children":1815},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":1817,"path":1818,"order":193,"children":1819},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":1821,"path":1822,"order":1607,"children":1823},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[1824,1829,1833,1837,1841],{"title":1825,"path":1826,"group":1827,"order":132,"children":1828},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":1830,"path":1831,"group":1827,"order":143,"children":1832},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":1834,"path":1835,"group":1827,"order":156,"children":1836},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":1838,"path":1839,"group":1827,"order":168,"children":1840},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":1842,"path":1843,"group":1827,"order":176,"children":1844},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":1846,"path":1847,"order":1607,"children":1848},"hardware","\u002Fdocs\u002Fhardware",[1849,1852,1856,1860],{"title":1825,"path":1850,"order":132,"children":1851},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":1853,"path":1854,"order":143,"children":1855},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":1857,"path":1858,"order":156,"children":1859},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":1861,"path":1862,"order":156,"children":1863},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":1821,"path":1865,"order":1607,"children":1866},"\u002Fdocs\u002Finstall",[1867,1870,1874,1878,1898,1902,1906,1910],{"title":1825,"path":1868,"order":132,"children":1869},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":1871,"path":1872,"order":1607,"children":1873},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":1875,"path":1876,"order":1607,"children":1877},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":1879,"path":1880,"order":1607,"children":1881},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[1882,1886,1890,1894],{"title":1883,"path":1884,"order":1607,"children":1885},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":1887,"path":1888,"order":1607,"children":1889},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":1891,"path":1892,"order":1607,"children":1893},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":1895,"path":1896,"order":1607,"children":1897},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":1899,"path":1900,"order":1607,"children":1901},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":1903,"path":1904,"order":1607,"children":1905},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":1907,"path":1908,"order":1607,"children":1909},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":1911,"path":1912,"order":1607,"children":1913},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[1914,1918,1922,1924,1928,1932],{"title":1915,"path":1916,"order":1607,"children":1917},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":1919,"path":1920,"order":1607,"children":1921},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":1609,"path":1611,"order":1607,"children":1923},[],{"title":1925,"path":1926,"order":1607,"children":1927},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":1929,"path":1930,"order":1607,"children":1931},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":1933,"path":1934,"order":1607,"children":1935},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":1937,"path":1938,"order":1607,"children":1939},"migration","\u002Fdocs\u002Fmigration",[1940,1943],{"title":1711,"path":1941,"order":132,"children":1942},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":1944,"path":1945,"order":1607,"children":1946},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":1948,"path":1949,"order":1607,"children":1950},"user","\u002Fdocs\u002Fuser",[1951,1955,1959,1963,1967,1971,1975,1979,1983,1987,1991,1995,2007,2011,2015,2019,2023,2027,2031,2035,2039,2043,2047,2051,2055,2059,2062,2066],{"title":1952,"path":1953,"order":132,"children":1954},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":1956,"path":1957,"order":132,"children":1958},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":1960,"path":1961,"order":143,"children":1962},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":1964,"path":1965,"order":143,"children":1966},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":1968,"path":1969,"order":227,"children":1970},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":1972,"path":1973,"order":1607,"children":1974},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":1976,"path":1977,"order":1607,"children":1978},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":1980,"path":1981,"order":1607,"children":1982},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":1984,"path":1985,"order":1607,"children":1986},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":1988,"path":1989,"order":1607,"children":1990},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":1992,"path":1993,"order":1607,"children":1994},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":1996,"path":1997,"order":1607,"children":1998},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[1999,2003],{"title":2000,"path":2001,"order":1607,"children":2002},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":2004,"path":2005,"order":1607,"children":2006},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":2008,"path":2009,"order":1607,"children":2010},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":2012,"path":2013,"order":1607,"children":2014},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":2016,"path":2017,"order":1607,"children":2018},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":2020,"path":2021,"order":1607,"children":2022},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":2024,"path":2025,"order":1607,"children":2026},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":2028,"path":2029,"order":1607,"children":2030},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":2032,"path":2033,"order":1607,"children":2034},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":2036,"path":2037,"order":1607,"children":2038},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":2040,"path":2041,"order":1607,"children":2042},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":2044,"path":2045,"order":1607,"children":2046},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":2048,"path":2049,"order":1607,"children":2050},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":2052,"path":2053,"order":1607,"children":2054},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":2056,"path":2057,"order":1607,"children":2058},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":1790,"path":2060,"order":1607,"children":2061},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":2063,"path":2064,"order":1607,"children":2065},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":2067,"path":2068,"order":1607,"children":2069},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546042098]