[{"data":1,"prerenderedAt":1657},["ShallowReactive",2],{"docs-\u002Fdocs\u002Finstall\u002Ffile-storage\u002F":3,"docs-nav":1205},{"id":4,"title":5,"body":6,"description":16,"extension":1194,"layout":1195,"meta":1196,"navGroup":1195,"navGroupOrder":1195,"navOrder":1195,"navTitle":5,"navigation":1197,"originalPath":1198,"path":1199,"redirect":1195,"seo":1200,"stem":1201,"updated":1202,"version":1203,"__hash__":1204},"docs\u002Fdocs\u002Finstall\u002Ffile-storage\u002Findex.md","FlowFuse File Storage",{"type":7,"value":8,"toc":1172},"minimark",[9,13,17,39,42,47,50,140,143,146,152,155,160,181,184,260,267,272,282,323,332,335,338,346,351,354,372,375,381,411,414,435,438,491,494,497,500,504,507,550,556,606,610,613,705,717,720,815,819,822,825,828,833,840,843,846,849,852,856,910,912,968,972,1063,1065,1156,1160,1168],[10,11,5],"h1",{"id":12},"flowfuse-file-storage",[14,15,16],"p",{},"FlowFuse has two storage-related features for Node-RED instances in container-based deployments. They are not mutually exclusive, and some deployments use both.",[18,19,20,33],"ul",{},[21,22,23,27,28,32],"li",{},[24,25,26],"strong",{},"Persistent Storage"," mounts a persistent volume into the Node-RED instance at ",[29,30,31],"code",{},"\u002Fdata\u002Fstorage",". This was introduced in FlowFuse v2.6.0 for Kubernetes.",[21,34,35,38],{},[24,36,37],{},"The File Storage service"," provides the FlowFuse File nodes and Persistent Context.",[14,40,41],{},"The rest of this page is structured around those two features so it is clearer which configuration you need.",[43,44,46],"h2",{"id":45},"which-configuration-do-i-need","Which configuration do I need?",[14,48,49],{},"Use the following guide when choosing what to configure:",[51,52,53,69],"table",{},[54,55,56],"thead",{},[57,58,59,63,66],"tr",{},[60,61,62],"th",{},"Requirement",[60,64,65],{},"FlowFuse version",[60,67,68],{},"What to configure",[70,71,72,89,101,127],"tbody",{},[57,73,74,78,81],{},[75,76,77],"td",{},"Files written directly by the Node-RED instance must survive restart, suspend\u002Fresume, or stack upgrades",[75,79,80],{},"v2.6.0 or later",[75,82,83,84],{},"Configure ",[85,86,88],"a",{"href":87},"#persistent-storage-for-node-red-instances","Persistent Storage for Node-RED instances",[57,90,91,93,96],{},[75,92],{},[75,94,95],{},"Before v2.6.0",[75,97,83,98],{},[85,99,37],{"href":100},"#the-file-storage-service",[57,102,103,112,114],{},[75,104,105,106],{},"You want to use ",[85,107,111],{"href":108,"rel":109},"https:\u002F\u002Fflowfuse.com\u002Fdocs\u002Fuser\u002Fpersistent-context\u002F",[110],"nofollow","FlowFuse Persistent Context",[75,113,80],{},[75,115,83,116,118,119,123,124,126],{},[85,117,37],{"href":100}," and the ",[85,120,122],{"href":121},"#persistent-context-configuration","Persistent Context configuration",". If the instance also needs persistent filesystem access, configure ",[85,125,88],{"href":87}," as well.",[57,128,129,131,133],{},[75,130],{},[75,132,95],{},[75,134,83,135,118,137,139],{},[85,136,37],{"href":100},[85,138,122],{"href":121},". The File Storage service also provides persistent storage for the instance.",[43,141,88],{"id":142},"persistent-storage-for-node-red-instances",[14,144,145],{},"As part of the FlowFuse v2.6.0 release, a new Persistent Storage approach was implemented for Kubernetes. Docker support will follow.",[14,147,148,149,151],{},"This mounts a Persistent Volume into the container running the Node-RED instance on ",[29,150,31],{},".\nFiles written to this location are preserved for the life of the instance and across suspend\u002Fresume operations and stack upgrades.",[14,153,154],{},"If you are using FlowFuse version lower than v2.6.0, you will need to use the File Storage service to provide persistent storage to Node-RED or upgrade to v2.6.0 or later to use this feature.",[156,157,159],"h3",{"id":158},"configuring","Configuring",[14,161,162,163,166,167,170,171,174,175,180],{},"Create a Kubernetes ",[29,164,165],{},"StorageClass"," that allows dynamic provisioning of ",[29,168,169],{},"PersistentVolumes"," from ",[29,172,173],{},"PersistentVolumeClaims",", for example the ",[85,176,179],{"href":177,"rel":178},"https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Faws-efs-csi-driver",[110],"AWS EFS CSI driver",".",[14,182,183],{},"Then pass the following values to the FlowFuse Helm Chart when upgrading.",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","forge:\n  persistentStorage:\n    enabled: true\n    storageClass: '\u003Cname of StorageClass>'\n    size: '5Gi'\n","yaml","",[29,192,193,206,214,227,245],{"__ignoreMap":190},[194,195,198,202],"span",{"class":196,"line":197},"line",1,[194,199,201],{"class":200},"swJcz","forge",[194,203,205],{"class":204},"sMK4o",":\n",[194,207,209,212],{"class":196,"line":208},2,[194,210,211],{"class":200},"  persistentStorage",[194,213,205],{"class":204},[194,215,217,220,223],{"class":196,"line":216},3,[194,218,219],{"class":200},"    enabled",[194,221,222],{"class":204},":",[194,224,226],{"class":225},"sfNiH"," true\n",[194,228,230,233,235,238,242],{"class":196,"line":229},4,[194,231,232],{"class":200},"    storageClass",[194,234,222],{"class":204},[194,236,237],{"class":204}," '",[194,239,241],{"class":240},"sfazB","\u003Cname of StorageClass>",[194,243,244],{"class":204},"'\n",[194,246,248,251,253,255,258],{"class":196,"line":247},5,[194,249,250],{"class":200},"    size",[194,252,222],{"class":204},[194,254,237],{"class":204},[194,256,257],{"class":240},"5Gi",[194,259,244],{"class":204},[14,261,262,263,266],{},"Where ",[29,264,265],{},"size"," is the default size for the volume.",[268,269,271],"h4",{"id":270},"azure","Azure",[14,273,274,275,278,279,222],{},"If you are using the ",[29,276,277],{},"azurefile-csi"," Persistent Storage driver then we recommend adding the following to the ",[29,280,281],{},"StorageClass mountOptions",[185,283,285],{"className":187,"code":284,"language":189,"meta":190,"style":190},"mountOptions:\n  - dir_mode=0777\n  - file_mode=0777\n  - mfsymlinks\n  - nobrl\n",[29,286,287,294,302,309,316],{"__ignoreMap":190},[194,288,289,292],{"class":196,"line":197},[194,290,291],{"class":200},"mountOptions",[194,293,205],{"class":204},[194,295,296,299],{"class":196,"line":208},[194,297,298],{"class":204},"  -",[194,300,301],{"class":240}," dir_mode=0777\n",[194,303,304,306],{"class":196,"line":216},[194,305,298],{"class":204},[194,307,308],{"class":240}," file_mode=0777\n",[194,310,311,313],{"class":196,"line":229},[194,312,298],{"class":204},[194,314,315],{"class":240}," mfsymlinks\n",[194,317,318,320],{"class":196,"line":247},[194,319,298],{"class":204},[194,321,322],{"class":240}," nobrl\n",[14,324,325,326,331],{},"See ",[85,327,330],{"href":328,"rel":329},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Ftroubleshoot\u002Fazure\u002Fazure-kubernetes\u002Fstorage\u002Fmountoptions-settings-azure-files",[110],"the Azure Kubernetes documentation"," for more details.",[43,333,37],{"id":334},"the-file-storage-service",[14,336,337],{},"The FlowFuse Platform includes a File Storage service that provides:",[18,339,340,343],{},[21,341,342],{},"A set of custom File nodes that behave the same way as the standard Node-RED\nFile nodes",[21,344,345],{},"An optional Persistent Context store for storing context data within flows.\nThis feature is only available for platforms running with a premium license.",[14,347,348,349,180],{},"On FlowFuse v2.6.0 or later, the File Storage service is used exclusively for Persistent Context. Instance-level Persistent Storage is handled separately via ",[85,350,88],{"href":87},[14,352,353],{},"Before FlowFuse v2.6.0, this service was also the primary way to provide persistent storage to Node-RED in container-based environments, in addition to Persistent Context.",[355,356,360,365],"div",{"className":357},[358,359],"ff-callout","ff-callout--note",[14,361,364],{"className":362},[363],"ff-callout__title","Note",[355,366,369],{"className":367},[368],"ff-callout__content",[14,370,371],{},"The File Storage service is only required in Docker or Kubernetes environments. If you are using the LocalFS platform driver, Node-RED already has direct access to the local filesystem.",[156,373,159],{"id":374},"configuring-1",[14,376,377,378,180],{},"The File Storage server has its own configuration file: ",[29,379,380],{},"etc\u002Fflowforge-storage.yml",[18,382,383,389],{},[21,384,385,388],{},[24,386,387],{},"Docker Compose"," - edit the file directly before starting the service",[21,390,391,394,395,398,399,402,403,406,407,410],{},[24,392,393],{},"Kubernetes\u002FHelm"," - include the options in your ",[29,396,397],{},"customization.yml",", using ",[29,400,401],{},"forge.fileStore.*"," as the property name prefix.\nYou must also set ",[29,404,405],{},"forge.fileStore.enabled"," to ",[29,408,409],{},"true"," to tell Helm to deploy the service.",[14,412,413],{},"There are three parts to the configuration:",[18,415,416,423,430],{},[21,417,418,422],{},[85,419,421],{"href":420},"#platform-configuration","Platform Configuration"," - how to access the main FlowFuse platform application",[21,424,425,429],{},[85,426,428],{"href":427},"#file-storage-service-configuration","File Storage service configuration"," - what storage to use for the File nodes",[21,431,432,434],{},[85,433,122],{"href":121}," - what storage to use for Persistent Context",[156,436,421],{"id":437},"platform-configuration",[51,439,440,450],{},[54,441,442],{},[57,443,444,447],{},[60,445,446],{},"Option",[60,448,449],{},"Description",[70,451,452,465,478],{},[57,453,454,459],{},[75,455,456],{},[29,457,458],{},"host",[75,460,461,462,180],{},"Where to listen for incoming connections. Default: ",[29,463,464],{},"0.0.0.0",[57,466,467,472],{},[75,468,469],{},[29,470,471],{},"port",[75,473,474,475],{},"The port to listen on. Default: ",[29,476,477],{},"3001",[57,479,480,485],{},[75,481,482],{},[29,483,484],{},"base_url",[75,486,487,488],{},"The url to access the FlowFuse platform on. This defaults to ",[29,489,490],{},"http:\u002F\u002Flocalhost:3000",[156,492,428],{"id":493},"file-storage-service-configuration",[14,495,496],{},"The File Storage configuration determines where the files used by the Node-RED File nodes are stored.",[14,498,499],{},"You can configure it to store files either on the local filesystem of the File Storage server or in an AWS S3-compatible service.",[268,501,503],{"id":502},"localfs","LocalFS",[14,505,506],{},"Stores the files locally, for example by using a volume mounted into the File Storage server container.",[51,508,509,517],{},[54,510,511],{},[57,512,513,515],{},[60,514,446],{},[60,516,449],{},[70,518,519,530,540],{},[57,520,521,526],{},[75,522,523],{},[29,524,525],{},"driver.type",[75,527,528],{},[29,529,502],{},[57,531,532,537],{},[75,533,534],{},[29,535,536],{},"driver.quota",[75,538,539],{},"A per-instance quota for how much data will be stored - in bytes. If this is not set, no limit will be applied",[57,541,542,547],{},[75,543,544],{},[29,545,546],{},"driver.options.root",[75,548,549],{},"The root path under which Node-RED instance data should be stored.",[14,551,552,553,555],{},"The following shows an example configuration using the ",[29,554,502],{}," file driver.",[185,557,559],{"className":187,"code":558,"language":189,"meta":190,"style":190},"driver:\n  type: localfs\n  quota: 104857600\n  options:\n    root: var\u002Froot\n",[29,560,561,568,578,589,596],{"__ignoreMap":190},[194,562,563,566],{"class":196,"line":197},[194,564,565],{"class":200},"driver",[194,567,205],{"class":204},[194,569,570,573,575],{"class":196,"line":208},[194,571,572],{"class":200},"  type",[194,574,222],{"class":204},[194,576,577],{"class":240}," localfs\n",[194,579,580,583,585],{"class":196,"line":216},[194,581,582],{"class":200},"  quota",[194,584,222],{"class":204},[194,586,588],{"class":587},"sbssI"," 104857600\n",[194,590,591,594],{"class":196,"line":229},[194,592,593],{"class":200},"  options",[194,595,205],{"class":204},[194,597,598,601,603],{"class":196,"line":247},[194,599,600],{"class":200},"    root",[194,602,222],{"class":204},[194,604,605],{"class":240}," var\u002Froot\n",[268,607,609],{"id":608},"s3-compatible-storage","S3 Compatible Storage",[14,611,612],{},"Stores the files in an external service using the AWS S3 API.",[51,614,615,623],{},[54,616,617],{},[57,618,619,621],{},[60,620,446],{},[60,622,449],{},[70,624,625,636,644,654,664,674,685,695],{},[57,626,627,631],{},[75,628,629],{},[29,630,525],{},[75,632,633],{},[29,634,635],{},"s3",[57,637,638,642],{},[75,639,640],{},[29,641,536],{},[75,643,539],{},[57,645,646,651],{},[75,647,648],{},[29,649,650],{},"driver.options.bucket",[75,652,653],{},"Name of the S3 bucket to use (required)",[57,655,656,661],{},[75,657,658],{},[29,659,660],{},"driver.options.region",[75,662,663],{},"Name of AWS region of the bucket (required)",[57,665,666,671],{},[75,667,668],{},[29,669,670],{},"driver.options.endpoint",[75,672,673],{},"S3 ObjectStore Endpoint, if not using AWS S3",[57,675,676,681],{},[75,677,678],{},[29,679,680],{},"driver.options.forcePathStyle",[75,682,683],{},[29,684,409],{},[57,686,687,692],{},[75,688,689],{},[29,690,691],{},"driver.options.credential.accessKeyId",[75,693,694],{},"Account ID \u002F Username",[57,696,697,702],{},[75,698,699],{},[29,700,701],{},"driver.options.credential.secretAccessKey",[75,703,704],{},"Secret Key \u002F Password",[14,706,707,708,711,712,180],{},"The full list of valid options under ",[29,709,710],{},"driver.options"," is available in the ",[85,713,716],{"href":714,"rel":715},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAWSJavaScriptSDK\u002Fv3\u002Flatest\u002Fclients\u002Fclient-s3\u002Finterfaces\u002Fs3clientconfig.html",[110],"AWS S3Client documentation",[14,718,719],{},"For example:",[185,721,723],{"className":187,"code":722,"language":189,"meta":190,"style":190},"driver:\n  type: s3\n  quota: 104857600\n  options:\n    bucket: flowforge-files\n    credentials:\n      accessKeyId: XXXXXXXXXXXXXXXXXXX\n      secretAccessKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n    forcePathStyle: true\n    region: us-east-1\n",[29,724,725,731,740,748,754,764,772,783,794,804],{"__ignoreMap":190},[194,726,727,729],{"class":196,"line":197},[194,728,565],{"class":200},[194,730,205],{"class":204},[194,732,733,735,737],{"class":196,"line":208},[194,734,572],{"class":200},[194,736,222],{"class":204},[194,738,739],{"class":240}," s3\n",[194,741,742,744,746],{"class":196,"line":216},[194,743,582],{"class":200},[194,745,222],{"class":204},[194,747,588],{"class":587},[194,749,750,752],{"class":196,"line":229},[194,751,593],{"class":200},[194,753,205],{"class":204},[194,755,756,759,761],{"class":196,"line":247},[194,757,758],{"class":200},"    bucket",[194,760,222],{"class":204},[194,762,763],{"class":240}," flowforge-files\n",[194,765,767,770],{"class":196,"line":766},6,[194,768,769],{"class":200},"    credentials",[194,771,205],{"class":204},[194,773,775,778,780],{"class":196,"line":774},7,[194,776,777],{"class":200},"      accessKeyId",[194,779,222],{"class":204},[194,781,782],{"class":240}," XXXXXXXXXXXXXXXXXXX\n",[194,784,786,789,791],{"class":196,"line":785},8,[194,787,788],{"class":200},"      secretAccessKey",[194,790,222],{"class":204},[194,792,793],{"class":240}," XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n",[194,795,797,800,802],{"class":196,"line":796},9,[194,798,799],{"class":200},"    forcePathStyle",[194,801,222],{"class":204},[194,803,226],{"class":225},[194,805,807,810,812],{"class":196,"line":806},10,[194,808,809],{"class":200},"    region",[194,811,222],{"class":204},[194,813,814],{"class":240}," us-east-1\n",[268,816,818],{"id":817},"enabling-the-flowfuse-file-nodes","Enabling the FlowFuse File Nodes",[14,820,821],{},"The FlowFuse File nodes have been written to be direct replacements\nfor the Node-RED core file-in and file-out nodes. This means that only\none version of these nodes can be active in Node-RED at a time.",[14,823,824],{},"The FlowFuse File nodes will automatically disable themselves if the\ncore nodes are present. This means to enable the nodes you need to\nexclude the code nodes.",[14,826,827],{},"This can be done in the FlowFuse Template.",[829,830],"img",{"src":831,"width":832},"\u002Fdocs\u002Finstall\u002Fimages\u002Ffile-node-template.png",500,[14,834,835,836,839],{},"Adding ",[29,837,838],{},"10-file.js"," to the list of \"Excluded nodes by filename\" section will ensure that the core file nodes are not loaded by Node-RED.",[156,841,122],{"id":842},"persistent-context-configuration",[14,844,845],{},"The Context Storage configuration determines where Node-RED Context data is stored.",[14,847,848],{},"This feature is only available when running with a FlowFuse Premium license.",[14,850,851],{},"Due to the different access patterns for context data, this requires a separate\nstorage configuration to the File store. It can use either an SQLite or PostgreSQL\ndatabase.",[268,853,855],{"id":854},"sqlite","SQLite",[51,857,858,866],{},[54,859,860],{},[57,861,862,864],{},[60,863,446],{},[60,865,449],{},[70,867,868,880,889,900],{},[57,869,870,875],{},[75,871,872],{},[29,873,874],{},"context.type",[75,876,877],{},[29,878,879],{},"sequelize",[57,881,882,887],{},[75,883,884],{},[29,885,886],{},"context.quote",[75,888,539],{},[57,890,891,896],{},[75,892,893],{},[29,894,895],{},"context.options.type",[75,897,898],{},[29,899,854],{},[57,901,902,907],{},[75,903,904],{},[29,905,906],{},"context.options.storage",[75,908,909],{},"Path to the sqlite database file to use",[14,911,719],{},[185,913,915],{"className":187,"code":914,"language":189,"meta":190,"style":190},"context:\n  type: sequelize\n  quota: 1048576\n  options:\n    type: sqlite\n    storage: ff-context.db\n",[29,916,917,924,933,942,948,958],{"__ignoreMap":190},[194,918,919,922],{"class":196,"line":197},[194,920,921],{"class":200},"context",[194,923,205],{"class":204},[194,925,926,928,930],{"class":196,"line":208},[194,927,572],{"class":200},[194,929,222],{"class":204},[194,931,932],{"class":240}," sequelize\n",[194,934,935,937,939],{"class":196,"line":216},[194,936,582],{"class":200},[194,938,222],{"class":204},[194,940,941],{"class":587}," 1048576\n",[194,943,944,946],{"class":196,"line":229},[194,945,593],{"class":200},[194,947,205],{"class":204},[194,949,950,953,955],{"class":196,"line":247},[194,951,952],{"class":200},"    type",[194,954,222],{"class":204},[194,956,957],{"class":240}," sqlite\n",[194,959,960,963,965],{"class":196,"line":766},[194,961,962],{"class":200},"    storage",[194,964,222],{"class":204},[194,966,967],{"class":240}," ff-context.db\n",[268,969,971],{"id":970},"postgresql","PostgreSQL",[51,973,974,982],{},[54,975,976],{},[57,977,978,980],{},[60,979,446],{},[60,981,449],{},[70,983,984,994,1002,1013,1023,1033,1043,1053],{},[57,985,986,990],{},[75,987,988],{},[29,989,874],{},[75,991,992],{},[29,993,879],{},[57,995,996,1000],{},[75,997,998],{},[29,999,886],{},[75,1001,539],{},[57,1003,1004,1008],{},[75,1005,1006],{},[29,1007,895],{},[75,1009,1010],{},[29,1011,1012],{},"postgres",[57,1014,1015,1020],{},[75,1016,1017],{},[29,1018,1019],{},"context.options.host",[75,1021,1022],{},"The hostname of the database server",[57,1024,1025,1030],{},[75,1026,1027],{},[29,1028,1029],{},"context.options.port",[75,1031,1032],{},"The port of the database server",[57,1034,1035,1040],{},[75,1036,1037],{},[29,1038,1039],{},"context.options.database",[75,1041,1042],{},"The name of the database to store context data in",[57,1044,1045,1050],{},[75,1046,1047],{},[29,1048,1049],{},"context.options.username",[75,1051,1052],{},"The username to access to the database with",[57,1054,1055,1060],{},[75,1056,1057],{},[29,1058,1059],{},"context.options.password",[75,1061,1062],{},"The password to access to the database with",[14,1064,719],{},[185,1066,1068],{"className":187,"code":1067,"language":189,"meta":190,"style":190},"context:\n  type: sequelize\n  quota: 1048576\n  options:\n    type: postgres\n    host: flowforge-postgresql\n    port: 5432\n    database: ff-context\n    username: postgres\n    password: password\n",[29,1069,1070,1076,1084,1092,1098,1107,1117,1127,1137,1146],{"__ignoreMap":190},[194,1071,1072,1074],{"class":196,"line":197},[194,1073,921],{"class":200},[194,1075,205],{"class":204},[194,1077,1078,1080,1082],{"class":196,"line":208},[194,1079,572],{"class":200},[194,1081,222],{"class":204},[194,1083,932],{"class":240},[194,1085,1086,1088,1090],{"class":196,"line":216},[194,1087,582],{"class":200},[194,1089,222],{"class":204},[194,1091,941],{"class":587},[194,1093,1094,1096],{"class":196,"line":229},[194,1095,593],{"class":200},[194,1097,205],{"class":204},[194,1099,1100,1102,1104],{"class":196,"line":247},[194,1101,952],{"class":200},[194,1103,222],{"class":204},[194,1105,1106],{"class":240}," postgres\n",[194,1108,1109,1112,1114],{"class":196,"line":766},[194,1110,1111],{"class":200},"    host",[194,1113,222],{"class":204},[194,1115,1116],{"class":240}," flowforge-postgresql\n",[194,1118,1119,1122,1124],{"class":196,"line":774},[194,1120,1121],{"class":200},"    port",[194,1123,222],{"class":204},[194,1125,1126],{"class":587}," 5432\n",[194,1128,1129,1132,1134],{"class":196,"line":785},[194,1130,1131],{"class":200},"    database",[194,1133,222],{"class":204},[194,1135,1136],{"class":240}," ff-context\n",[194,1138,1139,1142,1144],{"class":196,"line":796},[194,1140,1141],{"class":200},"    username",[194,1143,222],{"class":204},[194,1145,1106],{"class":240},[194,1147,1148,1151,1153],{"class":196,"line":806},[194,1149,1150],{"class":200},"    password",[194,1152,222],{"class":204},[194,1154,1155],{"class":240}," password\n",[43,1157,1159],{"id":1158},"working-with-flowfuse-devices","Working with FlowFuse Devices",[14,1161,1162,1163,1167],{},"The FlowFuse Device Agent does ",[1164,1165,1166],"em",{},"not"," use the File Storage service. Any flows\nusing the file nodes or persistent context that are deployed to a Device will use\nthe local filesystem directly.",[1169,1170,1171],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .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}",{"title":190,"searchDepth":229,"depth":229,"links":1173},[1174,1175,1180,1193],{"id":45,"depth":208,"text":46},{"id":142,"depth":208,"text":88,"children":1176},[1177],{"id":158,"depth":216,"text":159,"children":1178},[1179],{"id":270,"depth":229,"text":271},{"id":334,"depth":208,"text":37,"children":1181},[1182,1183,1184,1189],{"id":374,"depth":216,"text":159},{"id":437,"depth":216,"text":421},{"id":493,"depth":216,"text":428,"children":1185},[1186,1187,1188],{"id":502,"depth":229,"text":503},{"id":608,"depth":229,"text":609},{"id":817,"depth":229,"text":818},{"id":842,"depth":216,"text":122,"children":1190},[1191,1192],{"id":854,"depth":229,"text":855},{"id":970,"depth":229,"text":971},{"id":1158,"depth":208,"text":1159},"md",null,{},true,"install\u002Ffile-storage\u002FREADME.md","\u002Fdocs\u002Finstall\u002Ffile-storage",{"title":5,"description":16},"docs\u002Finstall\u002Ffile-storage\u002Findex","2026-03-16 16:52:07 +0100","2.33.2","pyx0dyIPKs2XhJdsz26ALlugwWczn_aSWpaggIqfOY0",[1206,1213,1232,1243],{"name":1207,"order":197,"children":1208},"FlowFuse User Manuals",[1209],{"title":1210,"path":1211,"group":1207,"groupOrder":197,"order":208,"children":1212},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":1214,"order":229,"children":1215},"FlowFuse Self-Hosted",[1216,1220],{"title":1217,"path":1218,"group":1214,"groupOrder":229,"order":197,"children":1219},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":1221,"path":1222,"group":1214,"groupOrder":229,"order":216,"children":1223},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[1224,1228],{"title":1225,"path":1226,"order":1195,"children":1227},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":1229,"path":1230,"order":1195,"children":1231},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":1233,"order":247,"children":1234},"Support",[1235,1239],{"title":1236,"path":1237,"group":1233,"groupOrder":247,"order":216,"children":1238},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":1240,"path":1241,"group":1233,"groupOrder":247,"order":1195,"children":1242},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":1244,"order":1195,"children":1245},"Other",[1246,1294,1306,1385,1433,1452,1524,1535],{"title":1247,"path":1248,"order":1195,"children":1249},"admin","\u002Fdocs\u002Fadmin",[1250,1254,1266,1274,1278,1282,1286,1290],{"title":1251,"path":1252,"order":197,"children":1253},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":1255,"path":1256,"order":1195,"children":1257},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[1258,1262],{"title":1259,"path":1260,"order":1195,"children":1261},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":1263,"path":1264,"order":1195,"children":1265},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":1267,"path":1268,"order":1195,"children":1269},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[1270],{"title":1271,"path":1272,"order":1195,"children":1273},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":1275,"path":1276,"order":1195,"children":1277},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":1279,"path":1280,"order":1195,"children":1281},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":1283,"path":1284,"order":1195,"children":1285},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":1287,"path":1288,"order":1195,"children":1289},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":1291,"path":1292,"order":1195,"children":1293},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":1295,"path":1296,"order":1195,"children":1297},"cloud","\u002Fdocs\u002Fcloud",[1298,1302],{"title":1299,"path":1300,"order":197,"children":1301},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":1303,"path":1304,"order":1195,"children":1305},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":1307,"path":1308,"order":1195,"children":1309},"contribute","\u002Fdocs\u002Fcontribute",[1310,1313,1317,1321,1325,1329,1333,1341,1377,1381],{"title":1299,"path":1311,"order":197,"children":1312},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":1314,"path":1315,"order":1195,"children":1316},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":1318,"path":1319,"order":1195,"children":1320},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":1322,"path":1323,"order":1195,"children":1324},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":1326,"path":1327,"order":1195,"children":1328},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":1330,"path":1331,"order":1195,"children":1332},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":1334,"path":1335,"order":1195,"children":1336},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[1337],{"title":1338,"path":1339,"order":1195,"children":1340},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":1342,"path":1343,"order":1195,"children":1344},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[1345,1349,1353,1357,1361,1365,1369,1373],{"title":1346,"path":1347,"order":1195,"children":1348},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":1350,"path":1351,"order":1195,"children":1352},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":1354,"path":1355,"order":1195,"children":1356},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":1358,"path":1359,"order":1195,"children":1360},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":1362,"path":1363,"order":1195,"children":1364},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":1366,"path":1367,"order":1195,"children":1368},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":1370,"path":1371,"order":1195,"children":1372},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":1374,"path":1375,"order":1195,"children":1376},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":1378,"path":1379,"order":1195,"children":1380},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":1382,"path":1383,"order":1195,"children":1384},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":1386,"path":1387,"order":1195,"children":1388},"device-agent","\u002Fdocs\u002Fdevice-agent",[1389,1393,1396,1400,1404,1408],{"title":1390,"path":1391,"order":197,"children":1392},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":1217,"path":1394,"order":208,"children":1395},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":1397,"path":1398,"order":229,"children":1399},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":1401,"path":1402,"order":247,"children":1403},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":1405,"path":1406,"order":766,"children":1407},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":1409,"path":1410,"order":1195,"children":1411},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[1412,1417,1421,1425,1429],{"title":1413,"path":1414,"group":1415,"order":197,"children":1416},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":1418,"path":1419,"group":1415,"order":208,"children":1420},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":1422,"path":1423,"group":1415,"order":216,"children":1424},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":1426,"path":1427,"group":1415,"order":229,"children":1428},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":1430,"path":1431,"group":1415,"order":247,"children":1432},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":1434,"path":1435,"order":1195,"children":1436},"hardware","\u002Fdocs\u002Fhardware",[1437,1440,1444,1448],{"title":1413,"path":1438,"order":197,"children":1439},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":1441,"path":1442,"order":208,"children":1443},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":1445,"path":1446,"order":216,"children":1447},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":1449,"path":1450,"order":216,"children":1451},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":1409,"path":1453,"order":1195,"children":1454},"\u002Fdocs\u002Finstall",[1455,1458,1462,1466,1486,1490,1494,1496],{"title":1413,"path":1456,"order":197,"children":1457},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":1459,"path":1460,"order":1195,"children":1461},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":1463,"path":1464,"order":1195,"children":1465},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":1467,"path":1468,"order":1195,"children":1469},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[1470,1474,1478,1482],{"title":1471,"path":1472,"order":1195,"children":1473},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":1475,"path":1476,"order":1195,"children":1477},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":1479,"path":1480,"order":1195,"children":1481},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":1483,"path":1484,"order":1195,"children":1485},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":1487,"path":1488,"order":1195,"children":1489},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":1491,"path":1492,"order":1195,"children":1493},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":5,"path":1199,"order":1195,"children":1495},[],{"title":1497,"path":1498,"order":1195,"children":1499},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[1500,1504,1508,1512,1516,1520],{"title":1501,"path":1502,"order":1195,"children":1503},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":1505,"path":1506,"order":1195,"children":1507},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":1509,"path":1510,"order":1195,"children":1511},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":1513,"path":1514,"order":1195,"children":1515},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":1517,"path":1518,"order":1195,"children":1519},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":1521,"path":1522,"order":1195,"children":1523},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":1525,"path":1526,"order":1195,"children":1527},"migration","\u002Fdocs\u002Fmigration",[1528,1531],{"title":1299,"path":1529,"order":197,"children":1530},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":1532,"path":1533,"order":1195,"children":1534},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":1536,"path":1537,"order":1195,"children":1538},"user","\u002Fdocs\u002Fuser",[1539,1543,1547,1551,1555,1559,1563,1567,1571,1575,1579,1583,1595,1599,1603,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1649,1653],{"title":1540,"path":1541,"order":197,"children":1542},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":1544,"path":1545,"order":197,"children":1546},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":1548,"path":1549,"order":208,"children":1550},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":1552,"path":1553,"order":208,"children":1554},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":1556,"path":1557,"order":806,"children":1558},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":1560,"path":1561,"order":1195,"children":1562},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":1564,"path":1565,"order":1195,"children":1566},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":1568,"path":1569,"order":1195,"children":1570},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":1572,"path":1573,"order":1195,"children":1574},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":1576,"path":1577,"order":1195,"children":1578},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":1580,"path":1581,"order":1195,"children":1582},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":1584,"path":1585,"order":1195,"children":1586},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[1587,1591],{"title":1588,"path":1589,"order":1195,"children":1590},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":1592,"path":1593,"order":1195,"children":1594},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":1596,"path":1597,"order":1195,"children":1598},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":1600,"path":1601,"order":1195,"children":1602},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":111,"path":1604,"order":1195,"children":1605},"\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":1607,"path":1608,"order":1195,"children":1609},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":1611,"path":1612,"order":1195,"children":1613},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":1615,"path":1616,"order":1195,"children":1617},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":1619,"path":1620,"order":1195,"children":1621},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":1623,"path":1624,"order":1195,"children":1625},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":1627,"path":1628,"order":1195,"children":1629},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":1631,"path":1632,"order":1195,"children":1633},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":1635,"path":1636,"order":1195,"children":1637},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":1639,"path":1640,"order":1195,"children":1641},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":1643,"path":1644,"order":1195,"children":1645},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":1378,"path":1647,"order":1195,"children":1648},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":1650,"path":1651,"order":1195,"children":1652},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":1654,"path":1655,"order":1195,"children":1656},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546041276]