[{"data":1,"prerenderedAt":2669},["ShallowReactive",2],{"docs-\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws\u002F":3,"docs-nav":2216},{"id":4,"title":5,"body":6,"description":16,"extension":2205,"layout":2206,"meta":2207,"navGroup":2206,"navGroupOrder":2206,"navOrder":2206,"navTitle":2208,"navigation":184,"originalPath":2209,"path":2210,"redirect":2206,"seo":2211,"stem":2212,"updated":2213,"version":2214,"__hash__":2215},"docs\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws.md","AWS EKS Specific details",{"type":7,"value":8,"toc":2185},"minimark",[9,13,17,20,34,39,44,47,55,58,61,64,67,73,77,80,84,91,94,98,109,139,148,526,530,534,542,549,562,572,1427,1430,1517,1521,1527,1531,1534,1538,1544,1547,1553,1732,2093,2099,2102,2109,2117,2121,2124,2127,2135,2138,2147,2150,2172,2175,2181],[10,11,5],"h1",{"id":12},"aws-eks-specific-details",[14,15,16],"p",{},"This document includes details of installing FlowFuse on AWS EKS.",[14,18,19],{},"The following assumptions have been made in the examples:",[21,22,23,27],"ol",{},[24,25,26],"li",{},"The user has the correct AWS IAM policy access to complete all tasks",[24,28,29,30],{},"All AWS services are running in ",[31,32,33],"code",{},"eu-west-1",[35,36,38],"h2",{"id":37},"prerequisites","Prerequisites",[40,41,43],"h3",{"id":42},"aws-cli","AWS Cli",[14,45,46],{},"This is used to interact with the whole AWS environment",[14,48,49],{},[50,51,52],"a",{"href":52,"rel":53},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fcli\u002Flatest\u002Fuserguide\u002Fgetting-started-install.html",[54],"nofollow",[14,56,57],{},"From here onwards this document assumes that you have configured the\nAWS CLI tools with a user that has permission to carry out the steps.",[14,59,60],{},"This document does not include details of how to configure such a user\nin AWS IAM. Please show this document to you AWS Account Admin if you\nneed help.",[40,62,63],{"id":63},"eksctl",[14,65,66],{},"This tool is used to create\u002Fmodify AWS EKS Clusters, it uses the credentials from the AWS Cli.",[14,68,69],{},[50,70,71],{"href":71,"rel":72},"https:\u002F\u002Fdocs.aws.amazon.com\u002Feks\u002Flatest\u002Fuserguide\u002Feksctl.html",[54],[35,74,76],{"id":75},"setup-a-new-domain-on-route53","Setup a new domain on Route53",[14,78,79],{},"Do this in the AWS Console\u002FYour DNS provider",[35,81,83],{"id":82},"create-an-aws-certificate","Create an AWS Certificate",[14,85,86,87,90],{},"Request a certificate for ",[31,88,89],{},"*.[DOMAIN]"," from Amazon Certificate Manager",[14,92,93],{},"Do this in AWS Console, with Route53 validation",[35,95,97],{"id":96},"create-eks-cluster","Create EKS Cluster",[14,99,100,101,104,105,108],{},"Edit the ",[31,102,103],{},"cluster.yml"," file in ",[31,106,107],{},"aws_eks"," to set your preferred instance type and count along with AWS Region",[110,111,116],"pre",{"className":112,"code":113,"language":114,"meta":115,"style":115},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","eksctl create cluster -f cluster.yml\n","bash","",[31,117,118],{"__ignoreMap":115},[119,120,123,126,130,133,136],"span",{"class":121,"line":122},"line",1,[119,124,63],{"class":125},"sBMFI",[119,127,129],{"class":128},"sfazB"," create",[119,131,132],{"class":128}," cluster",[119,134,135],{"class":128}," -f",[119,137,138],{"class":128}," cluster.yml\n",[14,140,141,142,147],{},"Example cluster.yml (Please visit ",[50,143,146],{"href":144,"rel":145},"https:\u002F\u002Feksctl.io\u002Fusage\u002Fcreating-and-managing-clusters\u002F#using-config-files",[54],"eksctl.io"," to be sure you understand what this does.)",[110,149,153],{"className":150,"code":151,"language":152,"meta":115,"style":115},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: eksctl.io\u002Fv1alpha5\nkind: ClusterConfig\n\nmetadata:\n  name: FlowFuse\n  region: eu-west-1\n\niam:\n  withOIDC: true\n\naddons:\n  - name: aws-ebs-csi-driver\n    resolveConflicts: overwrite\n\nnodeGroups:\n  - name: management\n    labels:\n      role: \"management\"\n    instanceType: t2.small\n    desiredCapacity: 1\n    volumeSize: 20\n    ssh:\n      allow: false\n    iam:\n      withAddonPolicies:\n        ebs: true\n  - name: instance\n    labels: \n      role: \"projects\"\n    tags:\n      k8s.io\u002Fcluster-autoscaler\u002Fenabled: \"true\"\n      k8s.io\u002Fcluster-autoscaler\u002Fflowforge: \"owned\"\n    instanceType: t2.small\n    desiredCapacity: 2\n    volumeSize:\n    ssh:\n      allow: false\n","yaml",[31,154,155,168,179,186,195,206,217,222,230,242,247,255,269,280,285,293,305,313,330,341,353,364,372,383,391,399,409,421,432,446,454,469,484,493,503,510,517],{"__ignoreMap":115},[119,156,157,161,165],{"class":121,"line":122},[119,158,160],{"class":159},"swJcz","apiVersion",[119,162,164],{"class":163},"sMK4o",":",[119,166,167],{"class":128}," eksctl.io\u002Fv1alpha5\n",[119,169,171,174,176],{"class":121,"line":170},2,[119,172,173],{"class":159},"kind",[119,175,164],{"class":163},[119,177,178],{"class":128}," ClusterConfig\n",[119,180,182],{"class":121,"line":181},3,[119,183,185],{"emptyLinePlaceholder":184},true,"\n",[119,187,189,192],{"class":121,"line":188},4,[119,190,191],{"class":159},"metadata",[119,193,194],{"class":163},":\n",[119,196,198,201,203],{"class":121,"line":197},5,[119,199,200],{"class":159},"  name",[119,202,164],{"class":163},[119,204,205],{"class":128}," FlowFuse\n",[119,207,209,212,214],{"class":121,"line":208},6,[119,210,211],{"class":159},"  region",[119,213,164],{"class":163},[119,215,216],{"class":128}," eu-west-1\n",[119,218,220],{"class":121,"line":219},7,[119,221,185],{"emptyLinePlaceholder":184},[119,223,225,228],{"class":121,"line":224},8,[119,226,227],{"class":159},"iam",[119,229,194],{"class":163},[119,231,233,236,238],{"class":121,"line":232},9,[119,234,235],{"class":159},"  withOIDC",[119,237,164],{"class":163},[119,239,241],{"class":240},"sfNiH"," true\n",[119,243,245],{"class":121,"line":244},10,[119,246,185],{"emptyLinePlaceholder":184},[119,248,250,253],{"class":121,"line":249},11,[119,251,252],{"class":159},"addons",[119,254,194],{"class":163},[119,256,258,261,264,266],{"class":121,"line":257},12,[119,259,260],{"class":163},"  -",[119,262,263],{"class":159}," name",[119,265,164],{"class":163},[119,267,268],{"class":128}," aws-ebs-csi-driver\n",[119,270,272,275,277],{"class":121,"line":271},13,[119,273,274],{"class":159},"    resolveConflicts",[119,276,164],{"class":163},[119,278,279],{"class":128}," overwrite\n",[119,281,283],{"class":121,"line":282},14,[119,284,185],{"emptyLinePlaceholder":184},[119,286,288,291],{"class":121,"line":287},15,[119,289,290],{"class":159},"nodeGroups",[119,292,194],{"class":163},[119,294,296,298,300,302],{"class":121,"line":295},16,[119,297,260],{"class":163},[119,299,263],{"class":159},[119,301,164],{"class":163},[119,303,304],{"class":128}," management\n",[119,306,308,311],{"class":121,"line":307},17,[119,309,310],{"class":159},"    labels",[119,312,194],{"class":163},[119,314,316,319,321,324,327],{"class":121,"line":315},18,[119,317,318],{"class":159},"      role",[119,320,164],{"class":163},[119,322,323],{"class":163}," \"",[119,325,326],{"class":128},"management",[119,328,329],{"class":163},"\"\n",[119,331,333,336,338],{"class":121,"line":332},19,[119,334,335],{"class":159},"    instanceType",[119,337,164],{"class":163},[119,339,340],{"class":128}," t2.small\n",[119,342,344,347,349],{"class":121,"line":343},20,[119,345,346],{"class":159},"    desiredCapacity",[119,348,164],{"class":163},[119,350,352],{"class":351},"sbssI"," 1\n",[119,354,356,359,361],{"class":121,"line":355},21,[119,357,358],{"class":159},"    volumeSize",[119,360,164],{"class":163},[119,362,363],{"class":351}," 20\n",[119,365,367,370],{"class":121,"line":366},22,[119,368,369],{"class":159},"    ssh",[119,371,194],{"class":163},[119,373,375,378,380],{"class":121,"line":374},23,[119,376,377],{"class":159},"      allow",[119,379,164],{"class":163},[119,381,382],{"class":240}," false\n",[119,384,386,389],{"class":121,"line":385},24,[119,387,388],{"class":159},"    iam",[119,390,194],{"class":163},[119,392,394,397],{"class":121,"line":393},25,[119,395,396],{"class":159},"      withAddonPolicies",[119,398,194],{"class":163},[119,400,402,405,407],{"class":121,"line":401},26,[119,403,404],{"class":159},"        ebs",[119,406,164],{"class":163},[119,408,241],{"class":240},[119,410,412,414,416,418],{"class":121,"line":411},27,[119,413,260],{"class":163},[119,415,263],{"class":159},[119,417,164],{"class":163},[119,419,420],{"class":128}," instance\n",[119,422,424,426,428],{"class":121,"line":423},28,[119,425,310],{"class":159},[119,427,164],{"class":163},[119,429,431],{"class":430},"sTEyZ"," \n",[119,433,435,437,439,441,444],{"class":121,"line":434},29,[119,436,318],{"class":159},[119,438,164],{"class":163},[119,440,323],{"class":163},[119,442,443],{"class":128},"projects",[119,445,329],{"class":163},[119,447,449,452],{"class":121,"line":448},30,[119,450,451],{"class":159},"    tags",[119,453,194],{"class":163},[119,455,457,460,462,464,467],{"class":121,"line":456},31,[119,458,459],{"class":159},"      k8s.io\u002Fcluster-autoscaler\u002Fenabled",[119,461,164],{"class":163},[119,463,323],{"class":163},[119,465,466],{"class":128},"true",[119,468,329],{"class":163},[119,470,472,475,477,479,482],{"class":121,"line":471},32,[119,473,474],{"class":159},"      k8s.io\u002Fcluster-autoscaler\u002Fflowforge",[119,476,164],{"class":163},[119,478,323],{"class":163},[119,480,481],{"class":128},"owned",[119,483,329],{"class":163},[119,485,487,489,491],{"class":121,"line":486},33,[119,488,335],{"class":159},[119,490,164],{"class":163},[119,492,340],{"class":128},[119,494,496,498,500],{"class":121,"line":495},34,[119,497,346],{"class":159},[119,499,164],{"class":163},[119,501,502],{"class":351}," 2\n",[119,504,506,508],{"class":121,"line":505},35,[119,507,358],{"class":159},[119,509,194],{"class":163},[119,511,513,515],{"class":121,"line":512},36,[119,514,369],{"class":159},[119,516,194],{"class":163},[119,518,520,522,524],{"class":121,"line":519},37,[119,521,377],{"class":159},[119,523,164],{"class":163},[119,525,382],{"class":240},[35,527,529],{"id":528},"ingress-controller","Ingress Controller",[40,531,533],{"id":532},"traefik","Traefik",[14,535,536,537,541],{},"It is recommended to run the ",[50,538,533],{"href":539,"target":540},"https:\u002F\u002Fdoc.traefik.io\u002Ftraefik\u002F","_blank"," even on AWS EKS (The AWS ALB load balancer currently appears to only support up to 100 Ingress Targets which limits the number of Hosted Instances that can be run).",[14,543,544,545,548],{},"Create a ",[31,546,547],{},"traefik-values.yaml"," file to pass the values to the Traefik helm file.",[110,550,552],{"className":112,"code":551,"language":114,"meta":115,"style":115},"touch traefik-values.yaml\n",[31,553,554],{"__ignoreMap":115},[119,555,556,559],{"class":121,"line":122},[119,557,558],{"class":125},"touch",[119,560,561],{"class":128}," traefik-values.yaml\n",[14,563,564,565,567,568,571],{},"Fill the ",[31,566,547],{}," file with the following content. Replace ",[31,569,570],{},"\u003Cyour-certificate-arn>"," with the certificate ARN created earlier",[110,573,575],{"className":150,"code":574,"language":152,"meta":115,"style":115},"service:\n  enabled: true\n  type: LoadBalancer\n  annotations:\n    service.beta.kubernetes.io\u002Faws-load-balancer-type: \"nlb\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-proxy-protocol: \"*\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-ssl-cert: \"\u003Cyour-certificate-arn>\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-ssl-ports: \"443\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-backend-protocol: \"tcp\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-connection-idle-timeout: \"120\"\n    service.beta.kubernetes.io\u002Faws-load-balancer-target-group-attributes: \"proxy_protocol_v2.enabled=true\"\n  spec:\n    externalTrafficPolicy: Cluster\n\ndeployment:\n  replicas: 2\n\nports:\n  web:\n    port: 8000\n    expose:\n      default: true\n    exposedPort: 80\n    protocol: TCP\n    forwardedHeaders:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n    proxyProtocol:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n  websecure:\n    port: 8443\n    expose:\n      default: true\n    exposedPort: 443\n    protocol: TCP\n    http:\n      middlewares:\n        - traefik-force-https@kubernetescrd\n        - traefik-large-body@kubernetescrd\n      # Disable TLS since NLB handles termination\n      tls:\n        enabled: false\n    forwardedHeaders:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n    proxyProtocol:\n      trustedIPs:\n        - \"10.0.0.0\u002F8\"\n\ningressClass:\n  enabled: true\n  isDefaultClass: false\n  name: traefik\n\nadditionalArguments:\n  - \"--entryPoints.web.proxyProtocol.insecure=true\"\n  - \"--entryPoints.websecure.proxyProtocol.insecure=true\"\n  - \"--entryPoints.web.forwardedHeaders.insecure=true\"\n  - \"--entryPoints.websecure.forwardedHeaders.insecure=true\"\n\nproviders:\n  kubernetesIngress:\n    enabled: true\n  kubernetesCRD:\n    enabled: true\n\napi:\n  dashboard: false\n  insecure: false\n\nlogs:\n  access:\n    enabled: true\n    fields:\n      headers:\n        defaultMode: keep\n\nextraObjects:\n  - apiVersion: traefik.io\u002Fv1alpha1\n    kind: Middleware\n    metadata:\n      name: force-https\n      namespace: traefik\n    spec:\n      headers:\n        customRequestHeaders:\n          X-Forwarded-Proto: \"https\"\n  - apiVersion: traefik.io\u002Fv1alpha1\n    kind: Middleware\n    metadata:\n      name: large-body\n      namespace: traefik\n    spec:\n      buffering:\n        maxRequestBodyBytes: 10485760\n",[31,576,577,584,593,603,610,624,638,651,665,679,693,707,714,724,728,735,744,748,755,762,772,779,788,798,808,815,822,834,841,847,857,864,873,879,887,896,904,911,919,927,935,942,950,960,967,974,985,992,999,1010,1015,1023,1032,1042,1052,1057,1065,1077,1089,1101,1113,1118,1126,1134,1144,1152,1161,1166,1174,1184,1194,1199,1207,1215,1224,1232,1240,1251,1256,1264,1277,1288,1296,1307,1317,1325,1332,1340,1355,1366,1375,1382,1392,1401,1408,1416],{"__ignoreMap":115},[119,578,579,582],{"class":121,"line":122},[119,580,581],{"class":159},"service",[119,583,194],{"class":163},[119,585,586,589,591],{"class":121,"line":170},[119,587,588],{"class":159},"  enabled",[119,590,164],{"class":163},[119,592,241],{"class":240},[119,594,595,598,600],{"class":121,"line":181},[119,596,597],{"class":159},"  type",[119,599,164],{"class":163},[119,601,602],{"class":128}," LoadBalancer\n",[119,604,605,608],{"class":121,"line":188},[119,606,607],{"class":159},"  annotations",[119,609,194],{"class":163},[119,611,612,615,617,619,622],{"class":121,"line":197},[119,613,614],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-type",[119,616,164],{"class":163},[119,618,323],{"class":163},[119,620,621],{"class":128},"nlb",[119,623,329],{"class":163},[119,625,626,629,631,633,636],{"class":121,"line":208},[119,627,628],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-proxy-protocol",[119,630,164],{"class":163},[119,632,323],{"class":163},[119,634,635],{"class":128},"*",[119,637,329],{"class":163},[119,639,640,643,645,647,649],{"class":121,"line":219},[119,641,642],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-ssl-cert",[119,644,164],{"class":163},[119,646,323],{"class":163},[119,648,570],{"class":128},[119,650,329],{"class":163},[119,652,653,656,658,660,663],{"class":121,"line":224},[119,654,655],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-ssl-ports",[119,657,164],{"class":163},[119,659,323],{"class":163},[119,661,662],{"class":128},"443",[119,664,329],{"class":163},[119,666,667,670,672,674,677],{"class":121,"line":232},[119,668,669],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-backend-protocol",[119,671,164],{"class":163},[119,673,323],{"class":163},[119,675,676],{"class":128},"tcp",[119,678,329],{"class":163},[119,680,681,684,686,688,691],{"class":121,"line":244},[119,682,683],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-connection-idle-timeout",[119,685,164],{"class":163},[119,687,323],{"class":163},[119,689,690],{"class":128},"120",[119,692,329],{"class":163},[119,694,695,698,700,702,705],{"class":121,"line":249},[119,696,697],{"class":159},"    service.beta.kubernetes.io\u002Faws-load-balancer-target-group-attributes",[119,699,164],{"class":163},[119,701,323],{"class":163},[119,703,704],{"class":128},"proxy_protocol_v2.enabled=true",[119,706,329],{"class":163},[119,708,709,712],{"class":121,"line":257},[119,710,711],{"class":159},"  spec",[119,713,194],{"class":163},[119,715,716,719,721],{"class":121,"line":271},[119,717,718],{"class":159},"    externalTrafficPolicy",[119,720,164],{"class":163},[119,722,723],{"class":128}," Cluster\n",[119,725,726],{"class":121,"line":282},[119,727,185],{"emptyLinePlaceholder":184},[119,729,730,733],{"class":121,"line":287},[119,731,732],{"class":159},"deployment",[119,734,194],{"class":163},[119,736,737,740,742],{"class":121,"line":295},[119,738,739],{"class":159},"  replicas",[119,741,164],{"class":163},[119,743,502],{"class":351},[119,745,746],{"class":121,"line":307},[119,747,185],{"emptyLinePlaceholder":184},[119,749,750,753],{"class":121,"line":315},[119,751,752],{"class":159},"ports",[119,754,194],{"class":163},[119,756,757,760],{"class":121,"line":332},[119,758,759],{"class":159},"  web",[119,761,194],{"class":163},[119,763,764,767,769],{"class":121,"line":343},[119,765,766],{"class":159},"    port",[119,768,164],{"class":163},[119,770,771],{"class":351}," 8000\n",[119,773,774,777],{"class":121,"line":355},[119,775,776],{"class":159},"    expose",[119,778,194],{"class":163},[119,780,781,784,786],{"class":121,"line":366},[119,782,783],{"class":159},"      default",[119,785,164],{"class":163},[119,787,241],{"class":240},[119,789,790,793,795],{"class":121,"line":374},[119,791,792],{"class":159},"    exposedPort",[119,794,164],{"class":163},[119,796,797],{"class":351}," 80\n",[119,799,800,803,805],{"class":121,"line":385},[119,801,802],{"class":159},"    protocol",[119,804,164],{"class":163},[119,806,807],{"class":128}," TCP\n",[119,809,810,813],{"class":121,"line":393},[119,811,812],{"class":159},"    forwardedHeaders",[119,814,194],{"class":163},[119,816,817,820],{"class":121,"line":401},[119,818,819],{"class":159},"      trustedIPs",[119,821,194],{"class":163},[119,823,824,827,829,832],{"class":121,"line":411},[119,825,826],{"class":163},"        -",[119,828,323],{"class":163},[119,830,831],{"class":128},"10.0.0.0\u002F8",[119,833,329],{"class":163},[119,835,836,839],{"class":121,"line":423},[119,837,838],{"class":159},"    proxyProtocol",[119,840,194],{"class":163},[119,842,843,845],{"class":121,"line":434},[119,844,819],{"class":159},[119,846,194],{"class":163},[119,848,849,851,853,855],{"class":121,"line":448},[119,850,826],{"class":163},[119,852,323],{"class":163},[119,854,831],{"class":128},[119,856,329],{"class":163},[119,858,859,862],{"class":121,"line":456},[119,860,861],{"class":159},"  websecure",[119,863,194],{"class":163},[119,865,866,868,870],{"class":121,"line":471},[119,867,766],{"class":159},[119,869,164],{"class":163},[119,871,872],{"class":351}," 8443\n",[119,874,875,877],{"class":121,"line":486},[119,876,776],{"class":159},[119,878,194],{"class":163},[119,880,881,883,885],{"class":121,"line":495},[119,882,783],{"class":159},[119,884,164],{"class":163},[119,886,241],{"class":240},[119,888,889,891,893],{"class":121,"line":505},[119,890,792],{"class":159},[119,892,164],{"class":163},[119,894,895],{"class":351}," 443\n",[119,897,898,900,902],{"class":121,"line":512},[119,899,802],{"class":159},[119,901,164],{"class":163},[119,903,807],{"class":128},[119,905,906,909],{"class":121,"line":519},[119,907,908],{"class":159},"    http",[119,910,194],{"class":163},[119,912,914,917],{"class":121,"line":913},38,[119,915,916],{"class":159},"      middlewares",[119,918,194],{"class":163},[119,920,922,924],{"class":121,"line":921},39,[119,923,826],{"class":163},[119,925,926],{"class":128}," traefik-force-https@kubernetescrd\n",[119,928,930,932],{"class":121,"line":929},40,[119,931,826],{"class":163},[119,933,934],{"class":128}," traefik-large-body@kubernetescrd\n",[119,936,938],{"class":121,"line":937},41,[119,939,941],{"class":940},"sHwdD","      # Disable TLS since NLB handles termination\n",[119,943,945,948],{"class":121,"line":944},42,[119,946,947],{"class":159},"      tls",[119,949,194],{"class":163},[119,951,953,956,958],{"class":121,"line":952},43,[119,954,955],{"class":159},"        enabled",[119,957,164],{"class":163},[119,959,382],{"class":240},[119,961,963,965],{"class":121,"line":962},44,[119,964,812],{"class":159},[119,966,194],{"class":163},[119,968,970,972],{"class":121,"line":969},45,[119,971,819],{"class":159},[119,973,194],{"class":163},[119,975,977,979,981,983],{"class":121,"line":976},46,[119,978,826],{"class":163},[119,980,323],{"class":163},[119,982,831],{"class":128},[119,984,329],{"class":163},[119,986,988,990],{"class":121,"line":987},47,[119,989,838],{"class":159},[119,991,194],{"class":163},[119,993,995,997],{"class":121,"line":994},48,[119,996,819],{"class":159},[119,998,194],{"class":163},[119,1000,1002,1004,1006,1008],{"class":121,"line":1001},49,[119,1003,826],{"class":163},[119,1005,323],{"class":163},[119,1007,831],{"class":128},[119,1009,329],{"class":163},[119,1011,1013],{"class":121,"line":1012},50,[119,1014,185],{"emptyLinePlaceholder":184},[119,1016,1018,1021],{"class":121,"line":1017},51,[119,1019,1020],{"class":159},"ingressClass",[119,1022,194],{"class":163},[119,1024,1026,1028,1030],{"class":121,"line":1025},52,[119,1027,588],{"class":159},[119,1029,164],{"class":163},[119,1031,241],{"class":240},[119,1033,1035,1038,1040],{"class":121,"line":1034},53,[119,1036,1037],{"class":159},"  isDefaultClass",[119,1039,164],{"class":163},[119,1041,382],{"class":240},[119,1043,1045,1047,1049],{"class":121,"line":1044},54,[119,1046,200],{"class":159},[119,1048,164],{"class":163},[119,1050,1051],{"class":128}," traefik\n",[119,1053,1055],{"class":121,"line":1054},55,[119,1056,185],{"emptyLinePlaceholder":184},[119,1058,1060,1063],{"class":121,"line":1059},56,[119,1061,1062],{"class":159},"additionalArguments",[119,1064,194],{"class":163},[119,1066,1068,1070,1072,1075],{"class":121,"line":1067},57,[119,1069,260],{"class":163},[119,1071,323],{"class":163},[119,1073,1074],{"class":128},"--entryPoints.web.proxyProtocol.insecure=true",[119,1076,329],{"class":163},[119,1078,1080,1082,1084,1087],{"class":121,"line":1079},58,[119,1081,260],{"class":163},[119,1083,323],{"class":163},[119,1085,1086],{"class":128},"--entryPoints.websecure.proxyProtocol.insecure=true",[119,1088,329],{"class":163},[119,1090,1092,1094,1096,1099],{"class":121,"line":1091},59,[119,1093,260],{"class":163},[119,1095,323],{"class":163},[119,1097,1098],{"class":128},"--entryPoints.web.forwardedHeaders.insecure=true",[119,1100,329],{"class":163},[119,1102,1104,1106,1108,1111],{"class":121,"line":1103},60,[119,1105,260],{"class":163},[119,1107,323],{"class":163},[119,1109,1110],{"class":128},"--entryPoints.websecure.forwardedHeaders.insecure=true",[119,1112,329],{"class":163},[119,1114,1116],{"class":121,"line":1115},61,[119,1117,185],{"emptyLinePlaceholder":184},[119,1119,1121,1124],{"class":121,"line":1120},62,[119,1122,1123],{"class":159},"providers",[119,1125,194],{"class":163},[119,1127,1129,1132],{"class":121,"line":1128},63,[119,1130,1131],{"class":159},"  kubernetesIngress",[119,1133,194],{"class":163},[119,1135,1137,1140,1142],{"class":121,"line":1136},64,[119,1138,1139],{"class":159},"    enabled",[119,1141,164],{"class":163},[119,1143,241],{"class":240},[119,1145,1147,1150],{"class":121,"line":1146},65,[119,1148,1149],{"class":159},"  kubernetesCRD",[119,1151,194],{"class":163},[119,1153,1155,1157,1159],{"class":121,"line":1154},66,[119,1156,1139],{"class":159},[119,1158,164],{"class":163},[119,1160,241],{"class":240},[119,1162,1164],{"class":121,"line":1163},67,[119,1165,185],{"emptyLinePlaceholder":184},[119,1167,1169,1172],{"class":121,"line":1168},68,[119,1170,1171],{"class":159},"api",[119,1173,194],{"class":163},[119,1175,1177,1180,1182],{"class":121,"line":1176},69,[119,1178,1179],{"class":159},"  dashboard",[119,1181,164],{"class":163},[119,1183,382],{"class":240},[119,1185,1187,1190,1192],{"class":121,"line":1186},70,[119,1188,1189],{"class":159},"  insecure",[119,1191,164],{"class":163},[119,1193,382],{"class":240},[119,1195,1197],{"class":121,"line":1196},71,[119,1198,185],{"emptyLinePlaceholder":184},[119,1200,1202,1205],{"class":121,"line":1201},72,[119,1203,1204],{"class":159},"logs",[119,1206,194],{"class":163},[119,1208,1210,1213],{"class":121,"line":1209},73,[119,1211,1212],{"class":159},"  access",[119,1214,194],{"class":163},[119,1216,1218,1220,1222],{"class":121,"line":1217},74,[119,1219,1139],{"class":159},[119,1221,164],{"class":163},[119,1223,241],{"class":240},[119,1225,1227,1230],{"class":121,"line":1226},75,[119,1228,1229],{"class":159},"    fields",[119,1231,194],{"class":163},[119,1233,1235,1238],{"class":121,"line":1234},76,[119,1236,1237],{"class":159},"      headers",[119,1239,194],{"class":163},[119,1241,1243,1246,1248],{"class":121,"line":1242},77,[119,1244,1245],{"class":159},"        defaultMode",[119,1247,164],{"class":163},[119,1249,1250],{"class":128}," keep\n",[119,1252,1254],{"class":121,"line":1253},78,[119,1255,185],{"emptyLinePlaceholder":184},[119,1257,1259,1262],{"class":121,"line":1258},79,[119,1260,1261],{"class":159},"extraObjects",[119,1263,194],{"class":163},[119,1265,1267,1269,1272,1274],{"class":121,"line":1266},80,[119,1268,260],{"class":163},[119,1270,1271],{"class":159}," apiVersion",[119,1273,164],{"class":163},[119,1275,1276],{"class":128}," traefik.io\u002Fv1alpha1\n",[119,1278,1280,1283,1285],{"class":121,"line":1279},81,[119,1281,1282],{"class":159},"    kind",[119,1284,164],{"class":163},[119,1286,1287],{"class":128}," Middleware\n",[119,1289,1291,1294],{"class":121,"line":1290},82,[119,1292,1293],{"class":159},"    metadata",[119,1295,194],{"class":163},[119,1297,1299,1302,1304],{"class":121,"line":1298},83,[119,1300,1301],{"class":159},"      name",[119,1303,164],{"class":163},[119,1305,1306],{"class":128}," force-https\n",[119,1308,1310,1313,1315],{"class":121,"line":1309},84,[119,1311,1312],{"class":159},"      namespace",[119,1314,164],{"class":163},[119,1316,1051],{"class":128},[119,1318,1320,1323],{"class":121,"line":1319},85,[119,1321,1322],{"class":159},"    spec",[119,1324,194],{"class":163},[119,1326,1328,1330],{"class":121,"line":1327},86,[119,1329,1237],{"class":159},[119,1331,194],{"class":163},[119,1333,1335,1338],{"class":121,"line":1334},87,[119,1336,1337],{"class":159},"        customRequestHeaders",[119,1339,194],{"class":163},[119,1341,1343,1346,1348,1350,1353],{"class":121,"line":1342},88,[119,1344,1345],{"class":159},"          X-Forwarded-Proto",[119,1347,164],{"class":163},[119,1349,323],{"class":163},[119,1351,1352],{"class":128},"https",[119,1354,329],{"class":163},[119,1356,1358,1360,1362,1364],{"class":121,"line":1357},89,[119,1359,260],{"class":163},[119,1361,1271],{"class":159},[119,1363,164],{"class":163},[119,1365,1276],{"class":128},[119,1367,1369,1371,1373],{"class":121,"line":1368},90,[119,1370,1282],{"class":159},[119,1372,164],{"class":163},[119,1374,1287],{"class":128},[119,1376,1378,1380],{"class":121,"line":1377},91,[119,1379,1293],{"class":159},[119,1381,194],{"class":163},[119,1383,1385,1387,1389],{"class":121,"line":1384},92,[119,1386,1301],{"class":159},[119,1388,164],{"class":163},[119,1390,1391],{"class":128}," large-body\n",[119,1393,1395,1397,1399],{"class":121,"line":1394},93,[119,1396,1312],{"class":159},[119,1398,164],{"class":163},[119,1400,1051],{"class":128},[119,1402,1404,1406],{"class":121,"line":1403},94,[119,1405,1322],{"class":159},[119,1407,194],{"class":163},[119,1409,1411,1414],{"class":121,"line":1410},95,[119,1412,1413],{"class":159},"      buffering",[119,1415,194],{"class":163},[119,1417,1419,1422,1424],{"class":121,"line":1418},96,[119,1420,1421],{"class":159},"        maxRequestBodyBytes",[119,1423,164],{"class":163},[119,1425,1426],{"class":351}," 10485760\n",[14,1428,1429],{},"Install the Traefik with the following command:",[110,1431,1433],{"className":112,"code":1432,"language":114,"meta":115,"style":115},"helm repo add traefik https:\u002F\u002Ftraefik.github.io\u002Fcharts\nhelm repo update\nhelm upgrade --install traefik traefik\u002Ftraefik \\\n  --create-namespace \\\n  -n traefik \\\n  -f traefik-values.yaml \\\n  --wait \\\n  --atomic\n",[31,1434,1435,1452,1461,1479,1486,1495,1505,1512],{"__ignoreMap":115},[119,1436,1437,1440,1443,1446,1449],{"class":121,"line":122},[119,1438,1439],{"class":125},"helm",[119,1441,1442],{"class":128}," repo",[119,1444,1445],{"class":128}," add",[119,1447,1448],{"class":128}," traefik",[119,1450,1451],{"class":128}," https:\u002F\u002Ftraefik.github.io\u002Fcharts\n",[119,1453,1454,1456,1458],{"class":121,"line":170},[119,1455,1439],{"class":125},[119,1457,1442],{"class":128},[119,1459,1460],{"class":128}," update\n",[119,1462,1463,1465,1468,1471,1473,1476],{"class":121,"line":181},[119,1464,1439],{"class":125},[119,1466,1467],{"class":128}," upgrade",[119,1469,1470],{"class":128}," --install",[119,1472,1448],{"class":128},[119,1474,1475],{"class":128}," traefik\u002Ftraefik",[119,1477,1478],{"class":430}," \\\n",[119,1480,1481,1484],{"class":121,"line":188},[119,1482,1483],{"class":128},"  --create-namespace",[119,1485,1478],{"class":430},[119,1487,1488,1491,1493],{"class":121,"line":197},[119,1489,1490],{"class":128},"  -n",[119,1492,1448],{"class":128},[119,1494,1478],{"class":430},[119,1496,1497,1500,1503],{"class":121,"line":208},[119,1498,1499],{"class":128},"  -f",[119,1501,1502],{"class":128}," traefik-values.yaml",[119,1504,1478],{"class":430},[119,1506,1507,1510],{"class":121,"line":219},[119,1508,1509],{"class":128},"  --wait",[119,1511,1478],{"class":430},[119,1513,1514],{"class":121,"line":224},[119,1515,1516],{"class":128},"  --atomic\n",[40,1518,1520],{"id":1519},"references","References",[14,1522,1523],{},[50,1524,1525],{"href":1525,"rel":1526},"https:\u002F\u002Fdoc.traefik.io\u002Ftraefik\u002Fgetting-started\u002Fkubernetes\u002F",[54],[35,1528,1530],{"id":1529},"aws-alb-ingress","AWS ALB Ingress",[14,1532,1533],{},"AWS ALB has a hard limit of 100 Ingress endpoints which limits the number of Projects\u002FInstances that can be deployed.",[35,1535,1537],{"id":1536},"setup-aws-ses-for-email","Setup AWS SES for email",[14,1539,1540],{},[50,1541,1542],{"href":1542,"rel":1543},"https:\u002F\u002Feu-west-1.console.aws.amazon.com\u002Fses\u002Fhome?region=eu-west-1#\u002Fhomepage",[54],[14,1545,1546],{},"Setup identity to match sending domain (requires DNS entries)\nSetup email identity to send test emails to\nRequest move to production from sandbox (need to include examples of emails being sent and why\u002Fwhen those emails will be sent should only need this for prod)",[14,1548,1549,1552],{},[31,1550,1551],{},"ses_policy.json"," (with suitable aws id, aws region and domain modifications):",[110,1554,1558],{"className":1555,"code":1556,"language":1557,"meta":115,"style":115},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"VisualEditor0\",\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"ses:SendEmail\",\n                \"ses:SendTemplatedEmail\",\n                \"ses:SendRawEmail\"\n            ],\n            \"Resource\": \"arn:aws:ses:[aws region]:[aws id]:identity\u002F[domain name]\"\n        }\n    ]\n}\n","json",[31,1559,1560,1565,1589,1603,1608,1629,1649,1662,1674,1685,1694,1699,1717,1722,1727],{"__ignoreMap":115},[119,1561,1562],{"class":121,"line":122},[119,1563,1564],{"class":163},"{\n",[119,1566,1567,1570,1574,1577,1579,1581,1584,1586],{"class":121,"line":170},[119,1568,1569],{"class":163},"    \"",[119,1571,1573],{"class":1572},"spNyl","Version",[119,1575,1576],{"class":163},"\"",[119,1578,164],{"class":163},[119,1580,323],{"class":163},[119,1582,1583],{"class":128},"2012-10-17",[119,1585,1576],{"class":163},[119,1587,1588],{"class":163},",\n",[119,1590,1591,1593,1596,1598,1600],{"class":121,"line":181},[119,1592,1569],{"class":163},[119,1594,1595],{"class":1572},"Statement",[119,1597,1576],{"class":163},[119,1599,164],{"class":163},[119,1601,1602],{"class":163}," [\n",[119,1604,1605],{"class":121,"line":188},[119,1606,1607],{"class":163},"        {\n",[119,1609,1610,1613,1616,1618,1620,1622,1625,1627],{"class":121,"line":197},[119,1611,1612],{"class":163},"            \"",[119,1614,1615],{"class":125},"Sid",[119,1617,1576],{"class":163},[119,1619,164],{"class":163},[119,1621,323],{"class":163},[119,1623,1624],{"class":128},"VisualEditor0",[119,1626,1576],{"class":163},[119,1628,1588],{"class":163},[119,1630,1631,1633,1636,1638,1640,1642,1645,1647],{"class":121,"line":208},[119,1632,1612],{"class":163},[119,1634,1635],{"class":125},"Effect",[119,1637,1576],{"class":163},[119,1639,164],{"class":163},[119,1641,323],{"class":163},[119,1643,1644],{"class":128},"Allow",[119,1646,1576],{"class":163},[119,1648,1588],{"class":163},[119,1650,1651,1653,1656,1658,1660],{"class":121,"line":219},[119,1652,1612],{"class":163},[119,1654,1655],{"class":125},"Action",[119,1657,1576],{"class":163},[119,1659,164],{"class":163},[119,1661,1602],{"class":163},[119,1663,1664,1667,1670,1672],{"class":121,"line":224},[119,1665,1666],{"class":163},"                \"",[119,1668,1669],{"class":128},"ses:SendEmail",[119,1671,1576],{"class":163},[119,1673,1588],{"class":163},[119,1675,1676,1678,1681,1683],{"class":121,"line":232},[119,1677,1666],{"class":163},[119,1679,1680],{"class":128},"ses:SendTemplatedEmail",[119,1682,1576],{"class":163},[119,1684,1588],{"class":163},[119,1686,1687,1689,1692],{"class":121,"line":244},[119,1688,1666],{"class":163},[119,1690,1691],{"class":128},"ses:SendRawEmail",[119,1693,329],{"class":163},[119,1695,1696],{"class":121,"line":249},[119,1697,1698],{"class":163},"            ],\n",[119,1700,1701,1703,1706,1708,1710,1712,1715],{"class":121,"line":257},[119,1702,1612],{"class":163},[119,1704,1705],{"class":125},"Resource",[119,1707,1576],{"class":163},[119,1709,164],{"class":163},[119,1711,323],{"class":163},[119,1713,1714],{"class":128},"arn:aws:ses:[aws region]:[aws id]:identity\u002F[domain name]",[119,1716,329],{"class":163},[119,1718,1719],{"class":121,"line":271},[119,1720,1721],{"class":163},"        }\n",[119,1723,1724],{"class":121,"line":282},[119,1725,1726],{"class":163},"    ]\n",[119,1728,1729],{"class":121,"line":287},[119,1730,1731],{"class":163},"}\n",[110,1733,1735],{"className":112,"code":1734,"language":114,"meta":115,"style":115},"IAM_POLICY_ARN=$(aws iam create-policy --policy-name FlowForgeSendEmail --policy-document file:\u002F\u002Fses_policy.json --output json | jq -r .Policy.Arn)\nACCOUNT_ID=$(aws sts get-caller-identity --query \"Account\" --output text)\nOIDC_PROVIDER=$(aws eks describe-cluster --name flowforge --query \"cluster.identity.oidc.issuer\" --output text | sed -e \"s\u002F^https:\\\u002F\\\u002F\u002F\u002F\")\n\n\nread -r -d '' TRUST_RELATIONSHIP \u003C\u003CEOF\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::${ACCOUNT_ID}:oidc-provider\u002F${OIDC_PROVIDER}\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"${OIDC_PROVIDER}:sub\": \"system:serviceaccount:default:flowforge\"\n        }\n      }\n    }\n  ]\n}\nEOF\necho \"${TRUST_RELATIONSHIP}\" > trust.json\n\naws iam create-role --role-name flowforge_service_account_role --assume-role-policy-document file:\u002F\u002Ftrust.json --description \"Role to bind to flowforge service account\"\n\naws iam attach-role-policy --role-name flowforge_service_account_role --policy-arn=$IAM_POLICY_ARN\n",[31,1736,1737,1787,1819,1870,1874,1878,1901,1905,1910,1915,1920,1925,1930,1954,1959,1964,1969,1974,1988,1992,1997,2002,2007,2011,2015,2035,2039,2070,2074],{"__ignoreMap":115},[119,1738,1739,1742,1745,1748,1751,1754,1757,1760,1763,1766,1769,1772,1775,1778,1781,1784],{"class":121,"line":122},[119,1740,1741],{"class":430},"IAM_POLICY_ARN",[119,1743,1744],{"class":163},"=$(",[119,1746,1747],{"class":125},"aws",[119,1749,1750],{"class":128}," iam",[119,1752,1753],{"class":128}," create-policy",[119,1755,1756],{"class":128}," --policy-name",[119,1758,1759],{"class":128}," FlowForgeSendEmail",[119,1761,1762],{"class":128}," --policy-document",[119,1764,1765],{"class":128}," file:\u002F\u002Fses_policy.json",[119,1767,1768],{"class":128}," --output",[119,1770,1771],{"class":128}," json",[119,1773,1774],{"class":163}," |",[119,1776,1777],{"class":125}," jq",[119,1779,1780],{"class":128}," -r",[119,1782,1783],{"class":128}," .Policy.Arn",[119,1785,1786],{"class":163},")\n",[119,1788,1789,1792,1794,1796,1799,1802,1805,1807,1810,1812,1814,1817],{"class":121,"line":170},[119,1790,1791],{"class":430},"ACCOUNT_ID",[119,1793,1744],{"class":163},[119,1795,1747],{"class":125},[119,1797,1798],{"class":128}," sts",[119,1800,1801],{"class":128}," get-caller-identity",[119,1803,1804],{"class":128}," --query",[119,1806,323],{"class":163},[119,1808,1809],{"class":128},"Account",[119,1811,1576],{"class":163},[119,1813,1768],{"class":128},[119,1815,1816],{"class":128}," text",[119,1818,1786],{"class":163},[119,1820,1821,1824,1826,1828,1831,1834,1837,1840,1842,1844,1847,1849,1851,1853,1855,1858,1861,1863,1866,1868],{"class":121,"line":181},[119,1822,1823],{"class":430},"OIDC_PROVIDER",[119,1825,1744],{"class":163},[119,1827,1747],{"class":125},[119,1829,1830],{"class":128}," eks",[119,1832,1833],{"class":128}," describe-cluster",[119,1835,1836],{"class":128}," --name",[119,1838,1839],{"class":128}," flowforge",[119,1841,1804],{"class":128},[119,1843,323],{"class":163},[119,1845,1846],{"class":128},"cluster.identity.oidc.issuer",[119,1848,1576],{"class":163},[119,1850,1768],{"class":128},[119,1852,1816],{"class":128},[119,1854,1774],{"class":163},[119,1856,1857],{"class":125}," sed",[119,1859,1860],{"class":128}," -e",[119,1862,323],{"class":163},[119,1864,1865],{"class":128},"s\u002F^https:\\\u002F\\\u002F\u002F\u002F",[119,1867,1576],{"class":163},[119,1869,1786],{"class":163},[119,1871,1872],{"class":121,"line":188},[119,1873,185],{"emptyLinePlaceholder":184},[119,1875,1876],{"class":121,"line":197},[119,1877,185],{"emptyLinePlaceholder":184},[119,1879,1880,1884,1886,1889,1892,1895,1898],{"class":121,"line":208},[119,1881,1883],{"class":1882},"s2Zo4","read",[119,1885,1780],{"class":128},[119,1887,1888],{"class":128}," -d",[119,1890,1891],{"class":163}," ''",[119,1893,1894],{"class":128}," TRUST_RELATIONSHIP",[119,1896,1897],{"class":163}," \u003C\u003C",[119,1899,1900],{"class":163},"EOF\n",[119,1902,1903],{"class":121,"line":219},[119,1904,1564],{"class":128},[119,1906,1907],{"class":121,"line":224},[119,1908,1909],{"class":128},"  \"Version\": \"2012-10-17\",\n",[119,1911,1912],{"class":121,"line":232},[119,1913,1914],{"class":128},"  \"Statement\": [\n",[119,1916,1917],{"class":121,"line":244},[119,1918,1919],{"class":128},"    {\n",[119,1921,1922],{"class":121,"line":249},[119,1923,1924],{"class":128},"      \"Effect\": \"Allow\",\n",[119,1926,1927],{"class":121,"line":257},[119,1928,1929],{"class":128},"      \"Principal\": {\n",[119,1931,1932,1935,1938,1940,1943,1946,1948,1950,1952],{"class":121,"line":271},[119,1933,1934],{"class":128},"        \"Federated\": \"arn:aws:iam::",[119,1936,1937],{"class":163},"${",[119,1939,1791],{"class":430},[119,1941,1942],{"class":163},"}",[119,1944,1945],{"class":128},":oidc-provider\u002F",[119,1947,1937],{"class":163},[119,1949,1823],{"class":430},[119,1951,1942],{"class":163},[119,1953,329],{"class":128},[119,1955,1956],{"class":121,"line":282},[119,1957,1958],{"class":128},"      },\n",[119,1960,1961],{"class":121,"line":287},[119,1962,1963],{"class":128},"      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n",[119,1965,1966],{"class":121,"line":295},[119,1967,1968],{"class":128},"      \"Condition\": {\n",[119,1970,1971],{"class":121,"line":307},[119,1972,1973],{"class":128},"        \"StringEquals\": {\n",[119,1975,1976,1979,1981,1983,1985],{"class":121,"line":315},[119,1977,1978],{"class":128},"          \"",[119,1980,1937],{"class":163},[119,1982,1823],{"class":430},[119,1984,1942],{"class":163},[119,1986,1987],{"class":128},":sub\": \"system:serviceaccount:default:flowforge\"\n",[119,1989,1990],{"class":121,"line":332},[119,1991,1721],{"class":128},[119,1993,1994],{"class":121,"line":343},[119,1995,1996],{"class":128},"      }\n",[119,1998,1999],{"class":121,"line":355},[119,2000,2001],{"class":128},"    }\n",[119,2003,2004],{"class":121,"line":366},[119,2005,2006],{"class":128},"  ]\n",[119,2008,2009],{"class":121,"line":374},[119,2010,1731],{"class":128},[119,2012,2013],{"class":121,"line":385},[119,2014,1900],{"class":163},[119,2016,2017,2020,2023,2026,2029,2032],{"class":121,"line":393},[119,2018,2019],{"class":1882},"echo",[119,2021,2022],{"class":163}," \"${",[119,2024,2025],{"class":430},"TRUST_RELATIONSHIP",[119,2027,2028],{"class":163},"}\"",[119,2030,2031],{"class":163}," >",[119,2033,2034],{"class":128}," trust.json\n",[119,2036,2037],{"class":121,"line":401},[119,2038,185],{"emptyLinePlaceholder":184},[119,2040,2041,2043,2045,2048,2051,2054,2057,2060,2063,2065,2068],{"class":121,"line":411},[119,2042,1747],{"class":125},[119,2044,1750],{"class":128},[119,2046,2047],{"class":128}," create-role",[119,2049,2050],{"class":128}," --role-name",[119,2052,2053],{"class":128}," flowforge_service_account_role",[119,2055,2056],{"class":128}," --assume-role-policy-document",[119,2058,2059],{"class":128}," file:\u002F\u002Ftrust.json",[119,2061,2062],{"class":128}," --description",[119,2064,323],{"class":163},[119,2066,2067],{"class":128},"Role to bind to flowforge service account",[119,2069,329],{"class":163},[119,2071,2072],{"class":121,"line":423},[119,2073,185],{"emptyLinePlaceholder":184},[119,2075,2076,2078,2080,2083,2085,2087,2090],{"class":121,"line":434},[119,2077,1747],{"class":125},[119,2079,1750],{"class":128},[119,2081,2082],{"class":128}," attach-role-policy",[119,2084,2050],{"class":128},[119,2086,2053],{"class":128},[119,2088,2089],{"class":128}," --policy-arn=",[119,2091,2092],{"class":430},"$IAM_POLICY_ARN\n",[14,2094,2095,2096],{},"Make a note of the  ARN for the IAM Role (flowforge_service_account_role) is needed in the helm chart values yaml file.\n",[31,2097,2098],{},"aws iam get-role --role-name flowforge_service_account_role",[40,2100,1520],{"id":2101},"references-1",[14,2103,2104,2105],{},"Create a IAM Role to bind IAM Policies to the service account ",[50,2106,2107],{"href":2107,"rel":2108},"https:\u002F\u002Fdocs.aws.amazon.com\u002Feks\u002Flatest\u002Fuserguide\u002Fiam-roles-for-service-accounts.html",[54],[14,2110,2111,2112,2116],{},"Create IAM Policy to allow sending emails (example: ",[50,2113,2114],{"href":2114,"rel":2115},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fses\u002Flatest\u002Fdg\u002Fsending-authorization-policy-examples.html",[54],")",[35,2118,2120],{"id":2119},"use-aws-rds-postgresql-instance","Use AWS RDS PostgreSQL instance",[14,2122,2123],{},"The following script creates a AWS RDS PostgreSQL instance, it also\nsets up some network access rules so only the FlowFuse app can access\nit from inside the cluster (and not the Node-RED instances).",[14,2125,2126],{},"Please read it carefully before running it to ensure you understand it.",[14,2128,2129,2130],{},"A copy of this file can be found ",[50,2131,2134],{"href":2132,"rel":2133},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowforge\u002Fblob\u002Ff8c06e3cea0ffb539350797af429f1a0366243f1\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fsetup-rds.sh",[54],"here",[14,2136,2137],{},"Run the following command",[110,2139,2141],{"className":112,"code":2140,"language":114,"meta":115,"style":115},".\u002Fsetup-rds.sh\n",[31,2142,2143],{"__ignoreMap":115},[119,2144,2145],{"class":121,"line":122},[119,2146,2140],{"class":125},[14,2148,2149],{},"Make a note of the postgres hostname",[110,2151,2153],{"className":112,"code":2152,"language":114,"meta":115,"style":115},"aws rds describe-db-instances | jq .DBInstances[].Endpoint.Address\n",[31,2154,2155],{"__ignoreMap":115},[119,2156,2157,2159,2162,2165,2167,2169],{"class":121,"line":122},[119,2158,1747],{"class":125},[119,2160,2161],{"class":128}," rds",[119,2163,2164],{"class":128}," describe-db-instances",[119,2166,1774],{"class":163},[119,2168,1777],{"class":125},[119,2170,2171],{"class":128}," .DBInstances[].Endpoint.Address\n",[40,2173,1520],{"id":2174},"references-2",[14,2176,2177],{},[50,2178,2179],{"href":2179,"rel":2180},"https:\u002F\u002Fdev.to\u002Fbensooraj\u002Faccessing-amazon-rds-from-aws-eks-2pc3",[54],[2182,2183,2184],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":115,"searchDepth":188,"depth":188,"links":2186},[2187,2191,2192,2193,2194,2198,2199,2202],{"id":37,"depth":170,"text":38,"children":2188},[2189,2190],{"id":42,"depth":181,"text":43},{"id":63,"depth":181,"text":63},{"id":75,"depth":170,"text":76},{"id":82,"depth":170,"text":83},{"id":96,"depth":170,"text":97},{"id":528,"depth":170,"text":529,"children":2195},[2196,2197],{"id":532,"depth":181,"text":533},{"id":1519,"depth":181,"text":1520},{"id":1529,"depth":170,"text":1530},{"id":1536,"depth":170,"text":1537,"children":2200},[2201],{"id":2101,"depth":181,"text":1520},{"id":2119,"depth":170,"text":2120,"children":2203},[2204],{"id":2174,"depth":181,"text":1520},"md",null,{},"AWS EKS Installation","install\u002Fkubernetes\u002Faws.md","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",{"title":5,"description":16},"docs\u002Finstall\u002Fkubernetes\u002Faws","2026-03-11 16:10:42 +0100","2.33.2","DcOiMl_XDw0xEi-vbw94AmRyEVEHIFneoZKgyGw3_Ns",[2217,2224,2243,2254],{"name":2218,"order":122,"children":2219},"FlowFuse User Manuals",[2220],{"title":2221,"path":2222,"group":2218,"groupOrder":122,"order":170,"children":2223},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":2225,"order":188,"children":2226},"FlowFuse Self-Hosted",[2227,2231],{"title":2228,"path":2229,"group":2225,"groupOrder":188,"order":122,"children":2230},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":2232,"path":2233,"group":2225,"groupOrder":188,"order":181,"children":2234},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[2235,2239],{"title":2236,"path":2237,"order":2206,"children":2238},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":2240,"path":2241,"order":2206,"children":2242},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":2244,"order":197,"children":2245},"Support",[2246,2250],{"title":2247,"path":2248,"group":2244,"groupOrder":197,"order":181,"children":2249},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":2251,"path":2252,"group":2244,"groupOrder":197,"order":2206,"children":2253},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":2255,"order":2206,"children":2256},"Other",[2257,2305,2317,2396,2444,2463,2535,2546],{"title":2258,"path":2259,"order":2206,"children":2260},"admin","\u002Fdocs\u002Fadmin",[2261,2265,2277,2285,2289,2293,2297,2301],{"title":2262,"path":2263,"order":122,"children":2264},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":2266,"path":2267,"order":2206,"children":2268},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[2269,2273],{"title":2270,"path":2271,"order":2206,"children":2272},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":2274,"path":2275,"order":2206,"children":2276},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":2278,"path":2279,"order":2206,"children":2280},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[2281],{"title":2282,"path":2283,"order":2206,"children":2284},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":2286,"path":2287,"order":2206,"children":2288},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":2290,"path":2291,"order":2206,"children":2292},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":2294,"path":2295,"order":2206,"children":2296},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":2298,"path":2299,"order":2206,"children":2300},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":2302,"path":2303,"order":2206,"children":2304},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":2306,"path":2307,"order":2206,"children":2308},"cloud","\u002Fdocs\u002Fcloud",[2309,2313],{"title":2310,"path":2311,"order":122,"children":2312},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":2314,"path":2315,"order":2206,"children":2316},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":2318,"path":2319,"order":2206,"children":2320},"contribute","\u002Fdocs\u002Fcontribute",[2321,2324,2328,2332,2336,2340,2344,2352,2388,2392],{"title":2310,"path":2322,"order":122,"children":2323},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":2325,"path":2326,"order":2206,"children":2327},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":2329,"path":2330,"order":2206,"children":2331},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":2333,"path":2334,"order":2206,"children":2335},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":2337,"path":2338,"order":2206,"children":2339},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":2341,"path":2342,"order":2206,"children":2343},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":2345,"path":2346,"order":2206,"children":2347},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[2348],{"title":2349,"path":2350,"order":2206,"children":2351},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":2353,"path":2354,"order":2206,"children":2355},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[2356,2360,2364,2368,2372,2376,2380,2384],{"title":2357,"path":2358,"order":2206,"children":2359},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":2361,"path":2362,"order":2206,"children":2363},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":2365,"path":2366,"order":2206,"children":2367},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":2369,"path":2370,"order":2206,"children":2371},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":2373,"path":2374,"order":2206,"children":2375},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":2377,"path":2378,"order":2206,"children":2379},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":2381,"path":2382,"order":2206,"children":2383},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":2385,"path":2386,"order":2206,"children":2387},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":2389,"path":2390,"order":2206,"children":2391},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":2393,"path":2394,"order":2206,"children":2395},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":2397,"path":2398,"order":2206,"children":2399},"device-agent","\u002Fdocs\u002Fdevice-agent",[2400,2404,2407,2411,2415,2419],{"title":2401,"path":2402,"order":122,"children":2403},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":2228,"path":2405,"order":170,"children":2406},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":2408,"path":2409,"order":188,"children":2410},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":2412,"path":2413,"order":197,"children":2414},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":2416,"path":2417,"order":208,"children":2418},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":2420,"path":2421,"order":2206,"children":2422},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[2423,2428,2432,2436,2440],{"title":2424,"path":2425,"group":2426,"order":122,"children":2427},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":2429,"path":2430,"group":2426,"order":170,"children":2431},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":2433,"path":2434,"group":2426,"order":181,"children":2435},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":2437,"path":2438,"group":2426,"order":188,"children":2439},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":2441,"path":2442,"group":2426,"order":197,"children":2443},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":2445,"path":2446,"order":2206,"children":2447},"hardware","\u002Fdocs\u002Fhardware",[2448,2451,2455,2459],{"title":2424,"path":2449,"order":122,"children":2450},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":2452,"path":2453,"order":170,"children":2454},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":2456,"path":2457,"order":181,"children":2458},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":2460,"path":2461,"order":181,"children":2462},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":2420,"path":2464,"order":2206,"children":2465},"\u002Fdocs\u002Finstall",[2466,2469,2473,2477,2497,2501,2505,2509],{"title":2424,"path":2467,"order":122,"children":2468},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":2470,"path":2471,"order":2206,"children":2472},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":2474,"path":2475,"order":2206,"children":2476},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":2478,"path":2479,"order":2206,"children":2480},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[2481,2485,2489,2493],{"title":2482,"path":2483,"order":2206,"children":2484},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":2486,"path":2487,"order":2206,"children":2488},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":2490,"path":2491,"order":2206,"children":2492},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":2494,"path":2495,"order":2206,"children":2496},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":2498,"path":2499,"order":2206,"children":2500},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":2502,"path":2503,"order":2206,"children":2504},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":2506,"path":2507,"order":2206,"children":2508},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":2510,"path":2511,"order":2206,"children":2512},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[2513,2515,2519,2523,2527,2531],{"title":2208,"path":2210,"order":2206,"children":2514},[],{"title":2516,"path":2517,"order":2206,"children":2518},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":2520,"path":2521,"order":2206,"children":2522},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":2524,"path":2525,"order":2206,"children":2526},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":2528,"path":2529,"order":2206,"children":2530},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":2532,"path":2533,"order":2206,"children":2534},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":2536,"path":2537,"order":2206,"children":2538},"migration","\u002Fdocs\u002Fmigration",[2539,2542],{"title":2310,"path":2540,"order":122,"children":2541},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":2543,"path":2544,"order":2206,"children":2545},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":2547,"path":2548,"order":2206,"children":2549},"user","\u002Fdocs\u002Fuser",[2550,2554,2558,2562,2566,2570,2574,2578,2582,2586,2590,2594,2606,2610,2614,2618,2622,2626,2630,2634,2638,2642,2646,2650,2654,2658,2661,2665],{"title":2551,"path":2552,"order":122,"children":2553},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":2555,"path":2556,"order":122,"children":2557},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":2559,"path":2560,"order":170,"children":2561},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":2563,"path":2564,"order":170,"children":2565},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":2567,"path":2568,"order":244,"children":2569},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":2571,"path":2572,"order":2206,"children":2573},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":2575,"path":2576,"order":2206,"children":2577},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":2579,"path":2580,"order":2206,"children":2581},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":2583,"path":2584,"order":2206,"children":2585},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":2587,"path":2588,"order":2206,"children":2589},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":2591,"path":2592,"order":2206,"children":2593},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":2595,"path":2596,"order":2206,"children":2597},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[2598,2602],{"title":2599,"path":2600,"order":2206,"children":2601},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":2603,"path":2604,"order":2206,"children":2605},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":2607,"path":2608,"order":2206,"children":2609},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":2611,"path":2612,"order":2206,"children":2613},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":2615,"path":2616,"order":2206,"children":2617},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":2619,"path":2620,"order":2206,"children":2621},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":2623,"path":2624,"order":2206,"children":2625},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":2627,"path":2628,"order":2206,"children":2629},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":2631,"path":2632,"order":2206,"children":2633},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":2635,"path":2636,"order":2206,"children":2637},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":2639,"path":2640,"order":2206,"children":2641},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":2643,"path":2644,"order":2206,"children":2645},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":2647,"path":2648,"order":2206,"children":2649},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":2651,"path":2652,"order":2206,"children":2653},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":2655,"path":2656,"order":2206,"children":2657},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":2389,"path":2659,"order":2206,"children":2660},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":2662,"path":2663,"order":2206,"children":2664},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":2666,"path":2667,"order":2206,"children":2668},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546041912]