From 82f511fa9bee25f64532356b0497ff04c7bf24c2 Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Wed, 30 Apr 2025 16:48:36 +0300 Subject: [PATCH 1/6] in progress --- _data/edge-pe/docs-home.yml | 2 + _data/edge/docs-home.yml | 2 + .../user-guide/config/edge-cluster-setup.md | 243 ++++++++++++++++++ docs/edge/config/edge-cluster-setup.md | 8 + docs/pe/edge/config/edge-cluster-setup.md | 9 + images/edge/config/edge-cluster.webp | Bin 0 -> 67976 bytes 6 files changed, 264 insertions(+) create mode 100644 _includes/docs/edge/user-guide/config/edge-cluster-setup.md create mode 100644 docs/edge/config/edge-cluster-setup.md create mode 100644 docs/pe/edge/config/edge-cluster-setup.md create mode 100644 images/edge/config/edge-cluster.webp diff --git a/_data/edge-pe/docs-home.yml b/_data/edge-pe/docs-home.yml index 4ff7376c8e..8401fe6c9c 100644 --- a/_data/edge-pe/docs-home.yml +++ b/_data/edge-pe/docs-home.yml @@ -43,6 +43,8 @@ toc: path: /docs/pe/edge/config/deploying-edge-alongside-iot-gateway/ - title: Installing Edge Behind a Proxy path: /docs/pe/edge/config/edge-behind-proxy/ + - title: Edge Cluster Setup + path: /docs/pe/edge/config/edge-cluster-setup/ - title: Rule Engine section: - title: Rule Chain Templates diff --git a/_data/edge/docs-home.yml b/_data/edge/docs-home.yml index ce2f8286ef..8e146f6513 100644 --- a/_data/edge/docs-home.yml +++ b/_data/edge/docs-home.yml @@ -43,6 +43,8 @@ toc: path: /docs/edge/config/deploying-edge-alongside-iot-gateway/ - title: Installing Edge Behind a Proxy path: /docs/edge/config/edge-behind-proxy/ + - title: Edge Cluster Setup + path: /docs/edge/config/edge-cluster-setup/ - title: Rule Engine section: - title: Rule Chain Templates diff --git a/_includes/docs/edge/user-guide/config/edge-cluster-setup.md b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md new file mode 100644 index 0000000000..c0ff42b20e --- /dev/null +++ b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md @@ -0,0 +1,243 @@ +* TOC +{:toc} + +{% assign sinceVersion = "4.0" %} +{% include templates/since.md %} + +### Overview + +**Edge clustering** refers to connecting and grouping multiple **Edge nodes** to work together at the **edge of the network**. +Clustering is useful for large-scale industrial IoT, smart cities, factories, or any scenario with thousands of devices in one region. + +Edge-specific considerations: +* All **Edge nodes** connect to the **same database**. +* **Devices** can connect to any node based on load balancing. +* **Edge nodes** share the workload and maintain local failover. +* The **Edge Cluster** syncs aggregated data to **ThingsBoard Cloud**. + +![edge-cluster](/images/edge/config/edge-cluster.webp){: style="display: block; margin: auto; max-width: 600px; max-height: 600px"} + +For more details, see the [microservices architecture](/docs/reference/msa/){: target="_blank"} page. + +#### Prerequisites + +**ThingsBoard** microservices run in a **Dockerized environment**. +Before starting, make sure that [Docker CE](https://docs.docker.com/install/){: target="_blank"} and [Docker Compose](https://docs.docker.com/compose/install/){: target="_blank"} are installed on your system. + +{% include templates/install/docker-install.md %} + +{% include templates/install/docker-install-note.md %} + +### Step 1. Pull the ThingsBoard Edge image + +[Log in](https://docs.docker.com/engine/reference/commandline/login/){: target="_blank"} to Docker Hub and use the command to pull the image: + +{% if docsPrefix == "pe/edge/" %} +```bash +docker pull thingsboard/tb-edge-pe:{{ site.release.pe_edge_full_ver }} +``` +{: .copy-code} + +{% else %} + +```bash +docker pull thingsboard/tb-edge:{{ site.release.edge_full_ver }} +``` +{: .copy-code} + +{% endif %} + +{% if docsPrefix == "pe/edge/" %} +### Step 2. Clone ThingsBoard PE Docker compose scripts + +```bash +git clone -b release-4.0.0 https://github.com/thingsboard/thingsboard-edge-pe-docker-compose.git tb-edge-pe-docker-compose --depth 1 +cd tb-edge-pe-docker-compose +``` +{: .copy-code} + +{% else %} + +### Step 2. Clone the ThingsBoard Edge CE repository + +```bash +git clone -b release-4.0 https://github.com/thingsboard/thingsboard-edge.git --depth 1 +cd thingsboard-edge/docker-edge +``` +{: .copy-code} + +{% endif %} + +### Step 3. Configure ThingsBoard Edge database and queue service + +Before performing the initial installation, configure the type of database to be used with **ThingsBoard Edge**. To set the database type, change the value of the **DATABASE** variable in the **environment file (.env)** file. + +**ThingsBoard Edge** currently supports two messaging systems/brokers for storing the messages: +* **In Memory** queue implementation is not suitable for any sort of cluster deployments. +* **Kafka** is recommended for production deployments and used by default. This queue is used on most of the ThingsBoard production environments now. + +To edit the **ThingsBoard Edge .env** file, run the following command: +```bash +nano .env +``` +{: .copy-code} + +Check the following lines: +```bash +DATABASE=database +TB_QUEUE_TYPE=kafka + +CLOUD_ROUTING_KEY=PUT_YOUR_EDGE_KEY_HERE # e.g. 19ea7ee8-5e6d-e642-4f32-05440a529015 +CLOUD_ROUTING_SECRET=PUT_YOUR_EDGE_SECRET_HERE # e.g. bztvkvfqsye7omv9uxlp +``` +{: .copy-code} + +View the full **.env** file: +```bash +# redis or redis-cluster or redis-sentinel +CACHE=redis + +DOCKER_REPO=thingsboard +{% if docsPrefix == "pe/edge/" %} +TB_EDGE_NODE_DOCKER_NAME=tb-edge-pe-node +TB_EDGE_VERSION=latest +{% else %} +TB_EDGE_NODE_DOCKER_NAME=tb-edge-node +TB_EDGE_VERSION=latest +{% endif %} +# Database used by ThingsBoard, can be either postgres (PostgreSQL) or hybrid (PostgreSQL for entities database and Cassandra for timeseries database). +# According to the database type corresponding docker service will be deployed (see docker-compose.postgres.yml, docker-compose.hybrid.yml for details). + +DATABASE=database +TB_QUEUE_TYPE=kafka + +CLOUD_ROUTING_KEY=PUT_YOUR_EDGE_KEY_HERE # e.g. 19ea7ee8-5e6d-e642-4f32-05440a529015 +CLOUD_ROUTING_SECRET=PUT_YOUR_EDGE_SECRET_HERE # e.g. bztvkvfqsye7omv9uxlp +{% if docsPrefix == "pe/edge/" %} +CLOUD_RPC_HOST=thingsboard.cloud +CLOUD_RPC_PORT=7070 +CLOUD_RPC_SSL_ENABLED=true +{% else %} +CLOUD_RPC_HOST=demo.thingsboard.io +CLOUD_RPC_PORT=7070 +{% endif %} + +LOAD_BALANCER_NAME=haproxy-certbot + +# If enabled Prometheus and Grafana containers are deployed along with other containers +MONITORING_ENABLED=false + +# Limit memory usage for each Java application +JAVA_OPTS="-Xmx2048M -Xms2048M -Xss384k -XX:+AlwaysPreTouch" +``` +{: .copy-code.expandable-7} + +* **CACHE:** Set the cache type: + * **redis:** Set the _redis_ value to use the Redis standalone cache (1 node - 1 master). + * **redis-cluster:** Set the _redis-cluster_ value to use the Redis cluster cache (6 nodes - 3 masters, 3 slaves). + * **redis-sentinel:** Set the _redis-sentinel_ value to use the Redis sentinel cache (3 nodes - 1 master, 1 slave, 1 sentinel). +* **DATABASE:** Replace the _database_ value with: + * **postgres:** Set the _postgres_ value to use the **PostgreSQL** database. + * **hybrid:** Set the _hybrid_ value to use the **PostgreSQL** database for the entities database and **Cassandra** for the time-series database. +* **CLOUD_ROUTING_KEY:** Put your edge key. +* **CLOUD_ROUTING_SECRET:** Put your edge secret. +{% if docsPrefix == "pe/edge/" %} +* **CLOUD_RPC_HOST:** Use _thingsboard.cloud_ / _eu.thingsboard.cloud_ if you connect **Edge** to the [ThingsBoard Cloud (North America)](https://thingsboard.cloud/signup){: target="_blank"}/[ThingsBoard Cloud (Europe)](https://eu.thingsboard.cloud/signup){: target="_blank"} correspondingly, or an **IP address** of the machine with the **ThingsBoard PE Platform**. +{% else %} +* **CLOUD_RPC_HOST:** Use _demo.thingsboard.io_ if you connect **Edge** to the [ThingsBoard Demo](https://demo.thingsboard.io/login){: target="_blank"}, or an **IP address** of the machine with the **ThingsBoard Platform**. +{% endif %} +* **MONITORING_ENABLED:** To start cluster monitoring with [Grafana](https://grafana.com/){: target="_blank"} and/or [Prometheus](https://prometheus.io/){: target="_blank"} services, set the variable to _true_. + +{% capture monitoring %} +Once deployed, you can reach **Prometheus** at [http://localhost:9090](http://localhost:9090){: target="_blank"} and **Grafana** at [http://localhost:3000](http://localhost:3000){: target="_blank"} + +By default: +* **Login:** admin +* **Password:** foobar +{% endcapture %} +{% include templates/info-banner.md content=monitoring %} + +### Step 4. Create and check required host volumes + +{% include templates/install/docker/docker-compose-setup-volumes.md %} + +### Step 5. Install and run ThingsBoard Edge + +To run the installation, execute the following command: +```bash +./docker-install-tb.sh +``` +{: .copy-code} + +To start the service, execute the following command: +```bash +./docker-start-services.sh +``` +{: .copy-code} + +{% capture install-and-run-edge %} +It will take a few minutes to start the services. Once all services are successfully started, open the **ThingsBoard Edge** service +at **http://{your-host-ip}** in the browser (_e.g., http://localhost_). +To log in, use **the credentials** from the **ThingsBoard** account. +{% endcapture %} +{% include templates/info-banner.md content=install-and-run-edge %} + +Examine edge service logs for errors in case of any issues. To see **ThingsBoard Edge** node logs, execute the following command: +```bash +docker-compose logs -f tb-edge1 tb-edge2 tb-edge3 +``` +{: .copy-code} + +To see the state of all the containers, use: +```bash +docker-compose ps +``` +{: .copy-code} + +To inspect the logs of all running services, use: +```bash +docker-compose logs --f +``` +{: .copy-code} + +See [docker-compose logs](https://docs.docker.com/compose/reference/logs/){: target="_blank"} command reference for details. + +#### Stop and remove docker containers + +To stop the services, use: + +```bash +./docker-stop-services.sh +``` +{: .copy-code} + +To stop and completely remove the deployed docker containers, run the command: + +```bash +./docker-remove-services.sh +``` +{: .copy-code} + +### Upgrading + +To update a particular or all services (pull newer docker image and rebuild container): +```bash +./docker-update-service.sh [SERVICE...] +``` +{: .copy-code} + +Where: +* **[SERVICE...]:** The list of services to update (defined in docker-compose configurations). If not specified, all services will be updated. + +To upgrade the database, run the following commands: + +```bash +./docker-stop-services.sh +./docker-upgrade-tb.sh +./docker-start-services.sh +``` +{: .copy-code} + +### Next steps + +{% include templates/edge/guides-banner-edge.md %} \ No newline at end of file diff --git a/docs/edge/config/edge-cluster-setup.md b/docs/edge/config/edge-cluster-setup.md new file mode 100644 index 0000000000..4b9d79eda6 --- /dev/null +++ b/docs/edge/config/edge-cluster-setup.md @@ -0,0 +1,8 @@ +--- +layout: docwithnav-edge +title: Edge Cluster Setup +description: Detailed instructions on how to set up ThingsBoard Edge in a cluster + +--- +{% assign docsPrefix = "edge/" %} +{% include docs/edge/user-guide/config/edge-cluster-setup.md %} \ No newline at end of file diff --git a/docs/pe/edge/config/edge-cluster-setup.md b/docs/pe/edge/config/edge-cluster-setup.md new file mode 100644 index 0000000000..a14be4137f --- /dev/null +++ b/docs/pe/edge/config/edge-cluster-setup.md @@ -0,0 +1,9 @@ +--- +layout: docwithnav-pe-edge +title: Edge Cluster Setup +description: Detailed instructions on how to set up ThingsBoard Edge in a cluster + +--- +{% assign docsPrefix = "pe/edge/" %} +{% assign peDocsPrefix = "pe/" %} +{% include docs/edge/user-guide/config/edge-cluster-setup.md %} \ No newline at end of file diff --git a/images/edge/config/edge-cluster.webp b/images/edge/config/edge-cluster.webp new file mode 100644 index 0000000000000000000000000000000000000000..caacda6f420887736202cbda1635153b648a2dfe GIT binary patch literal 67976 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
snV%(fR^JZB{q zKT0Yj(BzLf=7n217_DN6B3gZa==O=*e!%I(mUbk$$zLcRNL^9rgh6l)fhJkbK#4(b2cUnNY!1}Bvq$2;_n4_0+_gKvR#2g)mTy*JVX}*!xQ*Kg5@8av+uIeG6jEWR z+Gg?_xj`f*-0}LsLD_JLRA2>bk5OZ*hip6RfwB9Rw@K?Ar`zVqPw`^RokqZ)ffaEQndT4Uli9 z2o=2=4$3g;gn4p6z?p3q2N4s*Y#A#DX=09=?7dP8m^ygCE+UjCSp>hOsnkMmEyX)q zu3iL=qv2xQO&&bd>%c7qPU;?K_)6He&}-uXWPo%8T)`>eT|t?lA!oqT4T4B#dz{*B zm6d_G^pD|SwgFaOBhO}Ycy&3FjVM#BEkVXFg93eD&(L*krSvzHg=Lk518denFX?JO z>ShP;>O$%9GdM~M~1 zS~h_!lh&#P-OaA=hS-W^+`RA}9#gKKv_&u@Q6_Q2>qZM;&wG-EftD+vBPsM=GoA|i zevP&Lt1(S-PL$T>BAX6GDmHx?zj{85B-8|&v^criPXxJXQJD5iDC(PAzv@G73aIna zM8;!H(U|rZQK$Ek;WP#rkP8Ntb&mnS?k)g1v6sc=T$(M!xTy7G6R9r`v4A9f8%OH}ldm;$g9^R%j_NFK4n=IsN(LpYDo9qejb zKx`e)U)U_-jtwzN3fbJf^9|;mO`9ero&Vzv^W|Am)9)%z{=iaQ2N4~A8*ni47vix1 zfB)+iucgdeM;UTdSYfhqh*XgFqq2eSZKz9%&2vhzwD`*Za zF%)Mb(0Kkh{IpC)m$B#ueHi??w`RLPwPu#ph%WXSSh!p*wfEGW00a{;r`rek8Gb@eE_fgL_{;H}+4c;AW#qdjEhSBaMO^%gPemu~FE h(J#jGHmS?GP%d-)%l*uUj+};2g2{`h+b$>o001o5W3~VQ literal 0 HcmV?d00001 From 3545eceaeb1c4e689f498edec16013750f7629c6 Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Wed, 30 Apr 2025 17:32:55 +0300 Subject: [PATCH 2/6] in progress --- .../docs/edge/user-guide/config/edge-cluster-setup.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/_includes/docs/edge/user-guide/config/edge-cluster-setup.md b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md index c0ff42b20e..657fa39916 100644 --- a/_includes/docs/edge/user-guide/config/edge-cluster-setup.md +++ b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md @@ -238,6 +238,17 @@ To upgrade the database, run the following commands: ``` {: .copy-code} +### Generate certificate for HTTPS +We use **HAproxy** to proxy traffic to containers, and for **Web UI** we use **80** and **443** ports by default. To use HTTPS with a valid certificate, run these commands: +```bash +docker exec haproxy-certbot certbot-certonly --domain your_domain --email your_email +docker exec haproxy-certbot haproxy-refresh +``` +{: .copy-code} + +Valid certificate will only be used if you visit Web UI by domain in URL. +If you are using IP address to access UI, this would use self-signed certificate. + ### Next steps {% include templates/edge/guides-banner-edge.md %} \ No newline at end of file From 0f1a61662d8cbd0698111ff012653606d55f9776 Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Fri, 2 May 2025 16:59:45 +0300 Subject: [PATCH 3/6] in progress --- _data/edge-pe/docs-home.yml | 2 -- _data/edge/docs-home.yml | 2 -- .../docs/edge/user-guide/config/edge-cluster-setup.md | 5 +++-- docs/user-guide/install/pe/edge/installation-options.md | 9 +++++++++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/_data/edge-pe/docs-home.yml b/_data/edge-pe/docs-home.yml index 8401fe6c9c..4ff7376c8e 100644 --- a/_data/edge-pe/docs-home.yml +++ b/_data/edge-pe/docs-home.yml @@ -43,8 +43,6 @@ toc: path: /docs/pe/edge/config/deploying-edge-alongside-iot-gateway/ - title: Installing Edge Behind a Proxy path: /docs/pe/edge/config/edge-behind-proxy/ - - title: Edge Cluster Setup - path: /docs/pe/edge/config/edge-cluster-setup/ - title: Rule Engine section: - title: Rule Chain Templates diff --git a/_data/edge/docs-home.yml b/_data/edge/docs-home.yml index 8e146f6513..ce2f8286ef 100644 --- a/_data/edge/docs-home.yml +++ b/_data/edge/docs-home.yml @@ -43,8 +43,6 @@ toc: path: /docs/edge/config/deploying-edge-alongside-iot-gateway/ - title: Installing Edge Behind a Proxy path: /docs/edge/config/edge-behind-proxy/ - - title: Edge Cluster Setup - path: /docs/edge/config/edge-cluster-setup/ - title: Rule Engine section: - title: Rule Chain Templates diff --git a/_includes/docs/edge/user-guide/config/edge-cluster-setup.md b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md index 657fa39916..9666b38d4c 100644 --- a/_includes/docs/edge/user-guide/config/edge-cluster-setup.md +++ b/_includes/docs/edge/user-guide/config/edge-cluster-setup.md @@ -84,7 +84,7 @@ nano .env Check the following lines: ```bash -DATABASE=database +DATABASE=postgres TB_QUEUE_TYPE=kafka CLOUD_ROUTING_KEY=PUT_YOUR_EDGE_KEY_HERE # e.g. 19ea7ee8-5e6d-e642-4f32-05440a529015 @@ -108,7 +108,7 @@ TB_EDGE_VERSION=latest # Database used by ThingsBoard, can be either postgres (PostgreSQL) or hybrid (PostgreSQL for entities database and Cassandra for timeseries database). # According to the database type corresponding docker service will be deployed (see docker-compose.postgres.yml, docker-compose.hybrid.yml for details). -DATABASE=database +DATABASE=postgres TB_QUEUE_TYPE=kafka CLOUD_ROUTING_KEY=PUT_YOUR_EDGE_KEY_HERE # e.g. 19ea7ee8-5e6d-e642-4f32-05440a529015 @@ -139,6 +139,7 @@ JAVA_OPTS="-Xmx2048M -Xms2048M -Xss384k -XX:+AlwaysPreTouch" * **DATABASE:** Replace the _database_ value with: * **postgres:** Set the _postgres_ value to use the **PostgreSQL** database. * **hybrid:** Set the _hybrid_ value to use the **PostgreSQL** database for the entities database and **Cassandra** for the time-series database. +* **TB_QUEUE_TYPE:** Use _kafka_ as the queue type. The _in-memory_ value is not valid for a cluster deployment. * **CLOUD_ROUTING_KEY:** Put your edge key. * **CLOUD_ROUTING_SECRET:** Put your edge secret. {% if docsPrefix == "pe/edge/" %} diff --git a/docs/user-guide/install/pe/edge/installation-options.md b/docs/user-guide/install/pe/edge/installation-options.md index 1e440aac23..4853168e51 100644 --- a/docs/user-guide/install/pe/edge/installation-options.md +++ b/docs/user-guide/install/pe/edge/installation-options.md @@ -77,6 +77,15 @@ notitle: "true" + From 2f73edd2fe9ea4f2084310cc52372728c47c8a6e Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Fri, 2 May 2025 17:00:17 +0300 Subject: [PATCH 4/6] in progress --- _data/edge-pe/installation.yml | 2 ++ _data/edge/installation.yml | 2 ++ docs/user-guide/install/edge/installation-options.md | 9 +++++++++ 3 files changed, 13 insertions(+) diff --git a/_data/edge-pe/installation.yml b/_data/edge-pe/installation.yml index f1e3d90115..9cfc6c713a 100644 --- a/_data/edge-pe/installation.yml +++ b/_data/edge-pe/installation.yml @@ -17,6 +17,8 @@ toc: path: /docs/user-guide/install/pe/edge/docker-windows/ - title: Docker (Linux or Mac OS) path: /docs/user-guide/install/pe/edge/docker/ + - title: Edge Cluster Setup + path: /docs/pe/edge/config/edge-cluster-setup/ - title: Configuration section: - title: How to change configuration parameters? diff --git a/_data/edge/installation.yml b/_data/edge/installation.yml index 6e06b90061..3b8ac7d1e4 100644 --- a/_data/edge/installation.yml +++ b/_data/edge/installation.yml @@ -19,6 +19,8 @@ toc: path: /docs/user-guide/install/edge/docker/ - title: Building Edge from Sources path: /docs/user-guide/install/edge/building-from-source/ + - title: Edge Cluster Setup + path: /docs/edge/config/edge-cluster-setup/ - title: Configuration section: - title: How to change configuration parameters? diff --git a/docs/user-guide/install/edge/installation-options.md b/docs/user-guide/install/edge/installation-options.md index 4c25bf9a93..eb6e4442e4 100644 --- a/docs/user-guide/install/edge/installation-options.md +++ b/docs/user-guide/install/edge/installation-options.md @@ -86,6 +86,15 @@ notitle: "true" + From f22f43ab4f21b2f2f73cd7a5376e4d24155a5bd1 Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Fri, 2 May 2025 17:33:24 +0300 Subject: [PATCH 5/6] in progress --- installations/index.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/installations/index.html b/installations/index.html index f9cde7809e..abfda185ce 100644 --- a/installations/index.html +++ b/installations/index.html @@ -514,6 +514,11 @@

Deployment options

Building from source +
+ +
From 3ee78b690ed8a8b43e618a6836129705cb21fb92 Mon Sep 17 00:00:00 2001 From: Yevheniia Mala Date: Mon, 5 May 2025 13:52:11 +0300 Subject: [PATCH 6/6] in progress --- .../install/edge/installation-options.md | 2 +- .../install/pe/edge/installation-options.md | 2 +- .../pe/edge/integrations/docker-cluster.svg | 37 +++++++++++++++++++ installations/index.html | 2 +- 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 images/pe/edge/integrations/docker-cluster.svg diff --git a/docs/user-guide/install/edge/installation-options.md b/docs/user-guide/install/edge/installation-options.md index eb6e4442e4..82c0c9157f 100644 --- a/docs/user-guide/install/edge/installation-options.md +++ b/docs/user-guide/install/edge/installation-options.md @@ -90,7 +90,7 @@ notitle: "true" diff --git a/docs/user-guide/install/pe/edge/installation-options.md b/docs/user-guide/install/pe/edge/installation-options.md index 4853168e51..595af52c94 100644 --- a/docs/user-guide/install/pe/edge/installation-options.md +++ b/docs/user-guide/install/pe/edge/installation-options.md @@ -81,7 +81,7 @@ notitle: "true" diff --git a/images/pe/edge/integrations/docker-cluster.svg b/images/pe/edge/integrations/docker-cluster.svg new file mode 100644 index 0000000000..0d6d98504a --- /dev/null +++ b/images/pe/edge/integrations/docker-cluster.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installations/index.html b/installations/index.html index abfda185ce..cc77066173 100644 --- a/installations/index.html +++ b/installations/index.html @@ -516,7 +516,7 @@

Deployment options