[{"data":1,"prerenderedAt":728},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcontribute\u002Fdb-migrations\u002F":3,"docs-nav":274},{"id":4,"title":5,"body":6,"description":16,"extension":262,"layout":263,"meta":264,"navGroup":263,"navGroupOrder":263,"navOrder":263,"navTitle":265,"navigation":266,"originalPath":267,"path":268,"redirect":263,"seo":269,"stem":270,"updated":271,"version":272,"__hash__":273},"docs\u002Fdocs\u002Fcontribute\u002Fdb-migrations.md","Database Migrations",{"type":7,"value":8,"toc":252},"minimark",[9,13,17,20,25,30,38,48,70,77,83,87,90,192,199,205,218,222,225,229,232,235,239,242,245,248],[10,11,5],"h1",{"id":12},"database-migrations",[14,15,16],"p",{},"Any changes made to the database models must include migrations\nthat can modify the database state from one state to another.",[14,18,19],{},"Whilst we use Sequelize as our ORM layer, we do not use the migration tooling\nit provides - we have our own.",[21,22,24],"h2",{"id":23},"creating-migrations","Creating migrations",[26,27,29],"h3",{"id":28},"filename","Filename",[14,31,32,33,37],{},"A migration is provided as JavaScript in the directory ",[34,35,36],"code",{},"forge\u002Fdb\u002Fmigrations",".\nIts file name must follow the pattern:",[39,40,45],"pre",{"className":41,"code":43,"language":44},[42],"language-text","YYYYMMDD-nn-description.js\n","text",[34,46,43],{"__ignoreMap":47},"",[49,50,51,58,64],"ul",{},[52,53,54,57],"li",{},[34,55,56],{},"YYYYMMDD"," - the date the migration is added",[52,59,60,63],{},[34,61,62],{},"nn"," - a two digit number",[52,65,66,69],{},[34,67,68],{},"description"," - a name for the migration",[14,71,72,73,76],{},"For example ",[34,74,75],{},"20220204-01-add-billing.js",".",[14,78,79,80,82],{},"This ensures the migrations have a natural order to be applied. The ",[34,81,62],{}," part of\nthe name allows multiple migrations to be added on the same day but is kept in the\nright order.",[26,84,86],{"id":85},"structure","Structure",[14,88,89],{},"The migration code should use the following layout:",[39,91,95],{"className":92,"code":93,"language":94,"meta":47,"style":47},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","module.exports = {\n    up: async (context) => {\n        \u002F\u002F Apply the migration\n    },\n    down: async (context) => {\n        \u002F\u002F Remove the migration\n    }\n}\n","js",[34,96,97,112,141,148,154,174,180,186],{"__ignoreMap":47},[98,99,102,106,109],"span",{"class":100,"line":101},"line",1,[98,103,105],{"class":104},"sMK4o","module.exports",[98,107,108],{"class":104}," =",[98,110,111],{"class":104}," {\n",[98,113,115,119,122,126,129,133,136,139],{"class":100,"line":114},2,[98,116,118],{"class":117},"s2Zo4","    up",[98,120,121],{"class":104},":",[98,123,125],{"class":124},"spNyl"," async",[98,127,128],{"class":104}," (",[98,130,132],{"class":131},"sHdIc","context",[98,134,135],{"class":104},")",[98,137,138],{"class":124}," =>",[98,140,111],{"class":104},[98,142,144],{"class":100,"line":143},3,[98,145,147],{"class":146},"sHwdD","        \u002F\u002F Apply the migration\n",[98,149,151],{"class":100,"line":150},4,[98,152,153],{"class":104},"    },\n",[98,155,157,160,162,164,166,168,170,172],{"class":100,"line":156},5,[98,158,159],{"class":117},"    down",[98,161,121],{"class":104},[98,163,125],{"class":124},[98,165,128],{"class":104},[98,167,132],{"class":131},[98,169,135],{"class":104},[98,171,138],{"class":124},[98,173,111],{"class":104},[98,175,177],{"class":100,"line":176},6,[98,178,179],{"class":146},"        \u002F\u002F Remove the migration\n",[98,181,183],{"class":100,"line":182},7,[98,184,185],{"class":104},"    }\n",[98,187,189],{"class":100,"line":188},8,[98,190,191],{"class":104},"}\n",[14,193,194,195,198],{},"The ",[34,196,197],{},"up"," function applies to the migration. This can be to create new tables, add columns\nto existing ones - whatever is needed.",[14,200,194,201,204],{},[34,202,203],{},"down"," function reverses the migration. It should restore the database back to\nhow it was prior to the migration.",[14,206,194,207,209,210,217],{},[34,208,132],{}," argument is an instance of ",[211,212,216],"a",{"href":213,"rel":214},"https:\u002F\u002Fsequelize.org\u002Fdocs\u002Fv6\u002Fother-topics\u002Fquery-interface\u002F",[215],"nofollow","Sequelize.QueryInterface"," that can be used to perform\noperations on the database.",[21,219,221],{"id":220},"applying-migrations","Applying migrations",[14,223,224],{},"Migrations are applied automatically at the start of the FlowFuse application. Down\nmigrations are not yet supported.",[21,226,228],{"id":227},"considerations-when-writing-migrations","Considerations when writing migrations",[14,230,231],{},"Whilst migrations give us the ability to make changes to the database, they must\nbe used with great care. A failing migration will prevent the platform from starting\nand may require manual intervention. Everything should be done to avoid that from\nhappening.",[14,233,234],{},"Certain types of migration need particular guidance and care over.",[26,236,238],{"id":237},"adding-constraints","Adding constraints",[14,240,241],{},"If a migration is adding a new constraint to an existing table, you need to consider\nvery carefully what impact that could have on an existing system with real data.",[14,243,244],{},"For example, adding a new 'unique' constraint where you cannot guarantee that\nconstraint hasn't already been broken. What strategy will you use to guard against\nthat or to help recover from it? What additional testing is needed for the migration\nto verify its behavior in those situations?",[14,246,247],{},"The preferred method to add a new unique constraint is by adding a new index to the\ndatabase. This is because SQLite doesn't provide a way to alter columns that doesn't\ninvolve dropping the whole table and triggering any cascade triggers.",[249,250,251],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":47,"searchDepth":150,"depth":150,"links":253},[254,258,259],{"id":23,"depth":114,"text":24,"children":255},[256,257],{"id":28,"depth":143,"text":29},{"id":85,"depth":143,"text":86},{"id":220,"depth":114,"text":221},{"id":227,"depth":114,"text":228,"children":260},[261],{"id":237,"depth":143,"text":238},"md",null,{},"Database migrations",true,"contribute\u002Fdb-migrations.md","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",{"title":5,"description":16},"docs\u002Fcontribute\u002Fdb-migrations","2024-07-19 20:33:52 +0530","2.33.2","B5j9MXVRF2WwJwufr-0sI2-PSQqhuHh9QJDNwn49erk",[275,282,301,312],{"name":276,"order":101,"children":277},"FlowFuse User Manuals",[278],{"title":279,"path":280,"group":276,"groupOrder":101,"order":114,"children":281},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":283,"order":150,"children":284},"FlowFuse Self-Hosted",[285,289],{"title":286,"path":287,"group":283,"groupOrder":150,"order":101,"children":288},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":290,"path":291,"group":283,"groupOrder":150,"order":143,"children":292},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[293,297],{"title":294,"path":295,"order":263,"children":296},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":298,"path":299,"order":263,"children":300},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":302,"order":156,"children":303},"Support",[304,308],{"title":305,"path":306,"group":302,"groupOrder":156,"order":143,"children":307},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":309,"path":310,"group":302,"groupOrder":156,"order":263,"children":311},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":313,"order":263,"children":314},"Other",[315,363,375,452,500,519,593,604],{"title":316,"path":317,"order":263,"children":318},"admin","\u002Fdocs\u002Fadmin",[319,323,335,343,347,351,355,359],{"title":320,"path":321,"order":101,"children":322},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":324,"path":325,"order":263,"children":326},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[327,331],{"title":328,"path":329,"order":263,"children":330},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":332,"path":333,"order":263,"children":334},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":336,"path":337,"order":263,"children":338},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[339],{"title":340,"path":341,"order":263,"children":342},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":344,"path":345,"order":263,"children":346},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":348,"path":349,"order":263,"children":350},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":352,"path":353,"order":263,"children":354},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":356,"path":357,"order":263,"children":358},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":360,"path":361,"order":263,"children":362},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":364,"path":365,"order":263,"children":366},"cloud","\u002Fdocs\u002Fcloud",[367,371],{"title":368,"path":369,"order":101,"children":370},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":372,"path":373,"order":263,"children":374},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":376,"path":377,"order":263,"children":378},"contribute","\u002Fdocs\u002Fcontribute",[379,382,386,390,394,396,400,408,444,448],{"title":368,"path":380,"order":101,"children":381},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":383,"path":384,"order":263,"children":385},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":387,"path":388,"order":263,"children":389},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":391,"path":392,"order":263,"children":393},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":265,"path":268,"order":263,"children":395},[],{"title":397,"path":398,"order":263,"children":399},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":401,"path":402,"order":263,"children":403},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[404],{"title":405,"path":406,"order":263,"children":407},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":409,"path":410,"order":263,"children":411},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[412,416,420,424,428,432,436,440],{"title":413,"path":414,"order":263,"children":415},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":417,"path":418,"order":263,"children":419},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":421,"path":422,"order":263,"children":423},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":425,"path":426,"order":263,"children":427},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":429,"path":430,"order":263,"children":431},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":433,"path":434,"order":263,"children":435},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":437,"path":438,"order":263,"children":439},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":441,"path":442,"order":263,"children":443},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":445,"path":446,"order":263,"children":447},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":449,"path":450,"order":263,"children":451},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":453,"path":454,"order":263,"children":455},"device-agent","\u002Fdocs\u002Fdevice-agent",[456,460,463,467,471,475],{"title":457,"path":458,"order":101,"children":459},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":286,"path":461,"order":114,"children":462},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":464,"path":465,"order":150,"children":466},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":468,"path":469,"order":156,"children":470},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":472,"path":473,"order":176,"children":474},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":476,"path":477,"order":263,"children":478},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[479,484,488,492,496],{"title":480,"path":481,"group":482,"order":101,"children":483},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":485,"path":486,"group":482,"order":114,"children":487},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":489,"path":490,"group":482,"order":143,"children":491},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":493,"path":494,"group":482,"order":150,"children":495},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":497,"path":498,"group":482,"order":156,"children":499},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":501,"path":502,"order":263,"children":503},"hardware","\u002Fdocs\u002Fhardware",[504,507,511,515],{"title":480,"path":505,"order":101,"children":506},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":508,"path":509,"order":114,"children":510},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":512,"path":513,"order":143,"children":514},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":516,"path":517,"order":143,"children":518},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":476,"path":520,"order":263,"children":521},"\u002Fdocs\u002Finstall",[522,525,529,533,553,557,561,565],{"title":480,"path":523,"order":101,"children":524},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":526,"path":527,"order":263,"children":528},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":530,"path":531,"order":263,"children":532},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":534,"path":535,"order":263,"children":536},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[537,541,545,549],{"title":538,"path":539,"order":263,"children":540},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":542,"path":543,"order":263,"children":544},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":546,"path":547,"order":263,"children":548},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":550,"path":551,"order":263,"children":552},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":554,"path":555,"order":263,"children":556},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":558,"path":559,"order":263,"children":560},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":562,"path":563,"order":263,"children":564},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":566,"path":567,"order":263,"children":568},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[569,573,577,581,585,589],{"title":570,"path":571,"order":263,"children":572},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":574,"path":575,"order":263,"children":576},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":578,"path":579,"order":263,"children":580},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":582,"path":583,"order":263,"children":584},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":586,"path":587,"order":263,"children":588},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":590,"path":591,"order":263,"children":592},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":594,"path":595,"order":263,"children":596},"migration","\u002Fdocs\u002Fmigration",[597,600],{"title":368,"path":598,"order":101,"children":599},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":601,"path":602,"order":263,"children":603},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":605,"path":606,"order":263,"children":607},"user","\u002Fdocs\u002Fuser",[608,612,616,620,624,629,633,637,641,645,649,653,665,669,673,677,681,685,689,693,697,701,705,709,713,717,720,724],{"title":609,"path":610,"order":101,"children":611},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":613,"path":614,"order":101,"children":615},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":617,"path":618,"order":114,"children":619},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":621,"path":622,"order":114,"children":623},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":625,"path":626,"order":627,"children":628},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",10,[],{"title":630,"path":631,"order":263,"children":632},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":634,"path":635,"order":263,"children":636},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":638,"path":639,"order":263,"children":640},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":642,"path":643,"order":263,"children":644},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":646,"path":647,"order":263,"children":648},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":650,"path":651,"order":263,"children":652},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":654,"path":655,"order":263,"children":656},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[657,661],{"title":658,"path":659,"order":263,"children":660},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":662,"path":663,"order":263,"children":664},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":666,"path":667,"order":263,"children":668},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":670,"path":671,"order":263,"children":672},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":674,"path":675,"order":263,"children":676},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":678,"path":679,"order":263,"children":680},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":682,"path":683,"order":263,"children":684},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":686,"path":687,"order":263,"children":688},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":690,"path":691,"order":263,"children":692},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":694,"path":695,"order":263,"children":696},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":698,"path":699,"order":263,"children":700},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":702,"path":703,"order":263,"children":704},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":706,"path":707,"order":263,"children":708},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":710,"path":711,"order":263,"children":712},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":714,"path":715,"order":263,"children":716},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":445,"path":718,"order":263,"children":719},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":721,"path":722,"order":263,"children":723},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":725,"path":726,"order":263,"children":727},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546037599]