[{"data":1,"prerenderedAt":970},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcontribute\u002Farchitecture\u002F":3,"docs-nav":518},{"id":4,"title":5,"body":6,"description":16,"extension":507,"layout":508,"meta":509,"navGroup":508,"navGroupOrder":508,"navOrder":508,"navTitle":5,"navigation":510,"originalPath":511,"path":512,"redirect":508,"seo":513,"stem":514,"updated":515,"version":516,"__hash__":517},"docs\u002Fdocs\u002Fcontribute\u002Farchitecture.md","FlowFuse Architecture",{"type":7,"value":8,"toc":490},"minimark",[9,13,17,27,30,52,57,60,63,68,77,82,90,93,96,100,103,106,113,123,126,130,132,134,141,150,154,157,165,171,175,182,185,193,196,199,202,205,208,216,219,222,229,233,486],[10,11,5],"h1",{"id":12},"flowfuse-architecture",[14,15,16],"p",{},"A FlowFuse install is made up of 2 main components",[18,19,20,24],"ul",{},[21,22,23],"li",{},"The Management Application",[21,25,26],{},"The Node-RED instances",[14,28,29],{},"These can be deployed in one of 2 ways",[18,31,32,43],{},[21,33,34,35,38],{},"On a single machine",[36,37],"br",{},[39,40],"img",{"alt":41,"src":42},"LocalFS Architecture","\u002Fdocs\u002Fcontribute\u002Fimages\u002Fff-localfs.png",[21,44,45,46,48],{},"Using a Container Orchestration platform (Kubernetes\u002FDocker Compose)",[36,47],{},[39,49],{"alt":50,"src":51},"Container Architecture","\u002Fdocs\u002Fcontribute\u002Fimages\u002Fff-containers.png",[53,54,56],"h2",{"id":55},"flowfuse-management-application","FlowFuse Management Application",[14,58,59],{},"This provides the interface for managing the objects in the platform. It also\nprovides a collection of APIs to support the Node-RED instances once started.",[14,61,62],{},"A key component is the Container API driver, this is the part that actually creates\u002Fdestroys\nNode-RED instances and keeps track of what should be running and restarts if needed.",[64,65,67],"h3",{"id":66},"container-drivers","Container Drivers",[14,69,70,71,76],{},"Node-RED instances are started by the FlowFuse Management Application via one of the following Container Drivers. Documentation for the Container Driver API will be available in the ",[72,73,75],"a",{"href":74},"\u002Fdocs\u002Fapi","API"," section.",[78,79,81],"h4",{"id":80},"localfs","Localfs",[14,83,84,85,89],{},"This driver runs Node-RED as separate processes on the same machine as the FlowFuse Management Application. Each instance gets its own ",[86,87,88],"code",{},"userDir"," and a dedicated TCP\u002FIP port to listen to.",[14,91,92],{},"State is stored in a local SQLite database",[14,94,95],{},"There is no automatic Ingres automation provided by this driver.",[78,97,99],{"id":98},"kubernetes","Kubernetes",[14,101,102],{},"This driver runs Node-RED in separate containers and each instance is accessed by a dedicated hostname via an HTTP Ingres proxy.",[14,104,105],{},"The state is stored in a provided PostgreSQL database.",[14,107,108,109,112],{},"Node-RED containers are segregated into their own namespace (currently hardcoded to ",[86,110,111],{},"flowforge",")",[14,114,115,116,122],{},"The driver uses the ",[72,117,121],{"href":118,"rel":119},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@kubernetes\u002Fclient-node",[120],"nofollow","@kubernetes\u002Fclient-node"," to interact with the cluster.",[14,124,125],{},"The driver will create the required Service and Ingres Kubernetes resources to expose each instance via whatever Ingress Controller the underlying Kubernetes cluster provides.",[78,127,129],{"id":128},"docker-compose","Docker-Compose",[14,131,102],{},[14,133,105],{},[14,135,115,136,122],{},[72,137,140],{"href":138,"rel":139},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fdockerode",[120],"dockerode",[14,142,143,144,149],{},"The driver will add the required Environment variables to each Node-RED container to work with the ",[72,145,148],{"href":146,"rel":147},"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fjwilder\u002Fnginx-proxy",[120],"jwilder\u002Fnginx-proxy"," NGINX proxy.",[53,151,153],{"id":152},"flowfuse-instances","FlowFuse Instances",[14,155,156],{},"A FlowFuse Node-RED Instance is made up of 2 processes",[18,158,159,162],{},[21,160,161],{},"The FlowFuse Launcher",[21,163,164],{},"A Node-RED instance",[14,166,167],{},[39,168],{"alt":169,"src":170},"Project Architecture","\u002Fdocs\u002Fcontribute\u002Fimages\u002Fff-project-arch.png",[64,172,174],{"id":173},"flowfuse-launcher","FlowFuse Launcher",[14,176,177,178,181],{},"This is a small application that handles downloading the Instance specific settings, building a ",[86,179,180],{},"settings.js"," from those settings and then starting the Node-RED instance.",[14,183,184],{},"The launcher presents an HTTP API (it defaults to the Node-RED port + 1000) that allows the FlowFuse Management Application to start\u002Fstop\u002Frestart the Node-RED instance as well as query its current state and retrieve the console logs.",[14,186,187,188],{},"The launcher can be found ",[72,189,192],{"href":190,"rel":191},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-launcher",[120],"here",[14,194,195],{},"Within the launcher are some custom plugins that are loaded by Node-RED:",[78,197,198],{"id":198},"nr-storage",[14,200,201],{},"This plugin is used to save flows, settings, sessions, and library entries back to the FlowFuse Management Application.",[78,203,204],{"id":204},"nr-auth",[14,206,207],{},"This plugin is used to authenticate users trying to access the Node-RED Editor, it refers back to the FlowFuse Management Application to ensure only members of the team that owns the instance can log in.",[14,209,210,211],{},"This plugin uses the Node-RED ",[72,212,215],{"href":213,"rel":214},"https:\u002F\u002Fnodered.org\u002Fdocs\u002Fuser-guide\u002Fruntime\u002Fsecuring-node-red#custom-user-authentication",[120],"Authentication API",[78,217,218],{"id":218},"nr-audit-logger",[14,220,221],{},"This plugin sends Node-RED Audit events (e.g. user log in and flow deployment events) back to the to the FlowFuse Management Application to allow a reliable audit of what actions have taken place in the instance.",[14,223,210,224],{},[72,225,228],{"href":226,"rel":227},"https:\u002F\u002Fnodered.org\u002Fdocs\u002Fuser-guide\u002Fruntime\u002Flogging",[120],"Logging API",[53,230,232],{"id":231},"component-overview","Component Overview",[234,235,240],"pre",{"className":236,"code":237,"language":238,"meta":239,"style":239},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","erDiagram\n    USER ||--o{ NGINX : Requests\n    NGINX {\n        Protocol HTTP-TLS\n        Port default-443\n    }\n    FORGE-APP {\n        Protocol HTTP-TLS\n        Port default-3000\n    }\n    POSTGRESQL {\n        Protocol tcp-tls\n        Port default-5432\n    }\n    MOSQUITTO {\n        Protocol HTTP-TLS-WSS-MQTT\n        Port default-1883\n        Port websocket-1884\n    }\n    FLOWFORGE-FILE-SERVER {\n        Protocol HTTP-TLS\n        Port default-3001\n    }\n    NGINX }o--o| NODE-RED : routes\n    NGINX }o--o{ FORGE-APP: routes\n    NGINX ||--|| MOSQUITTO: mqtt-ws\n    FORGE-APP ||--|{ POSTGRESQL: query\n    FORGE-APP ||--|| NODE-RED: \"flow update\"\n    NODE-RED }o--o{ FLOWFORGE-FILE-SERVER: \"Blob store\"\n    FLOWFORGE-FILE-SERVER ||--|| FORGE-APP: \"Authenticate\"\n    NODE-RED {\n        Protocol HTTP-TLS\n        Port default-1880\n    }\n    NODE-RED }o--|| MOSQUITTO: mqtt\n    FORGE-APP }o--|| MOSQUITTO: mqtt\n    NODE-RED-DEVICES {\n        Port default-1880\n        Protocol User-Defined\n    }\n    NODE-RED-DEVICES }o--|| NGINX: mqtt-ws\n    USER ||--|| NODE-RED-DEVICES: Requests\n","mermaid","",[86,241,242,250,256,262,268,274,280,286,291,297,302,308,314,320,325,331,337,343,349,354,360,365,371,376,382,388,394,400,406,412,418,424,429,435,440,446,452,458,463,469,474,480],{"__ignoreMap":239},[243,244,247],"span",{"class":245,"line":246},"line",1,[243,248,249],{},"erDiagram\n",[243,251,253],{"class":245,"line":252},2,[243,254,255],{},"    USER ||--o{ NGINX : Requests\n",[243,257,259],{"class":245,"line":258},3,[243,260,261],{},"    NGINX {\n",[243,263,265],{"class":245,"line":264},4,[243,266,267],{},"        Protocol HTTP-TLS\n",[243,269,271],{"class":245,"line":270},5,[243,272,273],{},"        Port default-443\n",[243,275,277],{"class":245,"line":276},6,[243,278,279],{},"    }\n",[243,281,283],{"class":245,"line":282},7,[243,284,285],{},"    FORGE-APP {\n",[243,287,289],{"class":245,"line":288},8,[243,290,267],{},[243,292,294],{"class":245,"line":293},9,[243,295,296],{},"        Port default-3000\n",[243,298,300],{"class":245,"line":299},10,[243,301,279],{},[243,303,305],{"class":245,"line":304},11,[243,306,307],{},"    POSTGRESQL {\n",[243,309,311],{"class":245,"line":310},12,[243,312,313],{},"        Protocol tcp-tls\n",[243,315,317],{"class":245,"line":316},13,[243,318,319],{},"        Port default-5432\n",[243,321,323],{"class":245,"line":322},14,[243,324,279],{},[243,326,328],{"class":245,"line":327},15,[243,329,330],{},"    MOSQUITTO {\n",[243,332,334],{"class":245,"line":333},16,[243,335,336],{},"        Protocol HTTP-TLS-WSS-MQTT\n",[243,338,340],{"class":245,"line":339},17,[243,341,342],{},"        Port default-1883\n",[243,344,346],{"class":245,"line":345},18,[243,347,348],{},"        Port websocket-1884\n",[243,350,352],{"class":245,"line":351},19,[243,353,279],{},[243,355,357],{"class":245,"line":356},20,[243,358,359],{},"    FLOWFORGE-FILE-SERVER {\n",[243,361,363],{"class":245,"line":362},21,[243,364,267],{},[243,366,368],{"class":245,"line":367},22,[243,369,370],{},"        Port default-3001\n",[243,372,374],{"class":245,"line":373},23,[243,375,279],{},[243,377,379],{"class":245,"line":378},24,[243,380,381],{},"    NGINX }o--o| NODE-RED : routes\n",[243,383,385],{"class":245,"line":384},25,[243,386,387],{},"    NGINX }o--o{ FORGE-APP: routes\n",[243,389,391],{"class":245,"line":390},26,[243,392,393],{},"    NGINX ||--|| MOSQUITTO: mqtt-ws\n",[243,395,397],{"class":245,"line":396},27,[243,398,399],{},"    FORGE-APP ||--|{ POSTGRESQL: query\n",[243,401,403],{"class":245,"line":402},28,[243,404,405],{},"    FORGE-APP ||--|| NODE-RED: \"flow update\"\n",[243,407,409],{"class":245,"line":408},29,[243,410,411],{},"    NODE-RED }o--o{ FLOWFORGE-FILE-SERVER: \"Blob store\"\n",[243,413,415],{"class":245,"line":414},30,[243,416,417],{},"    FLOWFORGE-FILE-SERVER ||--|| FORGE-APP: \"Authenticate\"\n",[243,419,421],{"class":245,"line":420},31,[243,422,423],{},"    NODE-RED {\n",[243,425,427],{"class":245,"line":426},32,[243,428,267],{},[243,430,432],{"class":245,"line":431},33,[243,433,434],{},"        Port default-1880\n",[243,436,438],{"class":245,"line":437},34,[243,439,279],{},[243,441,443],{"class":245,"line":442},35,[243,444,445],{},"    NODE-RED }o--|| MOSQUITTO: mqtt\n",[243,447,449],{"class":245,"line":448},36,[243,450,451],{},"    FORGE-APP }o--|| MOSQUITTO: mqtt\n",[243,453,455],{"class":245,"line":454},37,[243,456,457],{},"    NODE-RED-DEVICES {\n",[243,459,461],{"class":245,"line":460},38,[243,462,434],{},[243,464,466],{"class":245,"line":465},39,[243,467,468],{},"        Protocol User-Defined\n",[243,470,472],{"class":245,"line":471},40,[243,473,279],{},[243,475,477],{"class":245,"line":476},41,[243,478,479],{},"    NODE-RED-DEVICES }o--|| NGINX: mqtt-ws\n",[243,481,483],{"class":245,"line":482},42,[243,484,485],{},"    USER ||--|| NODE-RED-DEVICES: Requests\n",[487,488,489],"style",{},"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);}",{"title":239,"searchDepth":264,"depth":264,"links":491},[492,499,506],{"id":55,"depth":252,"text":56,"children":493},[494],{"id":66,"depth":258,"text":67,"children":495},[496,497,498],{"id":80,"depth":264,"text":81},{"id":98,"depth":264,"text":99},{"id":128,"depth":264,"text":129},{"id":152,"depth":252,"text":153,"children":500},[501],{"id":173,"depth":258,"text":174,"children":502},[503,504,505],{"id":198,"depth":264,"text":198},{"id":204,"depth":264,"text":204},{"id":218,"depth":264,"text":218},{"id":231,"depth":252,"text":232},"md",null,{},true,"contribute\u002Farchitecture.md","\u002Fdocs\u002Fcontribute\u002Farchitecture",{"title":5,"description":16},"docs\u002Fcontribute\u002Farchitecture","2024-07-19 20:33:52 +0530","2.33.2","smdXfE8nmlNlJyiMD6mm8OgxTeP67w6ajeIQprCt9jU",[519,525,544,555],{"name":520,"order":246,"children":521},"FlowFuse User Manuals",[522],{"title":523,"path":74,"group":520,"groupOrder":246,"order":252,"children":524},"FlowFuse API",[],{"name":526,"order":264,"children":527},"FlowFuse Self-Hosted",[528,532],{"title":529,"path":530,"group":526,"groupOrder":264,"order":246,"children":531},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":533,"path":534,"group":526,"groupOrder":264,"order":258,"children":535},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[536,540],{"title":537,"path":538,"order":508,"children":539},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":541,"path":542,"order":508,"children":543},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":545,"order":270,"children":546},"Support",[547,551],{"title":548,"path":549,"group":545,"groupOrder":270,"order":258,"children":550},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":552,"path":553,"group":545,"groupOrder":270,"order":508,"children":554},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":556,"order":508,"children":557},"Other",[558,606,618,695,743,762,836,847],{"title":559,"path":560,"order":508,"children":561},"admin","\u002Fdocs\u002Fadmin",[562,566,578,586,590,594,598,602],{"title":563,"path":564,"order":246,"children":565},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":567,"path":568,"order":508,"children":569},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[570,574],{"title":571,"path":572,"order":508,"children":573},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":575,"path":576,"order":508,"children":577},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":579,"path":580,"order":508,"children":581},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[582],{"title":583,"path":584,"order":508,"children":585},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":587,"path":588,"order":508,"children":589},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":591,"path":592,"order":508,"children":593},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":595,"path":596,"order":508,"children":597},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":599,"path":600,"order":508,"children":601},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":603,"path":604,"order":508,"children":605},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":607,"path":608,"order":508,"children":609},"cloud","\u002Fdocs\u002Fcloud",[610,614],{"title":611,"path":612,"order":246,"children":613},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":615,"path":616,"order":508,"children":617},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":619,"path":620,"order":508,"children":621},"contribute","\u002Fdocs\u002Fcontribute",[622,625,629,633,637,641,643,651,687,691],{"title":611,"path":623,"order":246,"children":624},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":626,"path":627,"order":508,"children":628},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":630,"path":631,"order":508,"children":632},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":634,"path":635,"order":508,"children":636},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":638,"path":639,"order":508,"children":640},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":5,"path":512,"order":508,"children":642},[],{"title":644,"path":645,"order":508,"children":646},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[647],{"title":648,"path":649,"order":508,"children":650},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":652,"path":653,"order":508,"children":654},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[655,659,663,667,671,675,679,683],{"title":656,"path":657,"order":508,"children":658},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":660,"path":661,"order":508,"children":662},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":664,"path":665,"order":508,"children":666},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":668,"path":669,"order":508,"children":670},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":672,"path":673,"order":508,"children":674},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":676,"path":677,"order":508,"children":678},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":680,"path":681,"order":508,"children":682},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":684,"path":685,"order":508,"children":686},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":688,"path":689,"order":508,"children":690},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":692,"path":693,"order":508,"children":694},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":696,"path":697,"order":508,"children":698},"device-agent","\u002Fdocs\u002Fdevice-agent",[699,703,706,710,714,718],{"title":700,"path":701,"order":246,"children":702},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":529,"path":704,"order":252,"children":705},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":707,"path":708,"order":264,"children":709},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":711,"path":712,"order":270,"children":713},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":715,"path":716,"order":276,"children":717},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":719,"path":720,"order":508,"children":721},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[722,727,731,735,739],{"title":723,"path":724,"group":725,"order":246,"children":726},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":728,"path":729,"group":725,"order":252,"children":730},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":732,"path":733,"group":725,"order":258,"children":734},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":736,"path":737,"group":725,"order":264,"children":738},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":740,"path":741,"group":725,"order":270,"children":742},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":744,"path":745,"order":508,"children":746},"hardware","\u002Fdocs\u002Fhardware",[747,750,754,758],{"title":723,"path":748,"order":246,"children":749},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":751,"path":752,"order":252,"children":753},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":755,"path":756,"order":258,"children":757},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":759,"path":760,"order":258,"children":761},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":719,"path":763,"order":508,"children":764},"\u002Fdocs\u002Finstall",[765,768,772,776,796,800,804,808],{"title":723,"path":766,"order":246,"children":767},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":769,"path":770,"order":508,"children":771},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":773,"path":774,"order":508,"children":775},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":777,"path":778,"order":508,"children":779},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[780,784,788,792],{"title":781,"path":782,"order":508,"children":783},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":785,"path":786,"order":508,"children":787},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":789,"path":790,"order":508,"children":791},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":793,"path":794,"order":508,"children":795},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":797,"path":798,"order":508,"children":799},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":801,"path":802,"order":508,"children":803},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":805,"path":806,"order":508,"children":807},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":809,"path":810,"order":508,"children":811},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[812,816,820,824,828,832],{"title":813,"path":814,"order":508,"children":815},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":817,"path":818,"order":508,"children":819},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":821,"path":822,"order":508,"children":823},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":825,"path":826,"order":508,"children":827},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":829,"path":830,"order":508,"children":831},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":833,"path":834,"order":508,"children":835},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":837,"path":838,"order":508,"children":839},"migration","\u002Fdocs\u002Fmigration",[840,843],{"title":611,"path":841,"order":246,"children":842},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":844,"path":845,"order":508,"children":846},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":848,"path":849,"order":508,"children":850},"user","\u002Fdocs\u002Fuser",[851,855,859,863,867,871,875,879,883,887,891,895,907,911,915,919,923,927,931,935,939,943,947,951,955,959,962,966],{"title":852,"path":853,"order":246,"children":854},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":856,"path":857,"order":246,"children":858},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":860,"path":861,"order":252,"children":862},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":864,"path":865,"order":252,"children":866},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":868,"path":869,"order":299,"children":870},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":872,"path":873,"order":508,"children":874},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":876,"path":877,"order":508,"children":878},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":880,"path":881,"order":508,"children":882},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":884,"path":885,"order":508,"children":886},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":888,"path":889,"order":508,"children":890},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":892,"path":893,"order":508,"children":894},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":896,"path":897,"order":508,"children":898},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[899,903],{"title":900,"path":901,"order":508,"children":902},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":904,"path":905,"order":508,"children":906},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":908,"path":909,"order":508,"children":910},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":912,"path":913,"order":508,"children":914},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":916,"path":917,"order":508,"children":918},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":920,"path":921,"order":508,"children":922},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":924,"path":925,"order":508,"children":926},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":928,"path":929,"order":508,"children":930},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":932,"path":933,"order":508,"children":934},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":936,"path":937,"order":508,"children":938},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":940,"path":941,"order":508,"children":942},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":944,"path":945,"order":508,"children":946},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":948,"path":949,"order":508,"children":950},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":952,"path":953,"order":508,"children":954},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":956,"path":957,"order":508,"children":958},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":688,"path":960,"order":508,"children":961},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":963,"path":964,"order":508,"children":965},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":967,"path":968,"order":508,"children":969},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546037447]