[{"data":1,"prerenderedAt":1847},["ShallowReactive",2],{"docs-\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration\u002F":3,"docs-nav":1393},{"id":4,"title":5,"body":6,"description":226,"extension":1382,"layout":1383,"meta":1384,"navGroup":1383,"navGroupOrder":1383,"navOrder":1383,"navTitle":5,"navigation":1385,"originalPath":1386,"path":1387,"redirect":1383,"seo":1388,"stem":1389,"updated":1390,"version":1391,"__hash__":1392},"docs\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration.md","Ingress Controller Migration",{"type":7,"value":8,"toc":1361},"minimark",[9,13,41,44,54,57,74,77,82,85,152,155,166,170,177,180,196,199,207,211,217,220,244,248,251,254,274,277,281,290,293,364,367,422,425,449,452,487,490,494,497,500,503,532,535,539,542,544,596,599,641,644,648,651,653,677,680,684,687,690,704,707,711,714,717,738,741,783,787,790,793,810,813,817,820,822,843,845,887,891,894,897,899,937,940,943,988,992,999,1002,1004,1067,1069,1111,1117,1121,1130,1133,1157,1164,1196,1200,1203,1222,1225,1267,1271,1274,1314,1322,1326,1331,1335,1357],[10,11,5],"h1",{"id":12},"ingress-controller-migration",[14,15,19,25],"div",{"className":16},[17,18],"ff-callout","ff-callout--note",[20,21,24],"p",{"className":22},[23],"ff-callout__title","Note",[14,26,29,32],{"className":27},[28],"ff-callout__content",[20,30,31],{},"This guide should not be treated as a one-size-fits-all solution. Consider it as a blueprint and adapt it to your specific Kubernetes cluster setup.\nTest the migration in a testing\u002Fstaging environment before applying it to production.",[20,33,34,35,40],{},"If you have any questions about the migration, please contact ",[36,37,39],"a",{"href":38},"mailto:support@flowfuse.com","support@flowfuse.com",".",[20,42,43],{},"This document describes how to migrate a FlowFuse Platform Kubernetes deployment from the NGINX Ingress Controller to Traefik.",[20,45,46,47,53],{},"The main reason for this migration is ",[36,48,52],{"href":49,"rel":50},"https:\u002F\u002Fkubernetes.io\u002Fblog\u002F2025\u002F11\u002F11\u002Fingress-nginx-retirement\u002F",[51],"nofollow","the retirement of Ingress NGINX"," by the Kubernetes project due to long-term maintenance and security sustainability challenges. Best-effort maintenance continues only until March 2026, after which there will be no further releases, bug fixes, or security updates.",[20,55,56],{},"It describes a DNS-based migration approach where the actual traffic switch happens at the domain level by changing DNS records to point to the new ingress controller.\nIt is based on the FlowFuse Ingress Migration Tool and using the ingress classes separation capability provided by the FlowFuse Helm chart:",[58,59,60,68],"ul",{},[61,62,63,64],"li",{},"Hosted Instances (project ingresses) via ",[65,66,67],"code",{},"forge.projectIngressClassName",[61,69,70,71],{},"Core application components via ",[65,72,73],{},"ingress.className",[20,75,76],{},"That separation allows you to migrate project traffic and core application traffic in stages.",[78,79,81],"h2",{"id":80},"prerequisites","Prerequisites",[20,83,84],{},"Before you begin, ensure you have the following:",[86,87,88,108,120,129,138,149],"ol",{},[61,89,90,91,94,95],{},"A working FlowFuse deployment installed with the ",[65,92,93],{},"flowfuse\u002Fflowfuse"," Helm chart\n",[58,96,97],{},[61,98,99,100,103,104,107],{},"note down the FlowFuse Platform Helm release name and namespace, guide uses ",[65,101,102],{},"\u003Cflowfuse-release-name>"," and ",[65,105,106],{},"\u003Cflowfuse-release-namespace>"," placeholders for these values.",[61,109,110,111],{},"Access to the Helm values file used for your deployment\n",[58,112,113],{},[61,114,115,116,119],{},"note down the path to the values file, guide uses ",[65,117,118],{},"\u003Cflowfuse-values-file>"," placeholder as a reference",[61,121,122,103,125,128],{},[65,123,124],{},"kubectl",[65,126,127],{},"helm"," configured for the target cluster",[61,130,131,132,137],{},"A new Traefik ingress controller installed alongside the existing NGINX ingress controller. Check our ",[36,133,136],{"href":134,"rel":135},"https:\u002F\u002Fflowfuse.com\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws\u002F#ingress-controller",[51],"ingress installation guide"," for instructions on how to do this.",[61,139,140,141],{},"Access to the DNS records for:\n",[58,142,143,146],{},[61,144,145],{},"the FlowFuse application domain",[61,147,148],{},"the wildcard domain used by Hosted Instances",[61,150,151],{},"A maintenance window",[20,153,154],{},"We also recommend the following before starting the migration:",[58,156,157,160,163],{},[61,158,159],{},"Reduce DNS TTL values in advance to minimize propagation delay",[61,161,162],{},"Do not create new Hosted Instances during the migration window",[61,164,165],{},"Test the procedure in a non-production cluster first",[78,167,169],{"id":168},"important-notes","Important notes",[20,171,172,173,176],{},"The FlowFuse Helm chart provides an ingress migration job controlled by the ",[65,174,175],{},"ingressMigration"," values block.",[20,178,179],{},"The migration job operates on:",[58,181,182,189],{},[61,183,184,185,188],{},"the project namespace (",[65,186,187],{},"forge.projectNamespace",")",[61,190,191,192,195],{},"the release namespace, but only in ",[65,193,194],{},"copy"," mode",[20,197,198],{},"This guide therefore separates the process into two phases:",[86,200,201,204],{},[61,202,203],{},"Copy existing ingress resources to the new ingress class",[61,205,206],{},"Clean up old ingress resources after traffic has moved",[78,208,210],{"id":209},"step-1-install-traefik-alongside-nginx","Step 1: Install Traefik alongside NGINX",[20,212,213,214,137],{},"Install Traefik without removing the existing NGINX ingress controller. Check our ",[36,215,136],{"href":134,"rel":216},[51],[20,218,219],{},"Before continuing, verify that both ingress controllers are running.\nAlso, write down the ingress class name used by Traefik, as you will need it for the migration configuration:",[221,222,227],"pre",{"className":223,"code":224,"language":225,"meta":226,"style":226},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kubectl get ingressclass\n","bash","",[65,228,229],{"__ignoreMap":226},[230,231,234,237,241],"span",{"class":232,"line":233},"line",1,[230,235,124],{"class":236},"sBMFI",[230,238,240],{"class":239},"sfazB"," get",[230,242,243],{"class":239}," ingressclass\n",[78,245,247],{"id":246},"step-2-record-the-traefik-loadbalancer-address","Step 2: Record the Traefik LoadBalancer address",[20,249,250],{},"You will need the public address of the new ingress controller before changing DNS.",[20,252,253],{},"For example, list services in the Traefik namespace:",[221,255,257],{"className":223,"code":256,"language":225,"meta":226,"style":226},"kubectl get svc -n traefik\n",[65,258,259],{"__ignoreMap":226},[230,260,261,263,265,268,271],{"class":232,"line":233},[230,262,124],{"class":236},[230,264,240],{"class":239},[230,266,267],{"class":239}," svc",[230,269,270],{"class":239}," -n",[230,272,273],{"class":239}," traefik\n",[20,275,276],{},"Record the external hostname or IP address of the Traefik LoadBalancer service.",[78,278,280],{"id":279},"step-3-run-the-migration-job-in-dry-run-mode","Step 3: Run the migration job in dry-run mode",[20,282,283,284,286,287,40],{},"Start by enabling the migration tool in ",[65,285,194],{}," mode with ",[65,288,289],{},"dryRun: true",[20,291,292],{},"Update your values file:",[221,294,298],{"className":295,"code":296,"language":297,"meta":226,"style":226},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ingressMigration:\n  enabled: true\n  mode: copy\n  dryRun: true\n  newIngressClassName: traefik\n  nameSuffix: -tfk\n","yaml",[65,299,300,309,322,333,343,353],{"__ignoreMap":226},[230,301,302,305],{"class":232,"line":233},[230,303,175],{"class":304},"swJcz",[230,306,308],{"class":307},"sMK4o",":\n",[230,310,312,315,318],{"class":232,"line":311},2,[230,313,314],{"class":304},"  enabled",[230,316,317],{"class":307},":",[230,319,321],{"class":320},"sfNiH"," true\n",[230,323,325,328,330],{"class":232,"line":324},3,[230,326,327],{"class":304},"  mode",[230,329,317],{"class":307},[230,331,332],{"class":239}," copy\n",[230,334,336,339,341],{"class":232,"line":335},4,[230,337,338],{"class":304},"  dryRun",[230,340,317],{"class":307},[230,342,321],{"class":320},[230,344,346,349,351],{"class":232,"line":345},5,[230,347,348],{"class":304},"  newIngressClassName",[230,350,317],{"class":307},[230,352,273],{"class":239},[230,354,356,359,361],{"class":232,"line":355},6,[230,357,358],{"class":304},"  nameSuffix",[230,360,317],{"class":307},[230,362,363],{"class":239}," -tfk\n",[20,365,366],{},"Then run the Helm upgrade:",[221,368,370],{"className":223,"code":369,"language":225,"meta":226,"style":226},"helm upgrade --install \u003Cflowfuse-release-name> flowfuse\u002Fflowfuse -n \u003Cflowfuse-release-namespace> -f \u003Cflowfuse-values-file>\n",[65,371,372],{"__ignoreMap":226},[230,373,374,376,379,382,385,388,392,395,398,400,402,405,407,409,412,414,417,419],{"class":232,"line":233},[230,375,127],{"class":236},[230,377,378],{"class":239}," upgrade",[230,380,381],{"class":239}," --install",[230,383,384],{"class":307}," \u003C",[230,386,387],{"class":239},"flowfuse-release-nam",[230,389,391],{"class":390},"sTEyZ","e",[230,393,394],{"class":307},">",[230,396,397],{"class":239}," flowfuse\u002Fflowfuse",[230,399,270],{"class":239},[230,401,384],{"class":307},[230,403,404],{"class":239},"flowfuse-release-namespac",[230,406,391],{"class":390},[230,408,394],{"class":307},[230,410,411],{"class":239}," -f",[230,413,384],{"class":307},[230,415,416],{"class":239},"flowfuse-values-fil",[230,418,391],{"class":390},[230,420,421],{"class":307},">\n",[20,423,424],{},"After the upgrade completes, inspect the Job created by the chart in the release namespace.\nThe Job name is generated by Helm, so first list the Jobs:",[221,426,428],{"className":223,"code":427,"language":225,"meta":226,"style":226},"kubectl get jobs -n \u003Cflowfuse-release-namespace>\n",[65,429,430],{"__ignoreMap":226},[230,431,432,434,436,439,441,443,445,447],{"class":232,"line":233},[230,433,124],{"class":236},[230,435,240],{"class":239},[230,437,438],{"class":239}," jobs",[230,440,270],{"class":239},[230,442,384],{"class":307},[230,444,404],{"class":239},[230,446,391],{"class":390},[230,448,421],{"class":307},[20,450,451],{},"Then inspect the logs of the migration job:",[221,453,455],{"className":223,"code":454,"language":225,"meta":226,"style":226},"kubectl logs -n \u003Cflowfuse-release-namespace> job\u002F\u003Cmigration-job-name>\n",[65,456,457],{"__ignoreMap":226},[230,458,459,461,464,466,468,470,472,474,477,480,483,485],{"class":232,"line":233},[230,460,124],{"class":236},[230,462,463],{"class":239}," logs",[230,465,270],{"class":239},[230,467,384],{"class":307},[230,469,404],{"class":239},[230,471,391],{"class":390},[230,473,394],{"class":307},[230,475,476],{"class":239}," job\u002F",[230,478,479],{"class":307},"\u003C",[230,481,482],{"class":239},"migration-job-nam",[230,484,391],{"class":390},[230,486,421],{"class":307},[20,488,489],{},"Verify that the dry run identifies all Ingress resources.",[78,491,493],{"id":492},"step-4-optionally-scale-down-traefik-before-copying-resources","Step 4: Optionally scale down Traefik before copying resources",[20,495,496],{},"If your environment allows it, and especially if you have many ingress resources, you can temporarily scale Traefik down before executing the ingress resources copy step.",[20,498,499],{},"This is optional, but it can reduce repeated Traefik configuration reloads during the migration.",[20,501,502],{},"Example:",[221,504,506],{"className":223,"code":505,"language":225,"meta":226,"style":226},"kubectl -n traefik scale deployment traefik --replicas 0\n",[65,507,508],{"__ignoreMap":226},[230,509,510,512,514,517,520,523,525,528],{"class":232,"line":233},[230,511,124],{"class":236},[230,513,270],{"class":239},[230,515,516],{"class":239}," traefik",[230,518,519],{"class":239}," scale",[230,521,522],{"class":239}," deployment",[230,524,516],{"class":239},[230,526,527],{"class":239}," --replicas",[230,529,531],{"class":530},"sbssI"," 0\n",[20,533,534],{},"Only do this if your Kubernetes cluster hosts the FlowFuse Platform and stopping Traefik will not cause a downtime for other applications.",[78,536,538],{"id":537},"step-5-copy-ingress-resources-to-the-new-ingress-class","Step 5: Copy ingress resources to the new ingress class",[20,540,541],{},"Once the dry run has been validated, disable dry-run mode and run the actual ingress resources copy.",[20,543,292],{},[221,545,547],{"className":295,"code":546,"language":297,"meta":226,"style":226},"ingressMigration:\n  enabled: true\n  mode: copy\n  dryRun: false\n  newIngressClassName: traefik\n  nameSuffix: -tfk\n",[65,548,549,555,563,571,580,588],{"__ignoreMap":226},[230,550,551,553],{"class":232,"line":233},[230,552,175],{"class":304},[230,554,308],{"class":307},[230,556,557,559,561],{"class":232,"line":311},[230,558,314],{"class":304},[230,560,317],{"class":307},[230,562,321],{"class":320},[230,564,565,567,569],{"class":232,"line":324},[230,566,327],{"class":304},[230,568,317],{"class":307},[230,570,332],{"class":239},[230,572,573,575,577],{"class":232,"line":335},[230,574,338],{"class":304},[230,576,317],{"class":307},[230,578,579],{"class":320}," false\n",[230,581,582,584,586],{"class":232,"line":345},[230,583,348],{"class":304},[230,585,317],{"class":307},[230,587,273],{"class":239},[230,589,590,592,594],{"class":232,"line":355},[230,591,358],{"class":304},[230,593,317],{"class":307},[230,595,363],{"class":239},[20,597,598],{},"Run the Helm upgrade again:",[221,600,601],{"className":223,"code":369,"language":225,"meta":226,"style":226},[65,602,603],{"__ignoreMap":226},[230,604,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639],{"class":232,"line":233},[230,606,127],{"class":236},[230,608,378],{"class":239},[230,610,381],{"class":239},[230,612,384],{"class":307},[230,614,387],{"class":239},[230,616,391],{"class":390},[230,618,394],{"class":307},[230,620,397],{"class":239},[230,622,270],{"class":239},[230,624,384],{"class":307},[230,626,404],{"class":239},[230,628,391],{"class":390},[230,630,394],{"class":307},[230,632,411],{"class":239},[230,634,384],{"class":307},[230,636,416],{"class":239},[230,638,391],{"class":390},[230,640,421],{"class":307},[20,642,643],{},"This creates new Ingress resources that point to the new ingress class and use the configured suffix.",[78,645,647],{"id":646},"step-6-scale-traefik-back-up","Step 6: Scale Traefik back up",[20,649,650],{},"If you scaled Traefik down in step 4, scale it back up now.",[20,652,502],{},[221,654,656],{"className":223,"code":655,"language":225,"meta":226,"style":226},"kubectl -n traefik scale deployment traefik --replicas 2\n",[65,657,658],{"__ignoreMap":226},[230,659,660,662,664,666,668,670,672,674],{"class":232,"line":233},[230,661,124],{"class":236},[230,663,270],{"class":239},[230,665,516],{"class":239},[230,667,519],{"class":239},[230,669,522],{"class":239},[230,671,516],{"class":239},[230,673,527],{"class":239},[230,675,676],{"class":530}," 2\n",[20,678,679],{},"Use the replica count that matches your environment.",[78,681,683],{"id":682},"step-7-change-dns-to-point-to-traefik","Step 7: Change DNS to point to Traefik",[20,685,686],{},"Update the DNS records used by the FlowFuse Platform so that incoming traffic is sent to the Traefik LoadBalancer address recorded earlier.",[20,688,689],{},"This includes:",[58,691,692,698],{},[61,693,694,695,188],{},"the FlowFuse application hostname (e.g. ",[65,696,697],{},"forge.example.com",[61,699,700,701,188],{},"the wildcard DNS record used by Hosted Instances (e.g. ",[65,702,703],{},"*.example.com",[20,705,706],{},"Do not proceed to cleanup until you have confirmed that DNS is resolving to the new ingress controller.",[78,708,710],{"id":709},"step-8-make-new-hosted-instances-use-traefik","Step 8: Make new Hosted Instances use Traefik",[20,712,713],{},"After the copied ingress resources are in place, update the project ingress class so that newly created Hosted Instances use Traefik.",[20,715,716],{},"Add or update the following value in the FlowFuse Helm values file:",[221,718,720],{"className":295,"code":719,"language":297,"meta":226,"style":226},"forge:\n  projectIngressClassName: traefik\n",[65,721,722,729],{"__ignoreMap":226},[230,723,724,727],{"class":232,"line":233},[230,725,726],{"class":304},"forge",[230,728,308],{"class":307},[230,730,731,734,736],{"class":232,"line":311},[230,732,733],{"class":304},"  projectIngressClassName",[230,735,317],{"class":307},[230,737,273],{"class":239},[20,739,740],{},"Apply the change:",[221,742,743],{"className":223,"code":369,"language":225,"meta":226,"style":226},[65,744,745],{"__ignoreMap":226},[230,746,747,749,751,753,755,757,759,761,763,765,767,769,771,773,775,777,779,781],{"class":232,"line":233},[230,748,127],{"class":236},[230,750,378],{"class":239},[230,752,381],{"class":239},[230,754,384],{"class":307},[230,756,387],{"class":239},[230,758,391],{"class":390},[230,760,394],{"class":307},[230,762,397],{"class":239},[230,764,270],{"class":239},[230,766,384],{"class":307},[230,768,404],{"class":239},[230,770,391],{"class":390},[230,772,394],{"class":307},[230,774,411],{"class":239},[230,776,384],{"class":307},[230,778,416],{"class":239},[230,780,391],{"class":390},[230,782,421],{"class":307},[78,784,786],{"id":785},"step-9-wait-for-dns-propagation-and-validate-traffic","Step 9: Wait for DNS propagation and validate traffic",[20,788,789],{},"Allow time for DNS propagation according to your TTL settings.",[20,791,792],{},"During this period, validate the migration by checking:",[58,794,795,798,801,804,807],{},[61,796,797],{},"the FlowFuse Platform is reachable",[61,799,800],{},"Hosted Instances are reachable",[61,802,803],{},"TLS certificates are served correctly",[61,805,806],{},"Traefik logs and metrics do not show routing errors",[61,808,809],{},"Ingress NGINX logs do not show incoming traffic",[20,811,812],{},"Do not continue to cleanup until traffic is consistently served by Traefik. Otherwise, you risk potential downtime of the FlowFuse Platform and Hosted Instances.",[78,814,816],{"id":815},"step-10-move-core-application-components-to-traefik","Step 10: Move core application components to Traefik",[20,818,819],{},"Once you are confident that the Traefik ingress controller is handling all the incoming traffic, update the ingress class used by the core application components.",[20,821,716],{},[221,823,825],{"className":295,"code":824,"language":297,"meta":226,"style":226},"ingress:\n  className: traefik\n",[65,826,827,834],{"__ignoreMap":226},[230,828,829,832],{"class":232,"line":233},[230,830,831],{"class":304},"ingress",[230,833,308],{"class":307},[230,835,836,839,841],{"class":232,"line":311},[230,837,838],{"class":304},"  className",[230,840,317],{"class":307},[230,842,273],{"class":239},[20,844,740],{},[221,846,847],{"className":223,"code":369,"language":225,"meta":226,"style":226},[65,848,849],{"__ignoreMap":226},[230,850,851,853,855,857,859,861,863,865,867,869,871,873,875,877,879,881,883,885],{"class":232,"line":233},[230,852,127],{"class":236},[230,854,378],{"class":239},[230,856,381],{"class":239},[230,858,384],{"class":307},[230,860,387],{"class":239},[230,862,391],{"class":390},[230,864,394],{"class":307},[230,866,397],{"class":239},[230,868,270],{"class":239},[230,870,384],{"class":307},[230,872,404],{"class":239},[230,874,391],{"class":390},[230,876,394],{"class":307},[230,878,411],{"class":239},[230,880,384],{"class":307},[230,882,416],{"class":239},[230,884,391],{"class":390},[230,886,421],{"class":307},[78,888,890],{"id":889},"step-11-optionally-scale-down-nginx","Step 11: Optionally scale down NGINX",[20,892,893],{},"If the NGINX ingress controller is still used for resources outside FlowFuse, leave it in place.",[20,895,896],{},"If it is no longer needed, you can scale it down after you have confirmed that FlowFuse Platform traffic is fully handled by Traefik.",[20,898,502],{},[221,900,902],{"className":223,"code":901,"language":225,"meta":226,"style":226},"kubectl -n \u003Cnginx-namespace> scale deployment \u003Cnginx-deployment> --replicas 0\n",[65,903,904],{"__ignoreMap":226},[230,905,906,908,910,912,915,917,919,921,923,925,928,931,933,935],{"class":232,"line":233},[230,907,124],{"class":236},[230,909,270],{"class":239},[230,911,384],{"class":307},[230,913,914],{"class":239},"nginx-namespac",[230,916,391],{"class":390},[230,918,394],{"class":307},[230,920,519],{"class":239},[230,922,522],{"class":239},[230,924,384],{"class":307},[230,926,927],{"class":239},"nginx-deploymen",[230,929,930],{"class":390},"t",[230,932,394],{"class":307},[230,934,527],{"class":239},[230,936,531],{"class":530},[20,938,939],{},"If your Ingress-Nginx installation created admission webhooks and you are about to retire that controller entirely soon, remove those webhook resources.",[20,941,942],{},"Examples:",[221,944,946],{"className":223,"code":945,"language":225,"meta":226,"style":226},"kubectl delete validatingwebhookconfiguration \u003Cnginx-validating-webhook-name>\nkubectl delete mutatingwebhookconfiguration \u003Cnginx-mutating-webhook-name> --ignore-not-found\n",[65,947,948,967],{"__ignoreMap":226},[230,949,950,952,955,958,960,963,965],{"class":232,"line":233},[230,951,124],{"class":236},[230,953,954],{"class":239}," delete",[230,956,957],{"class":239}," validatingwebhookconfiguration",[230,959,384],{"class":307},[230,961,962],{"class":239},"nginx-validating-webhook-nam",[230,964,391],{"class":390},[230,966,421],{"class":307},[230,968,969,971,973,976,978,981,983,985],{"class":232,"line":311},[230,970,124],{"class":236},[230,972,954],{"class":239},[230,974,975],{"class":239}," mutatingwebhookconfiguration",[230,977,384],{"class":307},[230,979,980],{"class":239},"nginx-mutating-webhook-nam",[230,982,391],{"class":390},[230,984,394],{"class":307},[230,986,987],{"class":239}," --ignore-not-found\n",[78,989,991],{"id":990},"step-12-clean-up-old-ingress-resources","Step 12: Clean up old ingress resources",[20,993,994,995,998],{},"After traffic has fully moved to Traefik, switch the migration tool to ",[65,996,997],{},"cleanup"," mode.",[20,1000,1001],{},"In this mode, the tool removes old ingress resources and renames the migrated ones back to their original names.\nThis step can cause a short interruption while Kubernetes updates the resources.",[20,1003,292],{},[221,1005,1007],{"className":295,"code":1006,"language":297,"meta":226,"style":226},"ingressMigration:\n  enabled: true\n  mode: cleanup\n  dryRun: false\n  oldIngressClassName: nginx\n  newIngressClassName: traefik\n  nameSuffix: -tfk\n",[65,1008,1009,1015,1023,1032,1040,1050,1058],{"__ignoreMap":226},[230,1010,1011,1013],{"class":232,"line":233},[230,1012,175],{"class":304},[230,1014,308],{"class":307},[230,1016,1017,1019,1021],{"class":232,"line":311},[230,1018,314],{"class":304},[230,1020,317],{"class":307},[230,1022,321],{"class":320},[230,1024,1025,1027,1029],{"class":232,"line":324},[230,1026,327],{"class":304},[230,1028,317],{"class":307},[230,1030,1031],{"class":239}," cleanup\n",[230,1033,1034,1036,1038],{"class":232,"line":335},[230,1035,338],{"class":304},[230,1037,317],{"class":307},[230,1039,579],{"class":320},[230,1041,1042,1045,1047],{"class":232,"line":345},[230,1043,1044],{"class":304},"  oldIngressClassName",[230,1046,317],{"class":307},[230,1048,1049],{"class":239}," nginx\n",[230,1051,1052,1054,1056],{"class":232,"line":355},[230,1053,348],{"class":304},[230,1055,317],{"class":307},[230,1057,273],{"class":239},[230,1059,1061,1063,1065],{"class":232,"line":1060},7,[230,1062,358],{"class":304},[230,1064,317],{"class":307},[230,1066,363],{"class":239},[20,1068,598],{},[221,1070,1071],{"className":223,"code":369,"language":225,"meta":226,"style":226},[65,1072,1073],{"__ignoreMap":226},[230,1074,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109],{"class":232,"line":233},[230,1076,127],{"class":236},[230,1078,378],{"class":239},[230,1080,381],{"class":239},[230,1082,384],{"class":307},[230,1084,387],{"class":239},[230,1086,391],{"class":390},[230,1088,394],{"class":307},[230,1090,397],{"class":239},[230,1092,270],{"class":239},[230,1094,384],{"class":307},[230,1096,404],{"class":239},[230,1098,391],{"class":390},[230,1100,394],{"class":307},[230,1102,411],{"class":239},[230,1104,384],{"class":307},[230,1106,416],{"class":239},[230,1108,391],{"class":390},[230,1110,421],{"class":307},[20,1112,1113,1114,1116],{},"If you want to validate the cleanup plan first, run the same configuration with ",[65,1115,289],{}," before applying it.",[78,1118,1120],{"id":1119},"step-13-remove-any-remaining-suffixed-ingress-resources-from-the-release-namespace","Step 13: Remove any remaining suffixed ingress resources from the release namespace",[20,1122,1123,1124,1126,1127,1129],{},"The migration job in ",[65,1125,194],{}," mode creates new ingress resources with a suffix in the release namespace.\nIn ",[65,1128,997],{}," mode, the job deletes old ingress resources and renames the new ones to match the original names, but it does not remove the suffixed copies from the release namespace.\nThis is to avoid any potential issues with the release namespace if it contains non-ingress resources or custom configurations.\nBecause of that, after cleanup you should inspect the release namespace and remove any remaining suffixed ingress resources that were copied there.",[20,1131,1132],{},"List ingress resources in the release namespace:",[221,1134,1136],{"className":223,"code":1135,"language":225,"meta":226,"style":226},"kubectl get ingress -n \u003Cflowfuse-release-namespace>\n",[65,1137,1138],{"__ignoreMap":226},[230,1139,1140,1142,1144,1147,1149,1151,1153,1155],{"class":232,"line":233},[230,1141,124],{"class":236},[230,1143,240],{"class":239},[230,1145,1146],{"class":239}," ingress",[230,1148,270],{"class":239},[230,1150,384],{"class":307},[230,1152,404],{"class":239},[230,1154,391],{"class":390},[230,1156,421],{"class":307},[20,1158,1159,1160,1163],{},"If any copied ingress resources with the migration suffix still exist (",[65,1161,1162],{},"-tfk","), delete them manually:",[221,1165,1167],{"className":223,"code":1166,"language":225,"meta":226,"style":226},"kubectl delete ingress \u003Cingress-name> -n \u003Cflowfuse-release-namespace>\n",[65,1168,1169],{"__ignoreMap":226},[230,1170,1171,1173,1175,1177,1179,1182,1184,1186,1188,1190,1192,1194],{"class":232,"line":233},[230,1172,124],{"class":236},[230,1174,954],{"class":239},[230,1176,1146],{"class":239},[230,1178,384],{"class":307},[230,1180,1181],{"class":239},"ingress-nam",[230,1183,391],{"class":390},[230,1185,394],{"class":307},[230,1187,270],{"class":239},[230,1189,384],{"class":307},[230,1191,404],{"class":239},[230,1193,391],{"class":390},[230,1195,421],{"class":307},[78,1197,1199],{"id":1198},"step-14-disable-the-migration-job","Step 14: Disable the migration job",[20,1201,1202],{},"After the migration and cleanup are complete, disable the migration tool:",[221,1204,1206],{"className":295,"code":1205,"language":297,"meta":226,"style":226},"ingressMigration:\n  enabled: false\n",[65,1207,1208,1214],{"__ignoreMap":226},[230,1209,1210,1212],{"class":232,"line":233},[230,1211,175],{"class":304},[230,1213,308],{"class":307},[230,1215,1216,1218,1220],{"class":232,"line":311},[230,1217,314],{"class":304},[230,1219,317],{"class":307},[230,1221,579],{"class":320},[20,1223,1224],{},"Apply the change one final time:",[221,1226,1227],{"className":223,"code":369,"language":225,"meta":226,"style":226},[65,1228,1229],{"__ignoreMap":226},[230,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265],{"class":232,"line":233},[230,1232,127],{"class":236},[230,1234,378],{"class":239},[230,1236,381],{"class":239},[230,1238,384],{"class":307},[230,1240,387],{"class":239},[230,1242,391],{"class":390},[230,1244,394],{"class":307},[230,1246,397],{"class":239},[230,1248,270],{"class":239},[230,1250,384],{"class":307},[230,1252,404],{"class":239},[230,1254,391],{"class":390},[230,1256,394],{"class":307},[230,1258,411],{"class":239},[230,1260,384],{"class":307},[230,1262,416],{"class":239},[230,1264,391],{"class":390},[230,1266,421],{"class":307},[78,1268,1270],{"id":1269},"related-configuration-values","Related configuration values",[20,1272,1273],{},"This guide uses the following FlowFuse Helm chart values:",[58,1275,1276,1280,1284,1289,1294,1299,1304,1309],{},[61,1277,1278],{},[65,1279,73],{},[61,1281,1282],{},[65,1283,67],{},[61,1285,1286],{},[65,1287,1288],{},"ingressMigration.enabled",[61,1290,1291],{},[65,1292,1293],{},"ingressMigration.mode",[61,1295,1296],{},[65,1297,1298],{},"ingressMigration.dryRun",[61,1300,1301],{},[65,1302,1303],{},"ingressMigration.newIngressClassName",[61,1305,1306],{},[65,1307,1308],{},"ingressMigration.oldIngressClassName",[61,1310,1311],{},[65,1312,1313],{},"ingressMigration.nameSuffix",[20,1315,1316,1317,40],{},"For the full list of ingress migration options, refer to the ",[36,1318,1321],{"href":1319,"rel":1320},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002Fhelm\u002Fflowfuse\u002FREADME.md#ingress-migration-tool",[51],"FlowFuse Helm chart README",[78,1323,1325],{"id":1324},"need-help","Need help?",[20,1327,1328,1329,40],{},"If you would like guidance on planning this migration, we can provide migration consultation. To discuss this option, contact ",[36,1330,39],{"href":38},[78,1332,1334],{"id":1333},"resources","Resources",[58,1336,1337,1343,1350],{},[61,1338,1339],{},[36,1340,1342],{"href":49,"rel":1341},[51],"Ingress Nginx retirement announcement",[61,1344,1345],{},[36,1346,1349],{"href":1347,"rel":1348},"https:\u002F\u002Fgeorg-schwarz.com\u002Fblog\u002Fzero-downtime-ingress-controller-migration-kubernetes\u002F",[51],"Zero-downtime Ingress controller migration guide",[61,1351,1352],{},[36,1353,1356],{"href":1354,"rel":1355},"https:\u002F\u002Fdoc.traefik.io\u002Ftraefik\u002Fmigrate\u002Fnginx-to-traefik\u002F",[51],"Migrate from Ingress NGINX Controller to Traefik",[1358,1359,1360],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":226,"searchDepth":335,"depth":335,"links":1362},[1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381],{"id":80,"depth":311,"text":81},{"id":168,"depth":311,"text":169},{"id":209,"depth":311,"text":210},{"id":246,"depth":311,"text":247},{"id":279,"depth":311,"text":280},{"id":492,"depth":311,"text":493},{"id":537,"depth":311,"text":538},{"id":646,"depth":311,"text":647},{"id":682,"depth":311,"text":683},{"id":709,"depth":311,"text":710},{"id":785,"depth":311,"text":786},{"id":815,"depth":311,"text":816},{"id":889,"depth":311,"text":890},{"id":990,"depth":311,"text":991},{"id":1119,"depth":311,"text":1120},{"id":1198,"depth":311,"text":1199},{"id":1269,"depth":311,"text":1270},{"id":1324,"depth":311,"text":1325},{"id":1333,"depth":311,"text":1334},"md",null,{},true,"install\u002Fkubernetes\u002Fingress-controller-migration.md","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",{"title":5,"description":226},"docs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration","2026-03-17 13:06:15 +0100","2.33.2","RsNGMS07ISxtV68KOS70TWK-eH-AOMtwBKKRVm33LX8",[1394,1401,1420,1431],{"name":1395,"order":233,"children":1396},"FlowFuse User Manuals",[1397],{"title":1398,"path":1399,"group":1395,"groupOrder":233,"order":311,"children":1400},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":1402,"order":335,"children":1403},"FlowFuse Self-Hosted",[1404,1408],{"title":1405,"path":1406,"group":1402,"groupOrder":335,"order":233,"children":1407},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":1409,"path":1410,"group":1402,"groupOrder":335,"order":324,"children":1411},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[1412,1416],{"title":1413,"path":1414,"order":1383,"children":1415},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":1417,"path":1418,"order":1383,"children":1419},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":1421,"order":345,"children":1422},"Support",[1423,1427],{"title":1424,"path":1425,"group":1421,"groupOrder":345,"order":324,"children":1426},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":1428,"path":1429,"group":1421,"groupOrder":345,"order":1383,"children":1430},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":1432,"order":1383,"children":1433},"Other",[1434,1482,1494,1573,1621,1640,1712,1723],{"title":1435,"path":1436,"order":1383,"children":1437},"admin","\u002Fdocs\u002Fadmin",[1438,1442,1454,1462,1466,1470,1474,1478],{"title":1439,"path":1440,"order":233,"children":1441},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":1443,"path":1444,"order":1383,"children":1445},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[1446,1450],{"title":1447,"path":1448,"order":1383,"children":1449},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":1451,"path":1452,"order":1383,"children":1453},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":1455,"path":1456,"order":1383,"children":1457},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[1458],{"title":1459,"path":1460,"order":1383,"children":1461},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":1463,"path":1464,"order":1383,"children":1465},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":1467,"path":1468,"order":1383,"children":1469},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":1471,"path":1472,"order":1383,"children":1473},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":1475,"path":1476,"order":1383,"children":1477},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":1479,"path":1480,"order":1383,"children":1481},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":1483,"path":1484,"order":1383,"children":1485},"cloud","\u002Fdocs\u002Fcloud",[1486,1490],{"title":1487,"path":1488,"order":233,"children":1489},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":1491,"path":1492,"order":1383,"children":1493},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":1495,"path":1496,"order":1383,"children":1497},"contribute","\u002Fdocs\u002Fcontribute",[1498,1501,1505,1509,1513,1517,1521,1529,1565,1569],{"title":1487,"path":1499,"order":233,"children":1500},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":1502,"path":1503,"order":1383,"children":1504},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":1506,"path":1507,"order":1383,"children":1508},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":1510,"path":1511,"order":1383,"children":1512},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":1514,"path":1515,"order":1383,"children":1516},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":1518,"path":1519,"order":1383,"children":1520},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":1522,"path":1523,"order":1383,"children":1524},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[1525],{"title":1526,"path":1527,"order":1383,"children":1528},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":1530,"path":1531,"order":1383,"children":1532},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[1533,1537,1541,1545,1549,1553,1557,1561],{"title":1534,"path":1535,"order":1383,"children":1536},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":1538,"path":1539,"order":1383,"children":1540},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":1542,"path":1543,"order":1383,"children":1544},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":1546,"path":1547,"order":1383,"children":1548},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":1550,"path":1551,"order":1383,"children":1552},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":1554,"path":1555,"order":1383,"children":1556},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":1558,"path":1559,"order":1383,"children":1560},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":1562,"path":1563,"order":1383,"children":1564},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":1566,"path":1567,"order":1383,"children":1568},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":1570,"path":1571,"order":1383,"children":1572},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":1574,"path":1575,"order":1383,"children":1576},"device-agent","\u002Fdocs\u002Fdevice-agent",[1577,1581,1584,1588,1592,1596],{"title":1578,"path":1579,"order":233,"children":1580},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":1405,"path":1582,"order":311,"children":1583},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":1585,"path":1586,"order":335,"children":1587},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":1589,"path":1590,"order":345,"children":1591},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":1593,"path":1594,"order":355,"children":1595},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":1597,"path":1598,"order":1383,"children":1599},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[1600,1605,1609,1613,1617],{"title":1601,"path":1602,"group":1603,"order":233,"children":1604},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":1606,"path":1607,"group":1603,"order":311,"children":1608},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":1610,"path":1611,"group":1603,"order":324,"children":1612},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":1614,"path":1615,"group":1603,"order":335,"children":1616},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":1618,"path":1619,"group":1603,"order":345,"children":1620},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":1622,"path":1623,"order":1383,"children":1624},"hardware","\u002Fdocs\u002Fhardware",[1625,1628,1632,1636],{"title":1601,"path":1626,"order":233,"children":1627},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":1629,"path":1630,"order":311,"children":1631},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":1633,"path":1634,"order":324,"children":1635},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":1637,"path":1638,"order":324,"children":1639},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":1597,"path":1641,"order":1383,"children":1642},"\u002Fdocs\u002Finstall",[1643,1646,1650,1654,1674,1678,1682,1686],{"title":1601,"path":1644,"order":233,"children":1645},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":1647,"path":1648,"order":1383,"children":1649},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":1651,"path":1652,"order":1383,"children":1653},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":1655,"path":1656,"order":1383,"children":1657},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[1658,1662,1666,1670],{"title":1659,"path":1660,"order":1383,"children":1661},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":1663,"path":1664,"order":1383,"children":1665},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":1667,"path":1668,"order":1383,"children":1669},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":1671,"path":1672,"order":1383,"children":1673},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":1675,"path":1676,"order":1383,"children":1677},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":1679,"path":1680,"order":1383,"children":1681},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":1683,"path":1684,"order":1383,"children":1685},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":1687,"path":1688,"order":1383,"children":1689},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[1690,1694,1698,1702,1704,1708],{"title":1691,"path":1692,"order":1383,"children":1693},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":1695,"path":1696,"order":1383,"children":1697},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":1699,"path":1700,"order":1383,"children":1701},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":5,"path":1387,"order":1383,"children":1703},[],{"title":1705,"path":1706,"order":1383,"children":1707},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":1709,"path":1710,"order":1383,"children":1711},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":1713,"path":1714,"order":1383,"children":1715},"migration","\u002Fdocs\u002Fmigration",[1716,1719],{"title":1487,"path":1717,"order":233,"children":1718},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":1720,"path":1721,"order":1383,"children":1722},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":1724,"path":1725,"order":1383,"children":1726},"user","\u002Fdocs\u002Fuser",[1727,1731,1735,1739,1743,1748,1752,1756,1760,1764,1768,1772,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1839,1843],{"title":1728,"path":1729,"order":233,"children":1730},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":1732,"path":1733,"order":233,"children":1734},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":1736,"path":1737,"order":311,"children":1738},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":1740,"path":1741,"order":311,"children":1742},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":1744,"path":1745,"order":1746,"children":1747},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",10,[],{"title":1749,"path":1750,"order":1383,"children":1751},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":1753,"path":1754,"order":1383,"children":1755},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":1757,"path":1758,"order":1383,"children":1759},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":1761,"path":1762,"order":1383,"children":1763},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":1765,"path":1766,"order":1383,"children":1767},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":1769,"path":1770,"order":1383,"children":1771},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":1773,"path":1774,"order":1383,"children":1775},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[1776,1780],{"title":1777,"path":1778,"order":1383,"children":1779},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":1781,"path":1782,"order":1383,"children":1783},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":1785,"path":1786,"order":1383,"children":1787},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":1789,"path":1790,"order":1383,"children":1791},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":1793,"path":1794,"order":1383,"children":1795},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":1797,"path":1798,"order":1383,"children":1799},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":1801,"path":1802,"order":1383,"children":1803},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":1805,"path":1806,"order":1383,"children":1807},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":1809,"path":1810,"order":1383,"children":1811},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":1813,"path":1814,"order":1383,"children":1815},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":1817,"path":1818,"order":1383,"children":1819},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":1821,"path":1822,"order":1383,"children":1823},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":1825,"path":1826,"order":1383,"children":1827},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":1829,"path":1830,"order":1383,"children":1831},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":1833,"path":1834,"order":1383,"children":1835},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":1566,"path":1837,"order":1383,"children":1838},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":1840,"path":1841,"order":1383,"children":1842},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":1844,"path":1845,"order":1383,"children":1846},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546042152]