[{"data":1,"prerenderedAt":1328},["ShallowReactive",2],{"docs-\u002Fdocs\u002Finstall\u002Fdns-setup\u002F":3,"docs-nav":875},{"id":4,"title":5,"body":6,"description":16,"extension":864,"layout":865,"meta":866,"navGroup":865,"navGroupOrder":865,"navOrder":865,"navTitle":5,"navigation":867,"originalPath":868,"path":869,"redirect":865,"seo":870,"stem":871,"updated":872,"version":873,"__hash__":874},"docs\u002Fdocs\u002Finstall\u002Fdns-setup.md","DNS Setup",{"type":7,"value":8,"toc":848},"minimark",[9,13,17,20,32,42,47,50,61,64,91,96,99,103,106,110,113,116,120,123,126,131,142,313,317,323,469,473,476,480,487,509,517,531,542,545,548,587,590,626,629,659,662,720,723,741,745,748,758,775,781,784,799,806,810,813,822,837,844],[10,11,5],"h1",{"id":12},"dns-setup",[14,15,16],"p",{},"When running FlowFuse on Docker or Kubernetes you will need to be able to setup an entry in a DNS server.",[14,18,19],{},"This is because FlowFuse uses hostname based routing to know which Node-RED instance you want to access.",[14,21,22,23,27,28,31],{},"By default the instance name is used in combination with a supplied domain. In this document we will use ",[24,25,26],"code",{},"example.com"," as the domain. (It doesn't need to be a \"whole\" domain, it could also be a sub domain of one you already own. e.g. ",[24,29,30],{},"ff.example.com",").",[14,33,34,35,38,39,41],{},"If you are running Docker\u002FKubernetes on the same machine as the DNS server and Web Browser do not use ",[24,36,37],{},"127.0.0.1"," as the IP address to point the wild card domain at. This is because the host names will be looked up by the Web Browser, the Forge Application, and the Node-RED instances. The last 2 are running in containers and ",[24,40,37],{}," will resolve to the container, not the entry point.",[43,44,46],"h2",{"id":45},"production","Production",[14,48,49],{},"For a production deployment you will need to have access to modify DNS, if you are not sure how to set up DNS records talk to whoever manages your DNS.",[14,51,52,53,60],{},"As mentioned earlier you will need them to create a ",[54,55,59],"a",{"href":56,"rel":57},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWildcard_DNS_record",[58],"nofollow","wildcard DNS"," entry that points to either the Docker host machine or the Kubernetes Nodes which are running the Ingress Controller.",[14,62,63],{},"This can be either:",[65,66,67,82],"ul",{},[68,69,70,71,74,75,78,79],"li",{},"a ",[24,72,73],{},"A"," (and ",[24,76,77],{},"AAAA"," for IPv6) record pointing to an IP address e.g. ",[24,80,81],{},"*.example.com 8600 A 192.0.2.1",[68,83,70,84,87,88],{},[24,85,86],{},"CNAME"," record pointing to the hostname of the entry point e.g. ",[24,89,90],{},"*.ff.example.com 8600 CNAME forge.example.com",[92,93,95],"h3",{"id":94},"aws-alb-ingress","AWS ALB Ingress",[14,97,98],{},"When using AWS ALB (Application Load Balancer) as an Ingress Controller for FlowFuse deployed into an EKS cluster then you would create a wildcard CNAME entry pointing to the hostname of the ALB",[92,100,102],{"id":101},"digital-ocean","Digital Ocean",[14,104,105],{},"You should create an A record pointing to the public IP address of the Load Balancer created when you install the Traefik Helm Chart.",[43,107,109],{"id":108},"local-testing-and-development","Local Testing and Development",[14,111,112],{},"For development and testing we probably only need to set up DNS entries for the developers local machine. The easiest way to do this is to use an application called dnsmasq.",[14,114,115],{},"Dnsmasq is a tool that can be used as a DNS caching proxy (and a DHCP server, but we don't need that). We can set it up to point to an upstream DNS server to resolve all normal addresses, but we can also give it a list of hostname\u002FIP address pairs to use locally.",[92,117,119],{"id":118},"dnsmasq","DNSMasq",[14,121,122],{},"Setting up dnsmasq is not too complex, what is harder is setting it up in a way that works well with the network configuration on a laptop that might move between different networks and expects to get its default DNS configuration automatically assigned by DHCP.",[14,124,125],{},"The following headings cover how to do this on a number of different operating systems",[127,128,130],"h4",{"id":129},"ubuntu","Ubuntu",[14,132,133,134,137,138,141],{},"For Docker on Linux you can use ",[24,135,136],{},"172.17.0.1"," as the address for the domain which is the IP address assigned to the ",[24,139,140],{},"docker0"," interface.",[143,144,149],"pre",{"className":145,"code":146,"language":147,"meta":148,"style":148},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt-get install dnsmasq\nsudo echo \"bind-interfaces\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"no-resolv\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"conf-dir=\u002Fetc\u002Fdnsmasq.d\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"address=\u002Fexample.com\u002F172.17.0.1\" > \u002Fetc\u002Fdnsmasq.d\u002F02-flowforge.conf\nsudo service dnsmasq restart\nsudo echo \"DNS=127.0.0.1\" >> \u002Fetc\u002Fsystemd\u002Fresolved.conf\nsudo echo \"DOMAINS=~example.com\" >> \u002Fetc\u002Fsystemd\u002Fresolved.conf\nsudo service systemd-resolved restart\n","bash","",[24,150,151,170,194,212,230,250,264,283,301],{"__ignoreMap":148},[152,153,156,160,164,167],"span",{"class":154,"line":155},"line",1,[152,157,159],{"class":158},"sBMFI","sudo",[152,161,163],{"class":162},"sfazB"," apt-get",[152,165,166],{"class":162}," install",[152,168,169],{"class":162}," dnsmasq\n",[152,171,173,175,178,182,185,188,191],{"class":154,"line":172},2,[152,174,159],{"class":158},[152,176,177],{"class":162}," echo",[152,179,181],{"class":180},"sMK4o"," \"",[152,183,184],{"class":162},"bind-interfaces",[152,186,187],{"class":180},"\"",[152,189,190],{"class":180}," >>",[152,192,193],{"class":162}," \u002Fetc\u002Fdnsmasq.conf\n",[152,195,197,199,201,203,206,208,210],{"class":154,"line":196},3,[152,198,159],{"class":158},[152,200,177],{"class":162},[152,202,181],{"class":180},[152,204,205],{"class":162},"no-resolv",[152,207,187],{"class":180},[152,209,190],{"class":180},[152,211,193],{"class":162},[152,213,215,217,219,221,224,226,228],{"class":154,"line":214},4,[152,216,159],{"class":158},[152,218,177],{"class":162},[152,220,181],{"class":180},[152,222,223],{"class":162},"conf-dir=\u002Fetc\u002Fdnsmasq.d",[152,225,187],{"class":180},[152,227,190],{"class":180},[152,229,193],{"class":162},[152,231,233,235,237,239,242,244,247],{"class":154,"line":232},5,[152,234,159],{"class":158},[152,236,177],{"class":162},[152,238,181],{"class":180},[152,240,241],{"class":162},"address=\u002Fexample.com\u002F172.17.0.1",[152,243,187],{"class":180},[152,245,246],{"class":180}," >",[152,248,249],{"class":162}," \u002Fetc\u002Fdnsmasq.d\u002F02-flowforge.conf\n",[152,251,253,255,258,261],{"class":154,"line":252},6,[152,254,159],{"class":158},[152,256,257],{"class":162}," service",[152,259,260],{"class":162}," dnsmasq",[152,262,263],{"class":162}," restart\n",[152,265,267,269,271,273,276,278,280],{"class":154,"line":266},7,[152,268,159],{"class":158},[152,270,177],{"class":162},[152,272,181],{"class":180},[152,274,275],{"class":162},"DNS=127.0.0.1",[152,277,187],{"class":180},[152,279,190],{"class":180},[152,281,282],{"class":162}," \u002Fetc\u002Fsystemd\u002Fresolved.conf\n",[152,284,286,288,290,292,295,297,299],{"class":154,"line":285},8,[152,287,159],{"class":158},[152,289,177],{"class":162},[152,291,181],{"class":180},[152,293,294],{"class":162},"DOMAINS=~example.com",[152,296,187],{"class":180},[152,298,190],{"class":180},[152,300,282],{"class":162},[152,302,304,306,308,311],{"class":154,"line":303},9,[152,305,159],{"class":158},[152,307,257],{"class":162},[152,309,310],{"class":162}," systemd-resolved",[152,312,263],{"class":162},[127,314,316],{"id":315},"fedora","Fedora",[14,318,133,319,137,321,141],{},[24,320,136],{},[24,322,140],{},[143,324,326],{"className":145,"code":325,"language":147,"meta":148,"style":148},"sudo dnf install dnsmasq\nsudo echo \"bind-interfaces\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"no-resolv\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"conf-dir=\u002Fetc\u002Fdnsmasq.d\" >> \u002Fetc\u002Fdnsmasq.conf\nsudo echo \"address=\u002Fexample.com\u002F172.17.0.1\" > \u002Fetc\u002Fdnsmasq.d\u002F02-flowforge.conf\nsudo systemctl enable dnsmasq.service\nsudo service dnsmasq restart\nsudo echo \"DNS=127.0.0.1\" >> \u002Fetc\u002Fsystemd\u002Fresolved.conf\nsudo echo \"DOMAINS=~example.com\" >> \u002Fetc\u002Fsystemd\u002Fresolved.conf\nsudo service systemd-resolved restart\n",[24,327,328,339,355,371,387,403,416,426,442,458],{"__ignoreMap":148},[152,329,330,332,335,337],{"class":154,"line":155},[152,331,159],{"class":158},[152,333,334],{"class":162}," dnf",[152,336,166],{"class":162},[152,338,169],{"class":162},[152,340,341,343,345,347,349,351,353],{"class":154,"line":172},[152,342,159],{"class":158},[152,344,177],{"class":162},[152,346,181],{"class":180},[152,348,184],{"class":162},[152,350,187],{"class":180},[152,352,190],{"class":180},[152,354,193],{"class":162},[152,356,357,359,361,363,365,367,369],{"class":154,"line":196},[152,358,159],{"class":158},[152,360,177],{"class":162},[152,362,181],{"class":180},[152,364,205],{"class":162},[152,366,187],{"class":180},[152,368,190],{"class":180},[152,370,193],{"class":162},[152,372,373,375,377,379,381,383,385],{"class":154,"line":214},[152,374,159],{"class":158},[152,376,177],{"class":162},[152,378,181],{"class":180},[152,380,223],{"class":162},[152,382,187],{"class":180},[152,384,190],{"class":180},[152,386,193],{"class":162},[152,388,389,391,393,395,397,399,401],{"class":154,"line":232},[152,390,159],{"class":158},[152,392,177],{"class":162},[152,394,181],{"class":180},[152,396,241],{"class":162},[152,398,187],{"class":180},[152,400,246],{"class":180},[152,402,249],{"class":162},[152,404,405,407,410,413],{"class":154,"line":252},[152,406,159],{"class":158},[152,408,409],{"class":162}," systemctl",[152,411,412],{"class":162}," enable",[152,414,415],{"class":162}," dnsmasq.service\n",[152,417,418,420,422,424],{"class":154,"line":266},[152,419,159],{"class":158},[152,421,257],{"class":162},[152,423,260],{"class":162},[152,425,263],{"class":162},[152,427,428,430,432,434,436,438,440],{"class":154,"line":285},[152,429,159],{"class":158},[152,431,177],{"class":162},[152,433,181],{"class":180},[152,435,275],{"class":162},[152,437,187],{"class":180},[152,439,190],{"class":180},[152,441,282],{"class":162},[152,443,444,446,448,450,452,454,456],{"class":154,"line":303},[152,445,159],{"class":158},[152,447,177],{"class":162},[152,449,181],{"class":180},[152,451,294],{"class":162},[152,453,187],{"class":180},[152,455,190],{"class":180},[152,457,282],{"class":162},[152,459,461,463,465,467],{"class":154,"line":460},10,[152,462,159],{"class":158},[152,464,257],{"class":162},[152,466,310],{"class":162},[152,468,263],{"class":162},[127,470,472],{"id":471},"windows","Windows",[14,474,475],{},"Unfortunately dnsmasq will not run on Windows and I have not found something similar yet.",[127,477,479],{"id":478},"macos","MacOS",[14,481,482,483,486],{},"On MacOS you can alias a private IP address to the loop back interface e.g. ",[24,484,485],{},"10.128.0.1"," with",[143,488,490],{"className":145,"code":489,"language":147,"meta":148,"style":148},"sudo ifconfig lo0 alias 10.128.0.1\n",[24,491,492],{"__ignoreMap":148},[152,493,494,496,499,502,505],{"class":154,"line":155},[152,495,159],{"class":158},[152,497,498],{"class":162}," ifconfig",[152,500,501],{"class":162}," lo0",[152,503,504],{"class":162}," alias",[152,506,508],{"class":507},"sbssI"," 10.128.0.1\n",[14,510,511,512],{},"You will need install dnsmasq using ",[54,513,516],{"href":514,"rel":515},"https:\u002F\u002Fdocs.brew.sh\u002FInstallation",[58],"homebrew",[143,518,520],{"className":145,"code":519,"language":147,"meta":148,"style":148},"brew install dnsmasq\n",[24,521,522],{"__ignoreMap":148},[152,523,524,527,529],{"class":154,"line":155},[152,525,526],{"class":158},"brew",[152,528,166],{"class":162},[152,530,169],{"class":162},[14,532,533,534,537,538,541],{},"It appears that the install location differs based on the Apple Hardware. For Intel hardware Macs it's in ",[24,535,536],{},"\u002Fusr\u002Flocal"," and for M1 hardware it's ",[24,539,540],{},"\u002Fopt\u002Fhomebrew",". Please check where it installed things when the previous command has completed.",[14,543,544],{},"Then edit a configuration file",[14,546,547],{},"M1 mac",[143,549,551],{"className":145,"code":550,"language":147,"meta":148,"style":148},"echo \"conf-dir=\u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.d\" >> \u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.conf\necho \"address=\u002Fexample.com\u002F10.128.0.1\" > \u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.d\u002Fff.conf\n",[24,552,553,571],{"__ignoreMap":148},[152,554,555,559,561,564,566,568],{"class":154,"line":155},[152,556,558],{"class":557},"s2Zo4","echo",[152,560,181],{"class":180},[152,562,563],{"class":162},"conf-dir=\u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.d",[152,565,187],{"class":180},[152,567,190],{"class":180},[152,569,570],{"class":162}," \u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.conf\n",[152,572,573,575,577,580,582,584],{"class":154,"line":172},[152,574,558],{"class":557},[152,576,181],{"class":180},[152,578,579],{"class":162},"address=\u002Fexample.com\u002F10.128.0.1",[152,581,187],{"class":180},[152,583,246],{"class":180},[152,585,586],{"class":162}," \u002Fopt\u002Fhomebrew\u002Fetc\u002Fdnsmasq.d\u002Fff.conf\n",[14,588,589],{},"Intel mac",[143,591,593],{"className":145,"code":592,"language":147,"meta":148,"style":148},"echo \"conf-dir=\u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.d\" >> \u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.conf\necho \"address=\u002Fexample.com\u002F10.128.0.1\" > \u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.d\u002Fff.conf\n",[24,594,595,611],{"__ignoreMap":148},[152,596,597,599,601,604,606,608],{"class":154,"line":155},[152,598,558],{"class":557},[152,600,181],{"class":180},[152,602,603],{"class":162},"conf-dir=\u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.d",[152,605,187],{"class":180},[152,607,190],{"class":180},[152,609,610],{"class":162}," \u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.conf\n",[152,612,613,615,617,619,621,623],{"class":154,"line":172},[152,614,558],{"class":557},[152,616,181],{"class":180},[152,618,579],{"class":162},[152,620,187],{"class":180},[152,622,246],{"class":180},[152,624,625],{"class":162}," \u002Fusr\u002Flocal\u002Fetc\u002Fdnsmasq.d\u002Fff.conf\n",[14,627,628],{},"Set dnsmasq to run as a service",[143,630,632],{"className":145,"code":631,"language":147,"meta":148,"style":148},"sudo brew services start dnsmasq\nsudo dscacheutil -flushcache\n",[24,633,634,649],{"__ignoreMap":148},[152,635,636,638,641,644,647],{"class":154,"line":155},[152,637,159],{"class":158},[152,639,640],{"class":162}," brew",[152,642,643],{"class":162}," services",[152,645,646],{"class":162}," start",[152,648,169],{"class":162},[152,650,651,653,656],{"class":154,"line":172},[152,652,159],{"class":158},[152,654,655],{"class":162}," dscacheutil",[152,657,658],{"class":162}," -flushcache\n",[14,660,661],{},"Tell MacOS to use dnsmasq for our test domain",[143,663,665],{"className":145,"code":664,"language":147,"meta":148,"style":148},"sudo mkdir -p \u002Fetc\u002Fresolver\nsudo tee \u002Fetc\u002Fresolver\u002Fexample.com > \u002Fdev\u002Fnull \u003C\u003CEOF\nnameserver 127.0.0.1\ndomain example.com\nsearch_order 1\nEOF\n",[24,666,667,680,701,706,711,716],{"__ignoreMap":148},[152,668,669,671,674,677],{"class":154,"line":155},[152,670,159],{"class":158},[152,672,673],{"class":162}," mkdir",[152,675,676],{"class":162}," -p",[152,678,679],{"class":162}," \u002Fetc\u002Fresolver\n",[152,681,682,684,687,690,692,695,698],{"class":154,"line":172},[152,683,159],{"class":158},[152,685,686],{"class":162}," tee",[152,688,689],{"class":162}," \u002Fetc\u002Fresolver\u002Fexample.com",[152,691,246],{"class":180},[152,693,694],{"class":162}," \u002Fdev\u002Fnull",[152,696,697],{"class":180}," \u003C\u003C",[152,699,700],{"class":180},"EOF\n",[152,702,703],{"class":154,"line":196},[152,704,705],{"class":162},"nameserver 127.0.0.1\n",[152,707,708],{"class":154,"line":214},[152,709,710],{"class":162},"domain example.com\n",[152,712,713],{"class":154,"line":232},[152,714,715],{"class":162},"search_order 1\n",[152,717,718],{"class":154,"line":252},[152,719,700],{"class":180},[14,721,722],{},"And finally kick the MacOS resolver so it sees the updates",[143,724,726],{"className":145,"code":725,"language":147,"meta":148,"style":148},"sudo killall -HUP mDNSResponder\n",[24,727,728],{"__ignoreMap":148},[152,729,730,732,735,738],{"class":154,"line":155},[152,731,159],{"class":158},[152,733,734],{"class":162}," killall",[152,736,737],{"class":162}," -HUP",[152,739,740],{"class":162}," mDNSResponder\n",[92,742,744],{"id":743},"pi-hole","Pi Hole",[14,746,747],{},"Pi Hole is a package that bundles dnsmasq as an image to run on a Raspberry Pi (or in Docker container e.g. on your NAS). Its main use is to block advertisements embedded in web pages. But since in its normal configuration it is already handling all the local DNS traffic, making us work with FlowFuse is possible and means you do not need to change any settings on your development\u002Ftest machine.",[14,749,750,751,754,755],{},"Create the following file in ",[24,752,753],{},"\u002Fetc\u002Fdnsmasq.d"," called ",[24,756,757],{},"02-flowforge.conf",[143,759,761],{"className":145,"code":760,"language":147,"meta":148,"style":148},"address=\u002Fexample.com\u002F192.168.0.22\n",[24,762,763],{"__ignoreMap":148},[152,764,765,769,772],{"class":154,"line":155},[152,766,768],{"class":767},"sTEyZ","address",[152,770,771],{"class":180},"=",[152,773,774],{"class":162},"\u002Fexample.com\u002F192.168.0.22\n",[14,776,777,778,780],{},"Where 192.168.0.22 is the ipv4 address of the Docker host machine or a Kubernetes node. And ",[24,779,26],{}," is the domain to use.",[14,782,783],{},"After making the change you will probably need to restart things with:",[143,785,787],{"className":145,"code":786,"language":147,"meta":148,"style":148},"sudo pihole restartdns\n",[24,788,789],{"__ignoreMap":148},[152,790,791,793,796],{"class":154,"line":155},[152,792,159],{"class":158},[152,794,795],{"class":162}," pihole",[152,797,798],{"class":162}," restartdns\n",[14,800,801,802,805],{},"If running Pi Hole in Docker then you will need to create the file on the host and mount it to the ",[24,803,804],{},"\u002Fetc\u002Fdnsmasq.d\u002F02-flowforge.conf"," location.",[92,807,809],{"id":808},"no-local-dns-server","No Local DNS server",[14,811,812],{},"If you really can't run dnsmasq then there is a possible alternative.",[14,814,815,816,821],{},"A really useful service called sslip.io allows you to test FlowFuse even when you cannot use dnsmasq. You can read more about ",[54,817,820],{"href":818,"rel":819},"https:\u002F\u002Fsslip.io",[58],"sslip.io on their web site",".",[14,823,824,825,828,829,832,833,836],{},"You will need to set the ",[24,826,827],{},"domain"," entry in the ",[24,830,831],{},"flowforge.yml"," configuration file to the following pattern ",[24,834,835],{},"172.17.0.1.sslip.io",". Don't forget to replace the IP address with the correct one for your the machine FlowFuse is running on.",[14,838,839,840,843],{},"This will work because the ",[24,841,842],{},"sslip.io"," domain is set up to always return the IP address embedded in the hostname queried.",[845,846,847],"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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":148,"searchDepth":214,"depth":214,"links":849},[850,854],{"id":45,"depth":172,"text":46,"children":851},[852,853],{"id":94,"depth":196,"text":95},{"id":101,"depth":196,"text":102},{"id":108,"depth":172,"text":109,"children":855},[856,862,863],{"id":118,"depth":196,"text":119,"children":857},[858,859,860,861],{"id":129,"depth":214,"text":130},{"id":315,"depth":214,"text":316},{"id":471,"depth":214,"text":472},{"id":478,"depth":214,"text":479},{"id":743,"depth":196,"text":744},{"id":808,"depth":196,"text":809},"md",null,{},true,"install\u002Fdns-setup.md","\u002Fdocs\u002Finstall\u002Fdns-setup",{"title":5,"description":16},"docs\u002Finstall\u002Fdns-setup","2026-03-11 16:10:42 +0100","2.33.2","MKhTXfQrfPDeQXvsvZV-6QVN6pGu0fkN4ecTscLhomY",[876,883,902,913],{"name":877,"order":155,"children":878},"FlowFuse User Manuals",[879],{"title":880,"path":881,"group":877,"groupOrder":155,"order":172,"children":882},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":884,"order":214,"children":885},"FlowFuse Self-Hosted",[886,890],{"title":887,"path":888,"group":884,"groupOrder":214,"order":155,"children":889},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":891,"path":892,"group":884,"groupOrder":214,"order":196,"children":893},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[894,898],{"title":895,"path":896,"order":865,"children":897},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":899,"path":900,"order":865,"children":901},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":903,"order":232,"children":904},"Support",[905,909],{"title":906,"path":907,"group":903,"groupOrder":232,"order":196,"children":908},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":910,"path":911,"group":903,"groupOrder":232,"order":865,"children":912},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":914,"order":865,"children":915},"Other",[916,964,976,1055,1103,1122,1194,1205],{"title":917,"path":918,"order":865,"children":919},"admin","\u002Fdocs\u002Fadmin",[920,924,936,944,948,952,956,960],{"title":921,"path":922,"order":155,"children":923},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":925,"path":926,"order":865,"children":927},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[928,932],{"title":929,"path":930,"order":865,"children":931},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":933,"path":934,"order":865,"children":935},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":937,"path":938,"order":865,"children":939},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[940],{"title":941,"path":942,"order":865,"children":943},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":945,"path":946,"order":865,"children":947},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":949,"path":950,"order":865,"children":951},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":953,"path":954,"order":865,"children":955},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":957,"path":958,"order":865,"children":959},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":961,"path":962,"order":865,"children":963},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":965,"path":966,"order":865,"children":967},"cloud","\u002Fdocs\u002Fcloud",[968,972],{"title":969,"path":970,"order":155,"children":971},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":973,"path":974,"order":865,"children":975},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":977,"path":978,"order":865,"children":979},"contribute","\u002Fdocs\u002Fcontribute",[980,983,987,991,995,999,1003,1011,1047,1051],{"title":969,"path":981,"order":155,"children":982},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":984,"path":985,"order":865,"children":986},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":988,"path":989,"order":865,"children":990},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":992,"path":993,"order":865,"children":994},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":996,"path":997,"order":865,"children":998},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":1000,"path":1001,"order":865,"children":1002},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":1004,"path":1005,"order":865,"children":1006},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[1007],{"title":1008,"path":1009,"order":865,"children":1010},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":1012,"path":1013,"order":865,"children":1014},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[1015,1019,1023,1027,1031,1035,1039,1043],{"title":1016,"path":1017,"order":865,"children":1018},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":1020,"path":1021,"order":865,"children":1022},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":1024,"path":1025,"order":865,"children":1026},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":1028,"path":1029,"order":865,"children":1030},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":1032,"path":1033,"order":865,"children":1034},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":1036,"path":1037,"order":865,"children":1038},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":1040,"path":1041,"order":865,"children":1042},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":1044,"path":1045,"order":865,"children":1046},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":1048,"path":1049,"order":865,"children":1050},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":1052,"path":1053,"order":865,"children":1054},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":1056,"path":1057,"order":865,"children":1058},"device-agent","\u002Fdocs\u002Fdevice-agent",[1059,1063,1066,1070,1074,1078],{"title":1060,"path":1061,"order":155,"children":1062},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":887,"path":1064,"order":172,"children":1065},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":1067,"path":1068,"order":214,"children":1069},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":1071,"path":1072,"order":232,"children":1073},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":1075,"path":1076,"order":252,"children":1077},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":1079,"path":1080,"order":865,"children":1081},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[1082,1087,1091,1095,1099],{"title":1083,"path":1084,"group":1085,"order":155,"children":1086},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":1088,"path":1089,"group":1085,"order":172,"children":1090},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":1092,"path":1093,"group":1085,"order":196,"children":1094},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":1096,"path":1097,"group":1085,"order":214,"children":1098},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":1100,"path":1101,"group":1085,"order":232,"children":1102},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":1104,"path":1105,"order":865,"children":1106},"hardware","\u002Fdocs\u002Fhardware",[1107,1110,1114,1118],{"title":1083,"path":1108,"order":155,"children":1109},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":1111,"path":1112,"order":172,"children":1113},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":1115,"path":1116,"order":196,"children":1117},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":1119,"path":1120,"order":196,"children":1121},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":1079,"path":1123,"order":865,"children":1124},"\u002Fdocs\u002Finstall",[1125,1128,1132,1134,1154,1158,1162,1166],{"title":1083,"path":1126,"order":155,"children":1127},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":1129,"path":1130,"order":865,"children":1131},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":5,"path":869,"order":865,"children":1133},[],{"title":1135,"path":1136,"order":865,"children":1137},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[1138,1142,1146,1150],{"title":1139,"path":1140,"order":865,"children":1141},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":1143,"path":1144,"order":865,"children":1145},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":1147,"path":1148,"order":865,"children":1149},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":1151,"path":1152,"order":865,"children":1153},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":1155,"path":1156,"order":865,"children":1157},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":1159,"path":1160,"order":865,"children":1161},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":1163,"path":1164,"order":865,"children":1165},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":1167,"path":1168,"order":865,"children":1169},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[1170,1174,1178,1182,1186,1190],{"title":1171,"path":1172,"order":865,"children":1173},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":1175,"path":1176,"order":865,"children":1177},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":1179,"path":1180,"order":865,"children":1181},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":1183,"path":1184,"order":865,"children":1185},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":1187,"path":1188,"order":865,"children":1189},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":1191,"path":1192,"order":865,"children":1193},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":1195,"path":1196,"order":865,"children":1197},"migration","\u002Fdocs\u002Fmigration",[1198,1201],{"title":969,"path":1199,"order":155,"children":1200},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":1202,"path":1203,"order":865,"children":1204},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":1206,"path":1207,"order":865,"children":1208},"user","\u002Fdocs\u002Fuser",[1209,1213,1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1265,1269,1273,1277,1281,1285,1289,1293,1297,1301,1305,1309,1313,1317,1320,1324],{"title":1210,"path":1211,"order":155,"children":1212},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":1214,"path":1215,"order":155,"children":1216},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":1218,"path":1219,"order":172,"children":1220},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":1222,"path":1223,"order":172,"children":1224},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":1226,"path":1227,"order":460,"children":1228},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":1230,"path":1231,"order":865,"children":1232},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":1234,"path":1235,"order":865,"children":1236},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":1238,"path":1239,"order":865,"children":1240},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":1242,"path":1243,"order":865,"children":1244},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":1246,"path":1247,"order":865,"children":1248},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":1250,"path":1251,"order":865,"children":1252},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":1254,"path":1255,"order":865,"children":1256},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[1257,1261],{"title":1258,"path":1259,"order":865,"children":1260},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":1262,"path":1263,"order":865,"children":1264},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":1266,"path":1267,"order":865,"children":1268},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":1270,"path":1271,"order":865,"children":1272},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":1274,"path":1275,"order":865,"children":1276},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":1278,"path":1279,"order":865,"children":1280},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":1282,"path":1283,"order":865,"children":1284},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":1286,"path":1287,"order":865,"children":1288},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":1290,"path":1291,"order":865,"children":1292},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":1294,"path":1295,"order":865,"children":1296},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":1298,"path":1299,"order":865,"children":1300},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":1302,"path":1303,"order":865,"children":1304},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":1306,"path":1307,"order":865,"children":1308},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":1310,"path":1311,"order":865,"children":1312},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":1314,"path":1315,"order":865,"children":1316},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":1048,"path":1318,"order":865,"children":1319},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":1321,"path":1322,"order":865,"children":1323},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":1325,"path":1326,"order":865,"children":1327},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546040786]