From ff5571beb5a7436f3b0fc795d15cd7aea52d1a3d Mon Sep 17 00:00:00 2001 From: zhanghongtong Date: Fri, 10 Sep 2021 14:30:49 +0800 Subject: [PATCH 01/15] Add a new emqx image docs Signed-off-by: zhanghongtong --- emqx/README-short.txt | 1 + emqx/content.md | 299 ++++++++++++++++++++++++++++++++++++++++++ emqx/get-help.md | 2 + emqx/github-repo | 1 + emqx/license.md | 1 + emqx/logo.png | Bin 0 -> 59555 bytes emqx/maintainer.md | 1 + 7 files changed, 305 insertions(+) create mode 100644 emqx/README-short.txt create mode 100644 emqx/content.md create mode 100644 emqx/get-help.md create mode 100644 emqx/github-repo create mode 100644 emqx/license.md create mode 100644 emqx/logo.png create mode 100644 emqx/maintainer.md diff --git a/emqx/README-short.txt b/emqx/README-short.txt new file mode 100644 index 000000000000..86d9775bfe12 --- /dev/null +++ b/emqx/README-short.txt @@ -0,0 +1 @@ +An Open-Source, Cloud-Native, Distributed MQTT Message Broker for IoT. diff --git a/emqx/content.md b/emqx/content.md new file mode 100644 index 000000000000..2126c08b0ee5 --- /dev/null +++ b/emqx/content.md @@ -0,0 +1,299 @@ +# What is EMQ X ? + +[EMQ X MQTT broker](https://www.emqx.io/) is a fully open source, highly scalable, highly available distributed MQTT messaging broker for IoT, M2M and Mobile applications that can handle tens of millions of concurrent clients. + +Starting from 3.0 release, *EMQ X* broker fully supports MQTT V5.0 protocol specifications and backward compatible with MQTT V3.1 and V3.1.1, as well as other communication protocols such as MQTT-SN, CoAP, LwM2M, WebSocket and STOMP. The 3.0 release of the *EMQ X* broker can scaled to 10+ million concurrent MQTT connections on one cluster. + +%%LOGO%% + +# How to use this image + +### Run emqx + +Execute some command under this docker image + +`docker run -d --name emqx emqx:$(tag)` + +For example + +`docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx:latest` + +The emqx broker runs as linux user `emqx` in the docker container. + +### Configuration + +Use the environment variable to configure the EMQ X docker container. + +By default, the environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files. + +You can change the prefix by overriding "HOCON_ENV_OVERRIDE_PREFIX". + +Example: + +```bash +EMQX_LISTENERS__SSL__DEFAULT__ACCEPTORS <--> listeners.ssl.default.acceptors +EMQX_ZONES__DEFAULT__MQTT__MAX_PACKET_SIZE <--> zones.default.mqtt.max_packet_size +``` + +- Prefix `EMQX_` is removed +- All upper case letters is replaced with lower case letters +- `__` is replaced with `.` + +If `HOCON_ENV_OVERRIDE_PREFIX=DEV_` is set: + +```bash +DEV_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors +DEV_MQTT__MAX_PACKET_SIZE <--> mqtt.max_packet_size +``` + +Non mapped environment variables: + +```bash +EMQX_NAME +EMQX_HOST +``` + +These environment variables will ignore for configuration file. + +#### EMQ X Configuration + +> NOTE: All EMQ X Configuration in [etc/emqx.conf](https://github.com/emqx/emqx/blob/master/etc/emqx.conf) could config by environment. The following list is just an example, not a complete configuration. + +| Options | Default | Mapped | Description | +|-----------|----------------|--------|----------------------------| +| EMQX_NAME | container name | none | emqx node short name | +| EMQX_HOST | container IP | none | emqx node host, IP or FQDN | + +The list is incomplete and may changed with [etc/emqx.conf](https://github.com/emqx/emqx/blob/master/etc/emqx.conf) and plugin configuration files. But the mapping rule is similar. + +If set `EMQX_NAME` and `EMQX_HOST`, and unset `EMQX_NODE_NAME`, `EMQX_NODE_NAME=$EMQX_NAME@$EMQX_HOST`. + +For example, set mqtt tcp port to 1883 + +`docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 emqx:latest` + +#### EMQ Loaded Modules Configuration + +| Oprtions | Default | Description | +|---------------------|-------------------|-----------------------------| +| EMQX_LOADED_MODULES | see content below | default modules emqx loaded | + +Default environment variable `EMQX_LOADED_MODULES`, including + +- `emqx_mod_presence` + +```bash +# The default EMQX_LOADED_MODULES env +EMQX_LOADED_MODULES="emqx_mod_presence" +``` + +For example, set `EMQX_LOADED_MODULES=emqx_mod_delayed,emqx_mod_rewrite` to load these two modules. + +You can use comma, space or other separator that you want. + +All the modules defined in env `EMQX_LOADED_MODULES` will be loaded. + +```bash +EMQX_LOADED_MODULES="emqx_mod_delayed,emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed | emqx_mod_rewrite" +``` + +#### EMQ Loaded Plugins Configuration + +| Oprtions | Default | Description | +|---------------------|-------------------|-----------------------------| +| EMQX_LOADED_PLUGINS | see content below | default plugins emqx loaded | + +Default environment variable `EMQX_LOADED_PLUGINS`, including + +- `emqx_recon` +- `emqx_retainer` +- `emqx_rule_engine` +- `emqx_management` +- `emqx_dashboard` + +```bash +# The default EMQX_LOADED_PLUGINS env +EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" +``` + +For example, set `EMQX_LOADED_PLUGINS= emqx_retainer,emqx_rule_engine` to load these two plugins. + +You can use comma, space or other separator that you want. + +All the plugins defined in `EMQX_LOADED_PLUGINS` will be loaded. + +```bash +EMQX_LOADED_PLUGINS="emqx_retainer,emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer | emqx_rule_engine" +``` + +#### EMQ X Plugins Configuration + +The environment variables which with `EMQX_` prefix are mapped to all emqx plugins' configuration file, `.` get replaced by `__`. + +Example: + +```bash +EMQX_RETAINER__STORAGE_TYPE <--> retainer.storage_type +EMQX_RETAINER__MAX_PAYLOAD_SIZE <--> retainer.max_payload_size +``` + +Don't worry about where to find the configuration file of emqx plugins, this docker image will find and config them automatically using some magic. + +All plugin of emqx project could config in this way, following the environment variables mapping rule above. + +Assume you are using redis auth plugin, for example: + +```bash +#EMQX_RETAINER__STORAGE_TYPE = "ram" +#EMQX_RETAINER.MAX_PAYLOAD_SIZE = 1MB + +docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ + -e EMQX_LISTENERS__TCP__DEFAULT=1883 \ + -e EMQX_LOADED_PLUGINS="emqx_retainer" \ + -e EMQX_RETAINER__STORAGE_TYPE = "ram" \ + -e EMQX_RETAINER__MAX_PAYLOAD_SIZE = 1MB \ + emqx:latest +``` + +For numbered configuration options where the number is next to a `.` such as: + +- backend.redis.pool1.server +- backend.redis.hook.message.publish.1 + +You can configure an arbitrary number of them as long as each has a uniq unber for it's own configuration option: + +```bash +docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ + -e EMQX_BACKEND_REDIS_POOL1__SERVER=127.0.0.1:6379 + [...] + -e EMQX_BACKEND__REDIS__POOL5__SERVER=127.0.0.5:6379 + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__1='{"topic": "persistant/topic1", "action": {"function": "on_message_publish"}, "pool": "pool1"}' + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__2='{"topic": "persistant/topic2", "action": {"function": "on_message_publish"}, "pool": "pool1"}' + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__3='{"topic": "persistant/topic3", "action": {"function": "on_message_publish"}, "pool": "pool1"}' + [...] + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__13='{"topic": "persistant/topic13", "action": {"function": "on_message_publish"}, "pool": "pool1"}' + emqx:latest +``` + +### Cluster + +EMQ X supports a variety of clustering methods, see our [documentation](https://docs.emqx.io/broker/latest/en/advanced/cluster.html#emqx-service-discovery) for details. + +Let's create a static node list cluster from docker-compose. + +- Create `docker-compose.yaml`: + +```yaml + version: '3' + + services: + emqx1: + image: emqx:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node1.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node1.emqx.io + + emqx2: + image: emqx:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node2.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node2.emqx.io + + networks: + emqx-bridge: + driver: bridge +``` + +- Start the docker-compose cluster + +```bash + docker-compose -p my_emqx up -d +``` + +- View cluster + +```bash + $ docker exec -it my_emqx_emqx1_1 sh -c "emqx_ctl cluster status" + Cluster status: #{running_nodes => ['emqx@node1.emqx.io','emqx@node2.emqx.io'], + stopped_nodes => []} +``` + +### Persistence + +If you want to persist the EMQ X docker container, you need to keep the following directories: + +- `/opt/emqx/data` +- `/opt/emqx/etc` +- `/opt/emqx/log` + +Since data in these folders are partially stored under the `/opt/emqx/data/mnesia/${node_name}`, the user also needs to reuse the same node name to see the previous state. In detail, one needs to specify the two environment variables: `EMQX_NAME` and `EMQX_HOST`, `EMQX_HOST` set as `127.0.0.1` or network alias would be useful. + +In if you use docker-compose, the configuration would look something like this: + +```YAML +volumes: + vol-emqx-data: + name: foo-emqx-data + vol-emqx-etc: + name: foo-emqx-etc + vol-emqx-log: + name: foo-emqx-log + +services: + emqx: + image: emqx:latest + restart: always + environment: + EMQX_NAME: foo_emqx + EMQX_HOST: 127.0.0.1 + volumes: + - vol-emqx-data:/opt/emqx/data + + - vol-emqx-log:/opt/emqx/log +``` + +### Kernel Tuning + +Under linux host machine, the easiest way is [Tuning guide](https://docs.emqx.io/en/broker/latest/tutorial/tune.html#linux-kernel-tuning). + +If you want tune linux kernel by docker, you must ensure your docker is latest version (>=1.12). + +```bash + +docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ + --sysctl fs.file-max=2097152 \ + --sysctl fs.nr_open=2097152 \ + --sysctl net.core.somaxconn=32768 \ + --sysctl net.ipv4.tcp_max_syn_backlog=16384 \ + --sysctl net.core.netdev_max_backlog=16384 \ + --sysctl net.ipv4.ip_local_port_range=1000 65535 \ + --sysctl net.core.rmem_default=262144 \ + --sysctl net.core.wmem_default=262144 \ + --sysctl net.core.rmem_max=16777216 \ + --sysctl net.core.wmem_max=16777216 \ + --sysctl net.core.optmem_max=16777216 \ + --sysctl net.ipv4.tcp_rmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \ + --sysctl net.ipv4.tcp_fin_timeout=15 \ + emqx:latest + +``` + +> REMEMBER: DO NOT RUN EMQ X DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE. diff --git a/emqx/get-help.md b/emqx/get-help.md new file mode 100644 index 000000000000..d32812ad6651 --- /dev/null +++ b/emqx/get-help.md @@ -0,0 +1,2 @@ +- [Discussions](https://github.com/emqx/emqx/discussions) +- [Slack](https://slack-invite.emqx.io/) diff --git a/emqx/github-repo b/emqx/github-repo new file mode 100644 index 000000000000..c225c8ed2658 --- /dev/null +++ b/emqx/github-repo @@ -0,0 +1 @@ +https://github.com/emqx/emqx-docker diff --git a/emqx/license.md b/emqx/license.md new file mode 100644 index 000000000000..e2a94a5f02ba --- /dev/null +++ b/emqx/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/emqx/emqx/blob/master/LICENSE) for the software contained in this image. diff --git a/emqx/logo.png b/emqx/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..799176a7e0fa2348fc8011b3d328f50bc8b4e834 GIT binary patch literal 59555 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 V>DLJMYn%iBR24PvR@}A>{eSD$p&|eP literal 0 HcmV?d00001 diff --git a/emqx/maintainer.md b/emqx/maintainer.md new file mode 100644 index 000000000000..3faa249415e0 --- /dev/null +++ b/emqx/maintainer.md @@ -0,0 +1 @@ +[EMQ Technologies](https://github.com/emqx) From d2947c77dedd5bef4a2490eaf1b370248e9b5f2d Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:41:41 +0800 Subject: [PATCH 02/15] style(emqx): update emqx/get-help.md Co-authored-by: Tianon Gravi --- emqx/get-help.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/emqx/get-help.md b/emqx/get-help.md index d32812ad6651..75c73bfa32c7 100644 --- a/emqx/get-help.md +++ b/emqx/get-help.md @@ -1,2 +1 @@ -- [Discussions](https://github.com/emqx/emqx/discussions) -- [Slack](https://slack-invite.emqx.io/) +[Discussions](https://github.com/emqx/emqx/discussions) or [Slack](https://slack-invite.emqx.io/) From 2f712da109abc752d169c547afc40d11e2049cf0 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:42:07 +0800 Subject: [PATCH 03/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 2126c08b0ee5..57d932605569 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -12,7 +12,9 @@ Starting from 3.0 release, *EMQ X* broker fully supports MQTT V5.0 protocol spec Execute some command under this docker image -`docker run -d --name emqx emqx:$(tag)` +```console +$ docker run -d --name emqx %%IMAGE%%:tag +``` For example From bea9d74ad65c67c3a586cc2e41d500ceac2241ba Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:42:18 +0800 Subject: [PATCH 04/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 57d932605569..c4977b43d6df 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -18,7 +18,9 @@ $ docker run -d --name emqx %%IMAGE%%:tag For example -`docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx:latest` +```console +$ docker run -d --name emqx -p 18083:18083 -p 1883:1883 %%IMAGE%%:latest +``` The emqx broker runs as linux user `emqx` in the docker container. From a3840c578250d0eb77dd11a682f7d83410e8ec42 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:42:29 +0800 Subject: [PATCH 05/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index c4977b43d6df..d53955b2a4cc 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -30,7 +30,7 @@ Use the environment variable to configure the EMQ X docker container. By default, the environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files. -You can change the prefix by overriding "HOCON_ENV_OVERRIDE_PREFIX". +You can change the prefix by overriding `HOCON_ENV_OVERRIDE_PREFIX`. Example: From 6c554ae8a72ad422d03224430ac2ecd457849e64 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:42:39 +0800 Subject: [PATCH 06/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/emqx/content.md b/emqx/content.md index d53955b2a4cc..6f15f855d546 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -63,10 +63,10 @@ These environment variables will ignore for configuration file. > NOTE: All EMQ X Configuration in [etc/emqx.conf](https://github.com/emqx/emqx/blob/master/etc/emqx.conf) could config by environment. The following list is just an example, not a complete configuration. -| Options | Default | Mapped | Description | -|-----------|----------------|--------|----------------------------| -| EMQX_NAME | container name | none | emqx node short name | -| EMQX_HOST | container IP | none | emqx node host, IP or FQDN | +| Options | Default | Mapped | Description | +|-------------|----------------|--------|----------------------------| +| `EMQX_NAME` | container name | none | emqx node short name | +| `EMQX_HOST` | container IP | none | emqx node host, IP or FQDN | The list is incomplete and may changed with [etc/emqx.conf](https://github.com/emqx/emqx/blob/master/etc/emqx.conf) and plugin configuration files. But the mapping rule is similar. From f68cb105fac56af69bc6529eba5fb58afc0afeba Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:42:56 +0800 Subject: [PATCH 07/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 6f15f855d546..47a603d5e2d3 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -74,7 +74,9 @@ If set `EMQX_NAME` and `EMQX_HOST`, and unset `EMQX_NODE_NAME`, `EMQX_NODE_NAME= For example, set mqtt tcp port to 1883 -`docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 emqx:latest` +```console +$ docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 %%IMAGE%%:latest +``` #### EMQ Loaded Modules Configuration From 1275acbd095024c0270eaa80ad06a7af07673a1b Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:05 +0800 Subject: [PATCH 08/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/emqx/content.md b/emqx/content.md index 47a603d5e2d3..14604f0c129e 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -80,9 +80,9 @@ $ docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083 #### EMQ Loaded Modules Configuration -| Oprtions | Default | Description | -|---------------------|-------------------|-----------------------------| -| EMQX_LOADED_MODULES | see content below | default modules emqx loaded | +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_MODULES` | see content below | default modules emqx loaded | Default environment variable `EMQX_LOADED_MODULES`, including From 8dcd934196c84f2de647c07e91201e712e9c39eb Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:15 +0800 Subject: [PATCH 09/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/emqx/content.md b/emqx/content.md index 14604f0c129e..eea7c99378ee 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -107,9 +107,9 @@ EMQX_LOADED_MODULES="emqx_mod_delayed | emqx_mod_rewrite" #### EMQ Loaded Plugins Configuration -| Oprtions | Default | Description | -|---------------------|-------------------|-----------------------------| -| EMQX_LOADED_PLUGINS | see content below | default plugins emqx loaded | +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_PLUGINS` | see content below | default plugins emqx loaded | Default environment variable `EMQX_LOADED_PLUGINS`, including From d577d7cd6a564f95b000ad0c8cf974f303f1defd Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:24 +0800 Subject: [PATCH 10/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index eea7c99378ee..d12bd0b15e60 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -162,7 +162,7 @@ docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ -e EMQX_LOADED_PLUGINS="emqx_retainer" \ -e EMQX_RETAINER__STORAGE_TYPE = "ram" \ -e EMQX_RETAINER__MAX_PAYLOAD_SIZE = 1MB \ - emqx:latest + %%IMAGE%%:latest ``` For numbered configuration options where the number is next to a `.` such as: From a108dcbd709a37a2f6826913a3a0cd91571bcad9 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:38 +0800 Subject: [PATCH 11/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/emqx/content.md b/emqx/content.md index d12bd0b15e60..3311a43a76ba 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -174,15 +174,15 @@ You can configure an arbitrary number of them as long as each has a uniq unber f ```bash docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ - -e EMQX_BACKEND_REDIS_POOL1__SERVER=127.0.0.1:6379 + -e EMQX_BACKEND_REDIS_POOL1__SERVER=127.0.0.1:6379 \ [...] - -e EMQX_BACKEND__REDIS__POOL5__SERVER=127.0.0.5:6379 - -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__1='{"topic": "persistant/topic1", "action": {"function": "on_message_publish"}, "pool": "pool1"}' - -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__2='{"topic": "persistant/topic2", "action": {"function": "on_message_publish"}, "pool": "pool1"}' - -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__3='{"topic": "persistant/topic3", "action": {"function": "on_message_publish"}, "pool": "pool1"}' + -e EMQX_BACKEND__REDIS__POOL5__SERVER=127.0.0.5:6379 \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__1='{"topic": "persistant/topic1", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__2='{"topic": "persistant/topic2", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__3='{"topic": "persistant/topic3", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ [...] - -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__13='{"topic": "persistant/topic13", "action": {"function": "on_message_publish"}, "pool": "pool1"}' - emqx:latest + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__13='{"topic": "persistant/topic13", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + %%IMAGE%%:latest ``` ### Cluster From 67249ea89e75b82131a292650be17a01b29372d7 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:48 +0800 Subject: [PATCH 12/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 3311a43a76ba..229c6ae9f4e6 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -210,7 +210,7 @@ Let's create a static node list cluster from docker-compose. - node1.emqx.io emqx2: - image: emqx:latest + image: %%IMAGE%%:latest environment: - "EMQX_NAME=emqx" - "EMQX_HOST=node2.emqx.io" From f93b1c97810a3261b93cf92d7753d7cc29347590 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:43:57 +0800 Subject: [PATCH 13/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 229c6ae9f4e6..f5edf238a331 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -263,7 +263,7 @@ volumes: services: emqx: - image: emqx:latest + image: %%IMAGE%%:latest restart: always environment: EMQX_NAME: foo_emqx From 8fdcd36ce079f2cca6c5227de3dcab2662eda774 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:44:07 +0800 Subject: [PATCH 14/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index f5edf238a331..393f2bbddc79 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -298,7 +298,7 @@ docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \ --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \ --sysctl net.ipv4.tcp_fin_timeout=15 \ - emqx:latest + %%IMAGE%%:latest ``` From 9bf7550f28d0827235b3d2e4e06a229d55e7ea51 Mon Sep 17 00:00:00 2001 From: Rory Z Date: Wed, 6 Apr 2022 09:44:33 +0800 Subject: [PATCH 15/15] style(emqx): update emqx/content.md Co-authored-by: Tianon Gravi --- emqx/content.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emqx/content.md b/emqx/content.md index 393f2bbddc79..61945ad6d25f 100644 --- a/emqx/content.md +++ b/emqx/content.md @@ -198,7 +198,7 @@ Let's create a static node list cluster from docker-compose. services: emqx1: - image: emqx:latest + image: %%IMAGE%%:latest environment: - "EMQX_NAME=emqx" - "EMQX_HOST=node1.emqx.io"