Merge remote-tracking branch 'ce/main-v4.3' into merge-main-v4.3-into-v4.4

This commit is contained in:
JianBo He 2022-02-22 11:43:46 +08:00
commit 521bdd20b4
79 changed files with 459 additions and 468 deletions

View File

@ -5,6 +5,9 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
on: on:
push:
branches:
- 'main-v4.**'
schedule: schedule:
- cron: '0 */6 * * *' - cron: '0 */6 * * *'
release: release:
@ -19,8 +22,7 @@ jobs:
container: ghcr.io/emqx/emqx-builder/4.4-5:24.1.5-3-ubuntu20.04 container: ghcr.io/emqx/emqx-builder/4.4-5:24.1.5-3-ubuntu20.04
outputs: outputs:
profiles: ${{ steps.set_profile.outputs.profiles }} profiles: ${{ steps.set_profile.outputs.profiles}}
old_vsns: ${{ steps.set_profile.outputs.old_vsns }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@ -33,12 +35,8 @@ jobs:
working-directory: source working-directory: source
run: | run: |
if make emqx-ee --dry-run > /dev/null 2>&1; then if make emqx-ee --dry-run > /dev/null 2>&1; then
old_vsns="$(./scripts/relup-base-vsns.sh enterprise | xargs)"
echo "::set-output name=old_vsns::$old_vsns"
echo "::set-output name=profiles::[\"emqx-ee\"]" echo "::set-output name=profiles::[\"emqx-ee\"]"
else else
old_vsns="$(./scripts/relup-base-vsns.sh community | xargs)"
echo "::set-output name=old_vsns::$old_vsns"
echo "::set-output name=profiles::[\"emqx\", \"emqx-edge\"]" echo "::set-output name=profiles::[\"emqx\", \"emqx-edge\"]"
fi fi
- name: get_all_deps - name: get_all_deps
@ -254,42 +252,6 @@ jobs:
path: . path: .
- name: unzip source code - name: unzip source code
run: unzip -q source.zip run: unzip -q source.zip
- name: downloads old emqx zip packages
if: matrix.package == 'zip'
env:
OTP_VSN: ${{ matrix.otp }}
PROFILE: ${{ matrix.profile }}
ARCH: ${{ matrix.arch }}
SYSTEM: ${{ matrix.os }}
OLD_VSNS: ${{ needs.prepare.outputs.old_vsns }}
working-directory: source
run: |
set -e -x -u
broker=$PROFILE
if [ $PROFILE = "emqx" ];then
broker="emqx-ce"
fi
if [ ! -z "$(echo $SYSTEM | grep -oE 'raspbian')" ]; then
export ARCH="arm"
fi
if [ "$SYSTEM" = 'centos7' ]; then
DISTRO='el7'
elif [ "$SYSTEM" = 'rockylinux8' ]; then
DISTRO='el8'
else
DISTRO=${SYSTEM}
fi
mkdir -p _upgrade_base
cd _upgrade_base
old_vsns=($(echo $OLD_VSNS | tr ' ' ' '))
for tag in ${old_vsns[@]}; do
package_name="${PROFILE}-${tag#[e|v]}-otp${OTP_VSN}-${DISTRO}-${ARCH}"
if [ ! -z "$(echo $(curl -I -m 10 -o /dev/null -s -w %{http_code} https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/$tag/$package_name.zip) | grep -oE "^[23]+")" ]; then
wget --no-verbose https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/$tag/$package_name.zip
wget --no-verbose https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/$tag/$package_name.zip.sha256
echo "$(cat $package_name.zip.sha256) $package_name.zip" | sha256sum -c || exit 1
fi
done
- name: build emqx packages - name: build emqx packages
env: env:
OTP: ${{ matrix.otp }} OTP: ${{ matrix.otp }}
@ -427,6 +389,7 @@ jobs:
needs: [prepare, mac, linux, docker] needs: [prepare, mac, linux, docker]
strategy: strategy:
fail-fast: false
matrix: matrix:
profile: ${{fromJSON(needs.prepare.outputs.profiles)}} profile: ${{fromJSON(needs.prepare.outputs.profiles)}}
otp: otp:

View File

@ -1,24 +0,0 @@
name: Code style check
on: [pull_request]
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 1000
- name: Set git token
if: endsWith(github.repository, 'enterprise')
run: |
echo "https://ci%40emqx.io:${{ secrets.CI_GIT_TOKEN }}@github.com" > $HOME/.git-credentials
git config --global credential.helper store
- name: Run elvis check
run: |
set -e
if [ -f EMQX_ENTERPRISE ]; then
./scripts/elvis-check.sh $GITHUB_BASE_REF emqx-enterprise
else
./scripts/elvis-check.sh $GITHUB_BASE_REF emqx
fi

View File

@ -290,6 +290,7 @@ jobs:
name: Checkout name: Checkout
with: with:
path: emqx path: emqx
fetch-depth: 0
- name: Prepare credentials - name: Prepare credentials
run: | run: |
if [ "$PROFILE" = "emqx-ee" ]; then if [ "$PROFILE" = "emqx-ee" ]; then
@ -297,15 +298,6 @@ jobs:
git config --global credential.helper store git config --global credential.helper store
echo "${{ secrets.CI_GIT_TOKEN }}" >> emqx/scripts/git-token echo "${{ secrets.CI_GIT_TOKEN }}" >> emqx/scripts/git-token
fi fi
- name: Download bases
run: |
set -e -x -u
mkdir -p emqx/_upgrade_base
cd emqx/_upgrade_base
old_vsns=($(echo $OLD_VSNS | tr ' ' ' '))
for old_vsn in ${old_vsns[@]}; do
wget --no-verbose https://s3-us-west-2.amazonaws.com/packages.emqx/$BROKER/$old_vsn/$PROFILE-${old_vsn#[e|v]}-otp${{ matrix.otp }}-ubuntu20.04-amd64.zip
done
- name: Build emqx - name: Build emqx
run: make -C emqx ${PROFILE}-zip run: make -C emqx ${PROFILE}-zip
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v2

View File

@ -1,6 +1,6 @@
# EMQ X 4.3 Changes # EMQX 4.3 Changes
Started tracking changes in CHANGE.md since EMQ X v4.3.11 Started tracking changes in CHANGE.md since EMQX v4.3.11
NOTE: Keep prepending to the head of the file instead of the tail NOTE: Keep prepending to the head of the file instead of the tail
@ -10,6 +10,18 @@ File format:
- One list item per change topic - One list item per change topic
Change log ends with a list of github PRs Change log ends with a list of github PRs
## v4.3.13
### Enhancements
* CLI `emqx_ctl pem_cache clean` to force purge x509 certificate cache,
to force an immediate reload of all certificates after the files are updated on disk.
### Bug fixes
* Fix case where publishing to a non-existent topic alias would crash the connection [#6979]
* Fix HTTP-API 500 error on querying the lwm2m client list on the another node [#7009]
## v4.3.12 ## v4.3.12
### Important changes ### Important changes
@ -41,9 +53,9 @@ Important notes:
### Important changes ### Important changes
* Debian/Ubuntu package (deb) installed EMQ X now runs on systemd [#6389]<br> * Debian/Ubuntu package (deb) installed EMQX now runs on systemd [#6389]<br>
This is to take advantage of systemd's supervision functionality to ensure This is to take advantage of systemd's supervision functionality to ensure
EMQ X service is restarted after crashes. EMQX service is restarted after crashes.
### Minor changes ### Minor changes
@ -59,7 +71,7 @@ Important notes:
* Fix session takeover race condition which may lead to message loss [#6396] * Fix session takeover race condition which may lead to message loss [#6396]
* EMQ X docker images are pushed to aws public ecr in an automated CI job [#6271]<br> * EMQX docker images are pushed to aws public ecr in an automated CI job [#6271]<br>
`docker pull public.ecr.aws/emqx/emqx:4.3.10` `docker pull public.ecr.aws/emqx/emqx:4.3.10`
* Fix webhook URL path to allow rule-engine variable substitution [#6399] * Fix webhook URL path to allow rule-engine variable substitution [#6399]

View File

@ -2,6 +2,7 @@ $(shell $(CURDIR)/scripts/git-hooks-init.sh)
REBAR = $(CURDIR)/rebar3 REBAR = $(CURDIR)/rebar3
BUILD = $(CURDIR)/build BUILD = $(CURDIR)/build
SCRIPTS = $(CURDIR)/scripts SCRIPTS = $(CURDIR)/scripts
export EMQX_RELUP ?= true
export EMQX_DEFAULT_BUILDER = ghcr.io/emqx/emqx-builder/4.4-5:24.1.5-3-alpine3.14 export EMQX_DEFAULT_BUILDER = ghcr.io/emqx/emqx-builder/4.4-5:24.1.5-3-alpine3.14
export EMQX_DEFAULT_RUNNER = alpine:3.14 export EMQX_DEFAULT_RUNNER = alpine:3.14
export OTP_VSN ?= $(shell $(CURDIR)/scripts/get-otp-vsn.sh) export OTP_VSN ?= $(shell $(CURDIR)/scripts/get-otp-vsn.sh)
@ -130,10 +131,19 @@ COMMON_DEPS := $(REBAR) get-dashboard $(CONF_SEGS)
$(REL_PROFILES:%=%-rel) $(PKG_PROFILES:%=%-rel): $(COMMON_DEPS) $(REL_PROFILES:%=%-rel) $(PKG_PROFILES:%=%-rel): $(COMMON_DEPS)
@$(BUILD) $(subst -rel,,$(@)) rel @$(BUILD) $(subst -rel,,$(@)) rel
## download relup base packages
.PHONY: $(REL_PROFILES:%=%-relup-downloads)
define download-relup-packages
$1-relup-downloads:
@if [ "$${EMQX_RELUP}" = "true" ]; then $(CURDIR)/scripts/relup-base-packages.sh $1; fi
endef
ALL_ZIPS = $(REL_PROFILES)
$(foreach zt,$(ALL_ZIPS),$(eval $(call download-relup-packages,$(zt))))
## relup target is to create relup instructions ## relup target is to create relup instructions
.PHONY: $(REL_PROFILES:%=%-relup) .PHONY: $(REL_PROFILES:%=%-relup)
define gen-relup-target define gen-relup-target
$1-relup: $(COMMON_DEPS) $1-relup: $1-relup-downloads $(COMMON_DEPS)
@$(BUILD) $1 relup @$(BUILD) $1 relup
endef endef
ALL_ZIPS = $(REL_PROFILES) ALL_ZIPS = $(REL_PROFILES)

2
NOTICE
View File

@ -1,4 +1,4 @@
EMQ X, a highly scalable, highly available distributed MQTT messaging broker for IoT. EMQX, a highly scalable, highly available distributed MQTT messaging broker for IoT.
Copyright (c) 2017-2021 EMQ Technologies Co., Ltd. All Rights Reserved. Copyright (c) 2017-2021 EMQ Technologies Co., Ltd. All Rights Reserved.
This product contains code developed at EMQ Technologies Co., Ltd. This product contains code developed at EMQ Technologies Co., Ltd.

View File

@ -1,4 +1,4 @@
# EMQ X Broker # EMQX Broker
[![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases) [![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases)
[![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx) [![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx)
@ -13,20 +13,20 @@
[English](./README.md) | 简体中文 | [日本語](./README-JP.md) | [русский](./README-RU.md) [English](./README.md) | 简体中文 | [日本語](./README-JP.md) | [русский](./README-RU.md)
*EMQ X* 是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,适用于 IoT、M2M 和移动应用程序,可处理千万级别的并发客户端。 *EMQX* 是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,适用于 IoT、M2M 和移动应用程序,可处理千万级别的并发客户端。
从 3.0 版本开始,*EMQ X* 完整支持 MQTT V5.0 协议规范,向下兼容 MQTT V3.1 和 V3.1.1,并支持 MQTT-SN、CoAP、LwM2M、WebSocket 和 STOMP 等通信协议。EMQ X 3.0 单集群可支持千万级别的 MQTT 并发连接。 从 3.0 版本开始,*EMQX* 完整支持 MQTT V5.0 协议规范,向下兼容 MQTT V3.1 和 V3.1.1,并支持 MQTT-SN、CoAP、LwM2M、WebSocket 和 STOMP 等通信协议。EMQX 3.0 单集群可支持千万级别的 MQTT 并发连接。
- 新功能的完整列表,请参阅 [EMQ X Release Notes](https://github.com/emqx/emqx/releases)。 - 新功能的完整列表,请参阅 [EMQX Release Notes](https://github.com/emqx/emqx/releases)。
- 获取更多信息,请访问 [EMQ X 官网](https://www.emqx.cn/)。 - 获取更多信息,请访问 [EMQX 官网](https://www.emqx.cn/)。
## 安装 ## 安装
*EMQ X* 是跨平台的,支持 Linux、Unix、macOS 以及 Windows。这意味着 *EMQ X* 可以部署在 x86_64 架构的服务器上,也可以部署在 Raspberry Pi 这样的 ARM 设备上。 *EMQX* 是跨平台的,支持 Linux、Unix、macOS 以及 Windows。这意味着 *EMQX* 可以部署在 x86_64 架构的服务器上,也可以部署在 Raspberry Pi 这样的 ARM 设备上。
Windows 上编译和运行 *EMQ X* 的详情参考:[Windows.md](./Windows.md) Windows 上编译和运行 *EMQX* 的详情参考:[Windows.md](./Windows.md)
#### EMQ X Docker 镜像安装 #### EMQX Docker 镜像安装
``` ```
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
@ -34,14 +34,14 @@ docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p
#### 二进制软件包安装 #### 二进制软件包安装
需从 [EMQ X 下载](https://www.emqx.cn/downloads) 页面获取相应操作系统的二进制软件包。 需从 [EMQX 下载](https://www.emqx.cn/downloads) 页面获取相应操作系统的二进制软件包。
- [单节点安装文档](https://docs.emqx.cn/broker/latest/getting-started/install.html) - [单节点安装文档](https://docs.emqx.cn/broker/latest/getting-started/install.html)
- [集群配置文档](https://docs.emqx.cn/broker/latest/advanced/cluster.html) - [集群配置文档](https://docs.emqx.cn/broker/latest/advanced/cluster.html)
## 从源码构建 ## 从源码构建
3.0 版本开始,构建 *EMQ X* 需要 Erlang/OTP R21+。 3.0 版本开始,构建 *EMQX* 需要 Erlang/OTP R21+。
4.3 及以后的版本: 4.3 及以后的版本:
@ -77,7 +77,7 @@ _build/emqx/rel/emqx/bin/emqx console
./bin/emqx stop ./bin/emqx stop
``` ```
*EMQ X* 启动,可以使用浏览器访问 http://localhost:18083 来查看 Dashboard。 *EMQX* 启动,可以使用浏览器访问 http://localhost:18083 来查看 Dashboard。
## 测试 ## 测试
@ -108,7 +108,7 @@ DIALYZER_ANALYSE_APP=emqx_lwm2m,emqx_auth_jwt,emqx_auth_ldap make dialyzer
### FAQ ### FAQ
访问 [EMQ X FAQ](https://docs.emqx.cn/broker/latest/faq/faq.html) 以获取常见问题的帮助。 访问 [EMQX FAQ](https://docs.emqx.cn/broker/latest/faq/faq.html) 以获取常见问题的帮助。
### 问答 ### 问答
@ -117,7 +117,7 @@ DIALYZER_ANALYSE_APP=emqx_lwm2m,emqx_auth_jwt,emqx_auth_ldap make dialyzer
### 参与设计 ### 参与设计
如果对 EMQ X 有改进建议,可以向[EIP](https://github.com/emqx/eip) 提交 PR 和 ISSUE 如果对 EMQX 有改进建议,可以向[EIP](https://github.com/emqx/eip) 提交 PR 和 ISSUE
### 插件开发 ### 插件开发

View File

@ -1,4 +1,4 @@
# EMQ X Broker # EMQX Broker
[![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases) [![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases)
[![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx) [![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx)
@ -12,22 +12,22 @@
[English](./README.md) | [简体中文](./README-CN.md) | 日本語 | [русский](./README-RU.md) [English](./README.md) | [简体中文](./README-CN.md) | 日本語 | [русский](./README-RU.md)
*EMQ X* は、高い拡張性と可用性をもつ、分散型のMQTTブローカーです。数千万のクライアントを同時に処理するIoT、M2M、モバイルアプリケーション向けです。 *EMQX* は、高い拡張性と可用性をもつ、分散型のMQTTブローカーです。数千万のクライアントを同時に処理するIoT、M2M、モバイルアプリケーション向けです。
version 3.0 以降、*EMQ X* は MQTT V5.0 の仕様を完全にサポートしており、MQTT V3.1およびV3.1.1とも下位互換性があります。 version 3.0 以降、*EMQX* は MQTT V5.0 の仕様を完全にサポートしており、MQTT V3.1およびV3.1.1とも下位互換性があります。
MQTT-SN、CoAP、LwM2M、WebSocket、STOMPなどの通信プロトコルをサポートしています。 MQTTの同時接続数は1つのクラスター上で1,000万以上にまでスケールできます。 MQTT-SN、CoAP、LwM2M、WebSocket、STOMPなどの通信プロトコルをサポートしています。 MQTTの同時接続数は1つのクラスター上で1,000万以上にまでスケールできます。
- 新機能の一覧については、[EMQ Xリリースート](https://github.com/emqx/emqx/releases)を参照してください。 - 新機能の一覧については、[EMQXリリースート](https://github.com/emqx/emqx/releases)を参照してください。
- 詳細はこちら[EMQ X公式ウェブサイト](https://www.emqx.io/)をご覧ください。 - 詳細はこちら[EMQX公式ウェブサイト](https://www.emqx.io/)をご覧ください。
## インストール ## インストール
*EMQ X* はクロスプラットフォームで、Linux、Unix、macOS、Windowsをサポートしています。 *EMQX* はクロスプラットフォームで、Linux、Unix、macOS、Windowsをサポートしています。
そのため、x86_64アーキテクチャサーバー、またはRaspberryPiなどのARMデバイスに *EMQ X* をデプロイすることもできます。 そのため、x86_64アーキテクチャサーバー、またはRaspberryPiなどのARMデバイスに *EMQX* をデプロイすることもできます。
Windows上における *EMQ X* のビルドと実行については、[Windows.md](./Windows.md)をご参照ください。 Windows上における *EMQX* のビルドと実行については、[Windows.md](./Windows.md)をご参照ください。
#### Docker イメージによる EMQ X のインストール #### Docker イメージによる EMQX のインストール
``` ```
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
@ -35,14 +35,14 @@ docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p
#### バイナリパッケージによるインストール #### バイナリパッケージによるインストール
それぞれのOSに対応したバイナリソフトウェアパッケージは、[EMQ Xのダウンロード](https://www.emqx.io/downloads)ページから取得できます。 それぞれのOSに対応したバイナリソフトウェアパッケージは、[EMQXのダウンロード](https://www.emqx.io/downloads)ページから取得できます。
- [シングルノードインストール](https://docs.emqx.io/broker/latest/en/getting-started/installation.html) - [シングルノードインストール](https://docs.emqx.io/broker/latest/en/getting-started/installation.html)
- [マルチノードインストール](https://docs.emqx.io/broker/latest/en/advanced/cluster.html) - [マルチノードインストール](https://docs.emqx.io/broker/latest/en/advanced/cluster.html)
## ソースからビルド ## ソースからビルド
version 3.0 以降の *EMQ X* をビルドするには Erlang/OTP R21+ が必要です。 version 3.0 以降の *EMQX* をビルドするには Erlang/OTP R21+ が必要です。
version 4.3 以降の場合: version 4.3 以降の場合:
@ -71,7 +71,7 @@ emqx をソースコードからビルドした場合は、
./bin/emqx stop ./bin/emqx stop
``` ```
*EMQ X* の起動後、ブラウザで http://localhost:18083 にアクセスするとダッシュボードが表示されます。 *EMQX* の起動後、ブラウザで http://localhost:18083 にアクセスするとダッシュボードが表示されます。
## テスト ## テスト
@ -102,7 +102,7 @@ DIALYZER_ANALYSE_APP=emqx_lwm2m,emqx_auth_jwt,emqx_auth_ldap make dialyzer
### FAQ ### FAQ
よくある質問については、[EMQ X FAQ](https://docs.emqx.io/broker/latest/en/faq/faq.html)をご確認ください。 よくある質問については、[EMQX FAQ](https://docs.emqx.io/broker/latest/en/faq/faq.html)をご確認ください。
### 質問する ### 質問する

View File

@ -1,4 +1,4 @@
# Брокер EMQ X # Брокер EMQX
[![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases) [![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases)
[![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx) [![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx)
@ -13,20 +13,20 @@
[English](./README.md) | [简体中文](./README-CN.md) | [日本語](./README-JP.md) | русский [English](./README.md) | [简体中文](./README-CN.md) | [日本語](./README-JP.md) | русский
*EMQ X* — это масштабируемый, высоко доступный, распределённый MQTT брокер с полностью открытым кодом для интернета вещей, межмашинного взаимодействия и мобильных приложений, который поддерживает миллионы одновременных подключений. *EMQX* — это масштабируемый, высоко доступный, распределённый MQTT брокер с полностью открытым кодом для интернета вещей, межмашинного взаимодействия и мобильных приложений, который поддерживает миллионы одновременных подключений.
Начиная с релиза 3.0, брокер *EMQ X* полностью поддерживает протокол MQTT версии 5.0, и обратно совместим с версиями 3.1 и 3.1.1, а также протоколами MQTT-SN, CoAP, LwM2M, WebSocket и STOMP. Начиная с релиза 3.0, брокер *EMQ X* может масштабироваться до более чем 10 миллионов одновременных MQTT соединений на один кластер. Начиная с релиза 3.0, брокер *EMQX* полностью поддерживает протокол MQTT версии 5.0, и обратно совместим с версиями 3.1 и 3.1.1, а также протоколами MQTT-SN, CoAP, LwM2M, WebSocket и STOMP. Начиная с релиза 3.0, брокер *EMQX* может масштабироваться до более чем 10 миллионов одновременных MQTT соединений на один кластер.
- Полный список возможностей доступен по ссылке: [EMQ X Release Notes](https://github.com/emqx/emqx/releases). - Полный список возможностей доступен по ссылке: [EMQX Release Notes](https://github.com/emqx/emqx/releases).
- Более подробная информация доступна на нашем сайте: [EMQ X homepage](https://www.emqx.io). - Более подробная информация доступна на нашем сайте: [EMQX homepage](https://www.emqx.io).
## Установка ## Установка
Брокер *EMQ X* кросплатформенный, и поддерживает Linux, Unix, macOS и Windows. Он может работать на серверах с архитектурой x86_64 и устройствах на архитектуре ARM, таких как Raspberry Pi. Брокер *EMQX* кросплатформенный, и поддерживает Linux, Unix, macOS и Windows. Он может работать на серверах с архитектурой x86_64 и устройствах на архитектуре ARM, таких как Raspberry Pi.
Более подробная информация о запуске на Windows по ссылке: [Windows.md](./Windows.md) Более подробная информация о запуске на Windows по ссылке: [Windows.md](./Windows.md)
#### Установка EMQ X с помощью Docker-образа #### Установка EMQX с помощью Docker-образа
``` ```
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
@ -34,7 +34,7 @@ docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p
#### Установка бинарного пакета #### Установка бинарного пакета
Сборки для различных операционных систем: [Загрузить EMQ X](https://www.emqx.io/downloads). Сборки для различных операционных систем: [Загрузить EMQX](https://www.emqx.io/downloads).
- [Установка на одном сервере](https://docs.emqx.io/en/broker/latest/getting-started/install.html) - [Установка на одном сервере](https://docs.emqx.io/en/broker/latest/getting-started/install.html)
- [Установка на кластере](https://docs.emqx.io/en/broker/latest/advanced/cluster.html) - [Установка на кластере](https://docs.emqx.io/en/broker/latest/advanced/cluster.html)
@ -111,7 +111,7 @@ DIALYZER_ANALYSE_APP=emqx_lwm2m,emqx_auth_jwt,emqx_auth_ldap make dialyzer
### FAQ ### FAQ
Наиболее частые проблемы разобраны в [EMQ X FAQ](https://docs.emqx.io/en/broker/latest/faq/faq.html). Наиболее частые проблемы разобраны в [EMQX FAQ](https://docs.emqx.io/en/broker/latest/faq/faq.html).
### Вопросы ### Вопросы

View File

@ -1,4 +1,4 @@
# EMQ X Broker # EMQX Broker
[![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases) [![GitHub Release](https://img.shields.io/github/release/emqx/emqx?color=brightgreen)](https://github.com/emqx/emqx/releases)
[![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx) [![Build Status](https://travis-ci.org/emqx/emqx.svg)](https://travis-ci.org/emqx/emqx)
@ -12,20 +12,20 @@
English | [简体中文](./README-CN.md) | [日本語](./README-JP.md) | [русский](./README-RU.md) English | [简体中文](./README-CN.md) | [日本語](./README-JP.md) | [русский](./README-RU.md)
*EMQ X* broker 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. *EMQX* broker 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. Starting from 3.0 release, *EMQX* 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 *EMQX* broker can scaled to 10+ million concurrent MQTT connections on one cluster.
- For full list of new features, please read [EMQ X Release Notes](https://github.com/emqx/emqx/releases). - For full list of new features, please read [EMQX Release Notes](https://github.com/emqx/emqx/releases).
- For more information, please visit [EMQ X homepage](https://www.emqx.io). - For more information, please visit [EMQX homepage](https://www.emqx.io).
## Installation ## Installation
The *EMQ X* broker is cross-platform, which supports Linux, Unix, macOS and Windows. It means *EMQ X* can be deployed on x86_64 architecture servers and ARM devices like Raspberry Pi. The *EMQX* broker is cross-platform, which supports Linux, Unix, macOS and Windows. It means *EMQX* can be deployed on x86_64 architecture servers and ARM devices like Raspberry Pi.
See more details for building and running *EMQ X* on Windows in [Windows.md](./Windows.md) See more details for building and running *EMQX* on Windows in [Windows.md](./Windows.md)
#### Installing via EMQ X Docker Image #### Installing via EMQX Docker Image
``` ```
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
@ -33,7 +33,7 @@ docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p
#### Installing via Binary Package #### Installing via Binary Package
Get the binary package of the corresponding OS from [EMQ X Download](https://www.emqx.io/downloads) page. Get the binary package of the corresponding OS from [EMQX Download](https://www.emqx.io/downloads) page.
- [Single Node Install](https://docs.emqx.io/en/broker/latest/getting-started/install.html) - [Single Node Install](https://docs.emqx.io/en/broker/latest/getting-started/install.html)
- [Multi Node Install](https://docs.emqx.io/en/broker/latest/advanced/cluster.html) - [Multi Node Install](https://docs.emqx.io/en/broker/latest/advanced/cluster.html)
@ -41,7 +41,7 @@ Get the binary package of the corresponding OS from [EMQ X Download](https://www
## Build From Source ## Build From Source
The *EMQ X* broker requires Erlang/OTP R21+ to build since 3.0 release. The *EMQX* broker requires Erlang/OTP R21+ to build since 3.0 release.
For 4.3 and later versions. For 4.3 and later versions.
@ -110,7 +110,7 @@ DIALYZER_ANALYSE_APP=emqx_lwm2m,emqx_auth_jwt,emqx_auth_ldap make dialyzer
### FAQ ### FAQ
Visiting [EMQ X FAQ](https://docs.emqx.io/en/broker/latest/faq/faq.html) to get help of common problems. Visiting [EMQX FAQ](https://docs.emqx.io/en/broker/latest/faq/faq.html) to get help of common problems.
### Questions ### Questions

View File

@ -1,4 +1,4 @@
# Build and run EMQ X on Windows # Build and run EMQX on Windows
NOTE: The instructions and examples are based on Windows 10. NOTE: The instructions and examples are based on Windows 10.
@ -6,7 +6,7 @@ NOTE: The instructions and examples are based on Windows 10.
### Visual studio for C/C++ compile and link ### Visual studio for C/C++ compile and link
EMQ X includes Erlang NIF (Native Implmented Function) components, implemented EMQX includes Erlang NIF (Native Implmented Function) components, implemented
in C/C++. To compile and link C/C++ libraries, the easiest way is perhaps to in C/C++. To compile and link C/C++ libraries, the easiest way is perhaps to
install Visual Studio. install Visual Studio.
@ -51,7 +51,7 @@ Eshell V12.2.1 (abort with ^G)
### bash ### bash
All EMQ X build/run scripts are either in `bash` or `escript`. All EMQX build/run scripts are either in `bash` or `escript`.
`escript` is installed as a part of Erlang. To install a `bash` `escript` is installed as a part of Erlang. To install a `bash`
environment in Windows, there are quite a few options. environment in Windows, there are quite a few options.
@ -68,7 +68,7 @@ Cygwin is what we tested with.
### Other tools ### Other tools
Some of the unix world tools are required to build EMQ X. Including: Some of the unix world tools are required to build EMQX. Including:
* git * git
* curl * curl
@ -84,7 +84,7 @@ When using scoop:
scoop install git curl make jq zip unzip scoop install git curl make jq zip unzip
``` ```
## Build EMQ X source code ## Build EMQX source code
* Clone the repo: `git clone https://github.com/emqx/emqx.git` * Clone the repo: `git clone https://github.com/emqx/emqx.git`
@ -112,11 +112,11 @@ scoop install git curl make jq zip unzip
To fix it, Visual Studio's bin paths should be ordered prior to Cygwin's (or similar installation's) To fix it, Visual Studio's bin paths should be ordered prior to Cygwin's (or similar installation's)
bin paths in `Path` environment variable. bin paths in `Path` environment variable.
## Run EMQ X ## Run EMQX
To start EMQ X broker. To start EMQX broker.
Execute `_build\emqx\rel\emqx>.\bin\emqx console` or `_build\emqx\rel\emqx>.\bin\emqx start` to start EMQ X. Execute `_build\emqx\rel\emqx>.\bin\emqx console` or `_build\emqx\rel\emqx>.\bin\emqx start` to start EMQX.
Then execute `_build\emqx\rel\emqx>.\bin\emqx_ctl status` to check status. Then execute `_build\emqx\rel\emqx>.\bin\emqx_ctl status` to check status.
If everything works fine, it should print out If everything works fine, it should print out

View File

@ -1,7 +1,7 @@
emqx_auth_http emqx_auth_http
============== ==============
EMQ X HTTP Auth/ACL Plugin EMQX HTTP Auth/ACL Plugin
Build Build
----- -----
@ -96,5 +96,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,7 +1,7 @@
# emqx-auth-jwt # emqx-auth-jwt
EMQ X JWT Authentication Plugin EMQX JWT Authentication Plugin
Build Build
----- -----
@ -87,4 +87,4 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,7 +1,7 @@
emqx_auth_ldap emqx_auth_ldap
============== ==============
EMQ X LDAP Authentication Plugin EMQX LDAP Authentication Plugin
Build Build
----- -----
@ -92,5 +92,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,7 +1,7 @@
emqx_auth_mongo emqx_auth_mongo
=============== ===============
EMQ X Authentication/ACL with MongoDB EMQX Authentication/ACL with MongoDB
Build the Plugin Build the Plugin
---------------- ----------------
@ -188,5 +188,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -164,4 +164,4 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -179,5 +179,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,7 +1,7 @@
emqx_auth_redis emqx_auth_redis
=============== ===============
EMQ X Redis Authentication/ACL Plugin EMQX Redis Authentication/ACL Plugin
Features Features
--------- ---------
@ -167,5 +167,5 @@ Load Plugin
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,13 +1,13 @@
# EMQ Bridge MQTT # EMQ Bridge MQTT
The concept of **Bridge** means that EMQ X supports forwarding messages The concept of **Bridge** means that EMQX supports forwarding messages
of one of its own topics to another MQTT Broker in some way. of one of its own topics to another MQTT Broker in some way.
**Bridge** differs from **Cluster** in that the bridge does not **Bridge** differs from **Cluster** in that the bridge does not
replicate the topic trie and routing tables and only forwards MQTT replicate the topic trie and routing tables and only forwards MQTT
messages based on bridging rules. messages based on bridging rules.
At present, the bridging methods supported by EMQ X are as follows: At present, the bridging methods supported by EMQX are as follows:
- RPC bridge: RPC Bridge only supports message forwarding and does not - RPC bridge: RPC Bridge only supports message forwarding and does not
support subscribing to the topic of remote nodes to synchronize support subscribing to the topic of remote nodes to synchronize
@ -19,7 +19,7 @@ These concepts are shown below:
![bridge](docs/images/bridge.png) ![bridge](docs/images/bridge.png)
In addition, the EMQ X message broker supports multi-node bridge mode interconnection In addition, the EMQX message broker supports multi-node bridge mode interconnection
``` ```
--------- --------- --------- --------- --------- ---------
@ -27,7 +27,7 @@ Publisher --> | Node1 | --Bridge Forward--> | Node2 | --Bridge Forward--> | Node
--------- --------- --------- --------- --------- ---------
``` ```
In EMQ X, bridge is configured by modifying `etc/emqx.conf`. EMQ X distinguishes between different bridges based on different names. E.g In EMQX, bridge is configured by modifying `etc/emqx.conf`. EMQX distinguishes between different bridges based on different names. E.g
``` ```
## Bridge address: node name for local bridge, host:port for remote. ## Bridge address: node name for local bridge, host:port for remote.
@ -38,7 +38,7 @@ This configuration declares a bridge named `aws` and specifies that it is bridge
In case of creating multiple bridges, it is convenient to replicate all configuration items of the first bridge, and modify the bridge name and other configuration items if necessary (such as bridge.$name.address, where $name refers to the name of bridge) In case of creating multiple bridges, it is convenient to replicate all configuration items of the first bridge, and modify the bridge name and other configuration items if necessary (such as bridge.$name.address, where $name refers to the name of bridge)
The next two sections describe how to create a bridge in RPC and MQTT mode respectively and create a forwarding rule that forwards the messages from sensors. Assuming that two EMQ X nodes are running on two hosts: The next two sections describe how to create a bridge in RPC and MQTT mode respectively and create a forwarding rule that forwards the messages from sensors. Assuming that two EMQX nodes are running on two hosts:
| Name | Node | MQTT Port | | Name | Node | MQTT Port |
@ -47,7 +47,7 @@ The next two sections describe how to create a bridge in RPC and MQTT mode respe
| emqx2| emqx2@192.168.1.2 | 1883 | | emqx2| emqx2@192.168.1.2 | 1883 |
## EMQ X RPC Bridge Configuration ## EMQX RPC Bridge Configuration
The following is the basic configuration of RPC bridging. A simplest RPC bridging only requires the following three items The following is the basic configuration of RPC bridging. A simplest RPC bridging only requires the following three items
@ -72,13 +72,13 @@ Limitations of RPC bridging:
1. The RPC bridge of emqx can only forward local messages to the remote node, and cannot synchronize the messages of the remote node to the local node; 1. The RPC bridge of emqx can only forward local messages to the remote node, and cannot synchronize the messages of the remote node to the local node;
2. RPC bridge can only bridge two EMQ X broker together and cannot bridge EMQ X broker to other MQTT brokers. 2. RPC bridge can only bridge two EMQX broker together and cannot bridge EMQX broker to other MQTT brokers.
## EMQ X MQTT Bridge Configuration ## EMQX MQTT Bridge Configuration
EMQ X 3.0 officially introduced MQTT bridge, so that EMQ X can bridge any MQTT broker. Because of the characteristics of the MQTT protocol, EMQ X can subscribe to the remote mqtt broker's topic through MQTT bridge, and then synchronize the remote MQTT broker's message to the local. EMQX 3.0 officially introduced MQTT bridge, so that EMQX can bridge any MQTT broker. Because of the characteristics of the MQTT protocol, EMQX can subscribe to the remote mqtt broker's topic through MQTT bridge, and then synchronize the remote MQTT broker's message to the local.
EMQ X MQTT bridging principle: Create an MQTT client on the EMQ X broker, and connect this MQTT client to the remote MQTT broker. Therefore, in the MQTT bridge configuration, following fields may be set for the EMQ X to connect to the remote broker as an mqtt client EMQX MQTT bridging principle: Create an MQTT client on the EMQX broker, and connect this MQTT client to the remote MQTT broker. Therefore, in the MQTT bridge configuration, following fields may be set for the EMQX to connect to the remote broker as an mqtt client
``` ```
## Bridge Address: Use node name for rpc bridging, use host:port for mqtt connection ## Bridge Address: Use node name for rpc bridging, use host:port for mqtt connection
@ -159,7 +159,7 @@ bridge.mqtt.emqx2.max_inflight_batches = 32
## Bridge Cache Configuration ## Bridge Cache Configuration
The bridge of EMQ X has a message caching mechanism. The caching mechanism is applicable to both RPC bridging and MQTT bridging. When the bridge is disconnected (such as when the network connection is unstable), the messages with a topic specified in `forwards` can be cached to the local message queue. Until the bridge is restored, these messages are re-forwarded to the remote node. The configuration of the cache queue is as follows The bridge of EMQX has a message caching mechanism. The caching mechanism is applicable to both RPC bridging and MQTT bridging. When the bridge is disconnected (such as when the network connection is unstable), the messages with a topic specified in `forwards` can be cached to the local message queue. Until the bridge is restored, these messages are re-forwarded to the remote node. The configuration of the cache queue is as follows
``` ```
## emqx_bridge internal number of messages used for batch ## emqx_bridge internal number of messages used for batch
@ -179,9 +179,9 @@ bridge.mqtt.emqx2.queue.replayq_seg_bytes = 10MB
`bridge.mqtt.emqx2.queue.replayq_seg_bytes` is used to specify the size of the largest single file of the message queue that is cached on disk. If the message queue size exceeds the specified value, a new file is created to store the message queue. `bridge.mqtt.emqx2.queue.replayq_seg_bytes` is used to specify the size of the largest single file of the message queue that is cached on disk. If the message queue size exceeds the specified value, a new file is created to store the message queue.
## CLI for EMQ X Bridge MQTT ## CLI for EMQX Bridge MQTT
CLI for EMQ X Bridge MQTT: CLI for EMQX Bridge MQTT:
``` bash ``` bash
$ cd emqx1/ && ./bin/emqx_ctl bridges $ cd emqx1/ && ./bin/emqx_ctl bridges

View File

@ -2,14 +2,14 @@
EMQ Bridge MQTT EMQ Bridge MQTT
=============== ===============
The concept of **Bridge** means that EMQ X supports forwarding messages The concept of **Bridge** means that EMQX supports forwarding messages
of one of its own topics to another MQTT Broker in some way. of one of its own topics to another MQTT Broker in some way.
**Bridge** differs from **Cluster** in that the bridge does not **Bridge** differs from **Cluster** in that the bridge does not
replicate the topic trie and routing tables and only forwards MQTT replicate the topic trie and routing tables and only forwards MQTT
messages based on bridging rules. messages based on bridging rules.
At present, the bridging methods supported by EMQ X are as follows: At present, the bridging methods supported by EMQX are as follows:
* RPC bridge: RPC Bridge only supports message forwarding and does not * RPC bridge: RPC Bridge only supports message forwarding and does not
@ -26,7 +26,7 @@ These concepts are shown below:
:alt: bridge :alt: bridge
In addition, the EMQ X message broker supports multi-node bridge mode interconnection In addition, the EMQX message broker supports multi-node bridge mode interconnection
.. code-block:: .. code-block::
@ -34,7 +34,7 @@ In addition, the EMQ X message broker supports multi-node bridge mode interconne
Publisher --> | Node1 | --Bridge Forward--> | Node2 | --Bridge Forward--> | Node3 | --> Subscriber Publisher --> | Node1 | --Bridge Forward--> | Node2 | --Bridge Forward--> | Node3 | --> Subscriber
--------- --------- --------- --------- --------- ---------
In EMQ X, bridge is configured by modifying ``etc/emqx.conf``. EMQ X distinguishes between different bridges based on different names. E.g In EMQX, bridge is configured by modifying ``etc/emqx.conf``. EMQX distinguishes between different bridges based on different names. E.g
.. code-block:: .. code-block::
@ -45,7 +45,7 @@ This configuration declares a bridge named ``aws`` and specifies that it is brid
In case of creating multiple bridges, it is convenient to replicate all configuration items of the first bridge, and modify the bridge name and other configuration items if necessary (such as bridge.$name.address, where $name refers to the name of bridge) In case of creating multiple bridges, it is convenient to replicate all configuration items of the first bridge, and modify the bridge name and other configuration items if necessary (such as bridge.$name.address, where $name refers to the name of bridge)
The next two sections describe how to create a bridge in RPC and MQTT mode respectively and create a forwarding rule that forwards the messages from sensors. Assuming that two EMQ X nodes are running on two hosts: The next two sections describe how to create a bridge in RPC and MQTT mode respectively and create a forwarding rule that forwards the messages from sensors. Assuming that two EMQX nodes are running on two hosts:
.. list-table:: .. list-table::
:header-rows: 1 :header-rows: 1
@ -61,7 +61,7 @@ The next two sections describe how to create a bridge in RPC and MQTT mode respe
- 1883 - 1883
EMQ X RPC Bridge Configuration EMQX RPC Bridge Configuration
------------------------------ ------------------------------
The following is the basic configuration of RPC bridging. A simplest RPC bridging only requires the following three items The following is the basic configuration of RPC bridging. A simplest RPC bridging only requires the following three items
@ -90,14 +90,14 @@ Limitations of RPC bridging:
The RPC bridge of emqx can only forward local messages to the remote node, and cannot synchronize the messages of the remote node to the local node; The RPC bridge of emqx can only forward local messages to the remote node, and cannot synchronize the messages of the remote node to the local node;
#. #.
RPC bridge can only bridge two EMQ X broker together and cannot bridge EMQ X broker to other MQTT brokers. RPC bridge can only bridge two EMQX broker together and cannot bridge EMQX broker to other MQTT brokers.
EMQ X MQTT Bridge Configuration EMQX MQTT Bridge Configuration
------------------------------- -------------------------------
EMQ X 3.0 officially introduced MQTT bridge, so that EMQ X can bridge any MQTT broker. Because of the characteristics of the MQTT protocol, EMQ X can subscribe to the remote mqtt broker's topic through MQTT bridge, and then synchronize the remote MQTT broker's message to the local. EMQX 3.0 officially introduced MQTT bridge, so that EMQX can bridge any MQTT broker. Because of the characteristics of the MQTT protocol, EMQX can subscribe to the remote mqtt broker's topic through MQTT bridge, and then synchronize the remote MQTT broker's message to the local.
EMQ X MQTT bridging principle: Create an MQTT client on the EMQ X broker, and connect this MQTT client to the remote MQTT broker. Therefore, in the MQTT bridge configuration, following fields may be set for the EMQ X to connect to the remote broker as an mqtt client EMQX MQTT bridging principle: Create an MQTT client on the EMQX broker, and connect this MQTT client to the remote MQTT broker. Therefore, in the MQTT bridge configuration, following fields may be set for the EMQX to connect to the remote broker as an mqtt client
.. code-block:: .. code-block::
@ -179,7 +179,7 @@ EMQ X MQTT bridging principle: Create an MQTT client on the EMQ X broker, and co
Bridge Cache Configuration Bridge Cache Configuration
-------------------------- --------------------------
The bridge of EMQ X has a message caching mechanism. The caching mechanism is applicable to both RPC bridging and MQTT bridging. When the bridge is disconnected (such as when the network connection is unstable), the messages with a topic specified in ``forwards`` can be cached to the local message queue. Until the bridge is restored, these messages are re-forwarded to the remote node. The configuration of the cache queue is as follows The bridge of EMQX has a message caching mechanism. The caching mechanism is applicable to both RPC bridging and MQTT bridging. When the bridge is disconnected (such as when the network connection is unstable), the messages with a topic specified in ``forwards`` can be cached to the local message queue. Until the bridge is restored, these messages are re-forwarded to the remote node. The configuration of the cache queue is as follows
.. code-block:: .. code-block::
@ -199,10 +199,10 @@ The bridge of EMQ X has a message caching mechanism. The caching mechanism is ap
``bridge.mqtt.emqx2.queue.replayq_seg_bytes`` is used to specify the size of the largest single file of the message queue that is cached on disk. If the message queue size exceeds the specified value, a new file is created to store the message queue. ``bridge.mqtt.emqx2.queue.replayq_seg_bytes`` is used to specify the size of the largest single file of the message queue that is cached on disk. If the message queue size exceeds the specified value, a new file is created to store the message queue.
CLI for EMQ X Bridge MQTT CLI for EMQX Bridge MQTT
------------------------- -------------------------
CLI for EMQ X Bridge MQTT: CLI for EMQX Bridge MQTT:
.. code-block:: bash .. code-block:: bash

View File

@ -1,6 +1,6 @@
{application, emqx_bridge_mqtt, {application, emqx_bridge_mqtt,
[{description, "EMQ X Bridge to MQTT Broker"}, [{description, "EMQ X Bridge to MQTT Broker"},
{vsn, "4.3.3"}, % strict semver, bump manually! {vsn, "4.3.4"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, []}, {registered, []},
{applications, [kernel,stdlib,replayq,emqtt]}, {applications, [kernel,stdlib,replayq,emqtt]},

View File

@ -1,21 +1,31 @@
%% -*-: erlang -*- %% -*-: erlang -*-
{"4.3.3", {"4.3.4",
[ [
{<<"4.3.3">>, [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []}
]},
{<<"4.3.[1-2]">>, [ {<<"4.3.[1-2]">>, [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []}
]}, ]},
{"4.3.0", [ {"4.3.0", [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_worker, brutal_purge, soft_purge, []}, {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []}
]}, ]},
{<<".*">>, []} {<<".*">>, []}
], ],
[ [
{<<"4.3.3">>, [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []}
]},
{<<"4.3.[1-2]">>, [ {<<"4.3.[1-2]">>, [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []}
]}, ]},
{"4.3.0", [ {"4.3.0", [
{load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_worker, brutal_purge, soft_purge, []}, {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []},
{load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []}
]}, ]},

View File

@ -144,7 +144,7 @@ send(#{client_pid := ClientPid} = Conn, [Msg | Rest], PktIds) ->
{ok, PktId} -> {ok, PktId} ->
send(Conn, Rest, [PktId | PktIds]); send(Conn, Rest, [PktId | PktIds]);
{error, Reason} -> {error, Reason} ->
%% NOTE: There is no partial sucess of a batch and recover from the middle %% NOTE: There is no partial success of a batch and recover from the middle
%% only to retry all messages in one batch %% only to retry all messages in one batch
{error, Reason} {error, Reason}
end. end.
@ -154,7 +154,7 @@ handle_puback(#{packet_id := PktId, reason_code := RC}, Parent)
RC =:= ?RC_NO_MATCHING_SUBSCRIBERS -> RC =:= ?RC_NO_MATCHING_SUBSCRIBERS ->
Parent ! {batch_ack, PktId}, ok; Parent ! {batch_ack, PktId}, ok;
handle_puback(#{packet_id := PktId, reason_code := RC}, _Parent) -> handle_puback(#{packet_id := PktId, reason_code := RC}, _Parent) ->
?LOG(warning, "Publish ~p to remote node falied, reason_code: ~p", [PktId, RC]). ?LOG(warning, "Publish ~p to remote node failed, reason_code: ~p", [PktId, RC]).
handle_publish(Msg, Mountpoint) -> handle_publish(Msg, Mountpoint) ->
emqx_broker:publish(emqx_bridge_msg:to_broker_msg(Msg, Mountpoint)). emqx_broker:publish(emqx_bridge_msg:to_broker_msg(Msg, Mountpoint)).

View File

@ -1,7 +1,7 @@
# emqx-coap # emqx-coap
emqx-coap is a CoAP Gateway for EMQ X Broker. It translates CoAP messages into MQTT messages and make it possible to communiate between CoAP clients and MQTT clients. emqx-coap is a CoAP Gateway for EMQX Broker. It translates CoAP messages into MQTT messages and make it possible to communiate between CoAP clients and MQTT clients.
### Client Usage Example ### Client Usage Example
libcoap is an excellent coap library which has a simple client tool. It is recommended to use libcoap as a coap client. libcoap is an excellent coap library which has a simple client tool. It is recommended to use libcoap as a coap client.
@ -252,5 +252,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,6 +1,6 @@
# emqx_exhook # emqx_exhook
The `emqx_exhook` extremly enhance the extensibility for EMQ X. It allow using an others programming language to mount the hooks intead of erlang. The `emqx_exhook` extremly enhance the extensibility for EMQX. It allow using an others programming language to mount the hooks intead of erlang.
## Feature ## Feature
@ -10,7 +10,7 @@ The `emqx_exhook` extremly enhance the extensibility for EMQ X. It allow using a
## Architecture ## Architecture
``` ```
EMQ X Third-party Runtime EMQX Third-party Runtime
+========================+ +========+==========+ +========================+ +========+==========+
| ExHook | | | | | ExHook | | | |
| +----------------+ | gRPC | gRPC | User's | | +----------------+ | gRPC | gRPC | User's |

View File

@ -2,7 +2,7 @@
## 动机 ## 动机
在 EMQ X Broker v4.1-v4.2 中,我们发布了 2 个插件来扩展 emqx 的编程能力: 在 EMQX Broker v4.1-v4.2 中,我们发布了 2 个插件来扩展 emqx 的编程能力:
1. `emqx-extension-hook` 提供了使用 Java, Python 向 Broker 挂载钩子的功能 1. `emqx-extension-hook` 提供了使用 Java, Python 向 Broker 挂载钩子的功能
2. `emqx-exproto` 提供了使用 JavaPython 编写用户自定义协议接入插件的功能 2. `emqx-exproto` 提供了使用 JavaPython 编写用户自定义协议接入插件的功能
@ -26,7 +26,7 @@
架构如下: 架构如下:
``` ```
EMQ X EMQX
+========================+ +========+==========+ +========================+ +========+==========+
| ExHook | | | | | ExHook | | | |
| +----------------+ | gRPC | gRPC | User's | | +----------------+ | gRPC | gRPC | User's |

View File

@ -1,6 +1,6 @@
# emqx-exproto # emqx-exproto
The `emqx_exproto` extremly enhance the extensibility for EMQ X. It allow using an others programming language to **replace the protocol handling layer in EMQ X Broker**. The `emqx_exproto` extremly enhance the extensibility for EMQX. It allow using an others programming language to **replace the protocol handling layer in EMQX Broker**.
## Feature ## Feature
@ -9,7 +9,7 @@ The `emqx_exproto` extremly enhance the extensibility for EMQ X. It allow using
## Architecture ## Architecture
![EMQ X ExProto Arch](./docs/images/exproto-arch.jpg) ![EMQX ExProto Arch](./docs/images/exproto-arch.jpg)
## Usage ## Usage

View File

@ -2,7 +2,7 @@
`emqx-exproto` 插件用于协议解析的多语言支持。它能够允许其他编程语言例如PythonJava 等)直接处理数据流实现协议的解析,并提供 Pub/Sub 接口以实现与系统其它组件的通信。 `emqx-exproto` 插件用于协议解析的多语言支持。它能够允许其他编程语言例如PythonJava 等)直接处理数据流实现协议的解析,并提供 Pub/Sub 接口以实现与系统其它组件的通信。
该插件给 EMQ X 带来的扩展性十分的强大,它能以你熟悉语言处理任何的私有协议,并享受由 EMQ X 系统带来的高连接,和高并发的优点。 该插件给 EMQX 带来的扩展性十分的强大,它能以你熟悉语言处理任何的私有协议,并享受由 EMQX 系统带来的高连接,和高并发的优点。
## 特性 ## 特性
@ -25,12 +25,12 @@
- 提供 `Send` 接口。供外部模块调用,**用于发送数据包**。 - 提供 `Send` 接口。供外部模块调用,**用于发送数据包**。
- 提供 `Close` 接口。供外部模块调用,**用于主动关闭连接**。 - 提供 `Close` 接口。供外部模块调用,**用于主动关闭连接**。
2. **协议/会话层:**该部分主要**提供 PUB/SUB 接口**,以实现与 EMQ X Broker 系统的消息互通。包括: 2. **协议/会话层:**该部分主要**提供 PUB/SUB 接口**,以实现与 EMQX Broker 系统的消息互通。包括:
- 提供 `Authenticate` 接口。供外部模块调用,用于向集群注册客户端。 - 提供 `Authenticate` 接口。供外部模块调用,用于向集群注册客户端。
- 提供 `StartTimer` 接口。供外部模块调用,用于为该连接进程启动心跳等定时器。 - 提供 `StartTimer` 接口。供外部模块调用,用于为该连接进程启动心跳等定时器。
- 提供 `Publish` 接口。供外部模块调用,用于发布消息 EMQ X Broker 中。 - 提供 `Publish` 接口。供外部模块调用,用于发布消息 EMQX Broker 中。
- 提供 `Subscribe` 接口。供外部模块调用,用于订阅某主题,以实现从 EMQ X Broker 中接收某些下行消息。 - 提供 `Subscribe` 接口。供外部模块调用,用于订阅某主题,以实现从 EMQX Broker 中接收某些下行消息。
- 提供 `Unsubscribe` 接口。供外部模块调用,用于取消订阅某主题。 - 提供 `Unsubscribe` 接口。供外部模块调用,用于取消订阅某主题。
- 调用 `OnTimerTimeout` 回调。用于处理定时器超时的事件。 - 调用 `OnTimerTimeout` 回调。用于处理定时器超时的事件。
- 调用 `OnReceivedMessages` 回调。用于接收下行消息(在订阅主题成功后,如果主题上有消息,便会回调该方法) - 调用 `OnReceivedMessages` 回调。用于接收下行消息(在订阅主题成功后,如果主题上有消息,便会回调该方法)

View File

@ -334,5 +334,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,5 +1,5 @@
# LwM2M Gateway for the EMQ X Broker. # LwM2M Gateway for the EMQX Broker.
[The LwM2M Specifications](http://www.openmobilealliance.org/release/LightweightM2M) is a Lightweight Machine to Machine protocol. [The LwM2M Specifications](http://www.openmobilealliance.org/release/LightweightM2M) is a Lightweight Machine to Machine protocol.
@ -354,4 +354,4 @@ Apache License Version 2.0
## Author ## Author
EMQ X-Men Team. EMQX-Men Team.

View File

@ -1,7 +1,8 @@
{application,emqx_lwm2m, {application,emqx_lwm2m,
[{description,"EMQ X LwM2M Gateway"}, [{description,"EMQ X LwM2M Gateway"},
{vsn, "4.3.5"}, % strict semver, bump manually! {vsn, "4.3.6"}, % strict semver, bump manually!
{modules,[]}, {modules,[]},
{registered,[emqx_lwm2m_sup]}, {registered,[emqx_lwm2m_sup]},
{applications,[kernel,stdlib,lwm2m_coap]}, {applications,[kernel,stdlib,lwm2m_coap]},
{mod,{emqx_lwm2m_app,[]}}]}. {mod,{emqx_lwm2m_app,[]}}]
}.

View File

@ -4,13 +4,17 @@
[{restart_application,emqx_lwm2m}]}, [{restart_application,emqx_lwm2m}]},
{"4.3.2", {"4.3.2",
[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]},
{"4.3.3",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}, {load_module,emqx_lwm2m_api,brutal_purge,soft_purge,[]}]},
{"4.3.4",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}], {<<"4\\.3\\.[3-5]">>,
[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_lwm2m_api,brutal_purge,soft_purge,[]}]}],
[{<<"4\\.3\\.[0-1]">>, [{<<"4\\.3\\.[0-1]">>,
[{restart_application,emqx_lwm2m}]}, [{restart_application,emqx_lwm2m}]},
{"4.3.2", {"4.3.2",
[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]},
{"4.3.3",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}, {load_module,emqx_lwm2m_api,brutal_purge,soft_purge,[]}]},
{"4.3.4",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}]}. {<<"4\\.3\\.[3-5]">>,
[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_lwm2m_api,brutal_purge,soft_purge,[]}]}]}.

View File

@ -51,7 +51,7 @@
]). ]).
list(#{node := Node }, Params) -> list(#{node := Node }, Params) ->
case Node = node() of case Node =:= node() of
true -> list(#{}, Params); true -> list(#{}, Params);
_ -> rpc_call(Node, list, [#{}, Params]) _ -> rpc_call(Node, list, [#{}, Params])
end; end;
@ -61,7 +61,7 @@ list(#{}, _Params) ->
return({ok, format(Channels)}). return({ok, format(Channels)}).
lookup_cmd(#{ep := Ep, node := Node}, Params) -> lookup_cmd(#{ep := Ep, node := Node}, Params) ->
case Node = node() of case Node =:= node() of
true -> lookup_cmd(#{ep => Ep}, Params); true -> lookup_cmd(#{ep => Ep}, Params);
_ -> rpc_call(Node, lookup_cmd, [#{ep => Ep}, Params]) _ -> rpc_call(Node, lookup_cmd, [#{ep => Ep}, Params])
end; end;

View File

@ -1,7 +1,7 @@
# emqx-management # emqx-management
EMQ X Management API EMQX Management API
## How to Design RESTful API? ## How to Design RESTful API?

View File

@ -1,6 +1,6 @@
{application, emqx_management, {application, emqx_management,
[{description, "EMQ X Management API and CLI"}, [{description, "EMQ X Management API and CLI"},
{vsn, "4.4.1"}, % strict semver, bump manually! {vsn, "4.4.2"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, [emqx_management_sup]}, {registered, [emqx_management_sup]},
{applications, [kernel,stdlib,minirest]}, {applications, [kernel,stdlib,minirest]},

View File

@ -55,6 +55,10 @@
, set_keepalive/2 , set_keepalive/2
]). ]).
-export([ clean_pem_cache/0
, clean_pem_cache/1
]).
%% Internal funcs %% Internal funcs
-export([call_client/3]). -export([call_client/3]).
@ -123,8 +127,6 @@
-define(MAX_ROW_LIMIT, 10000). -define(MAX_ROW_LIMIT, 10000).
-define(APP, emqx_management). -define(APP, emqx_management).
-elvis([{elvis_style, god_modules, disable}]).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Node Info %% Node Info
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
@ -257,15 +259,17 @@ clean_acl_cache(Node, ClientId) ->
rpc_call(Node, clean_acl_cache, [Node, ClientId]). rpc_call(Node, clean_acl_cache, [Node, ClientId]).
clean_acl_cache_all() -> clean_acl_cache_all() ->
Results = [{Node, clean_acl_cache_all(Node)} || Node <- ekka_mnesia:running_nodes()], for_nodes(fun clean_acl_cache_all/1).
case lists:filter(fun({_Node, Item}) -> Item =/= ok end, Results) of
for_nodes(F) ->
Results = [{Node, F(Node)} || Node <- ekka_mnesia:running_nodes()],
case lists:filter(fun({_Node, Res}) -> Res =/= ok end, Results) of
[] -> ok; [] -> ok;
BadNodes -> {error, BadNodes} BadNodes -> {error, BadNodes}
end. end.
clean_acl_cache_all(Node) when Node =:= node() -> clean_acl_cache_all(Node) when Node =:= node() ->
emqx_acl_cache:drain_cache(); emqx_acl_cache:drain_cache();
clean_acl_cache_all(Node) -> clean_acl_cache_all(Node) ->
rpc_call(Node, clean_acl_cache_all, [Node]). rpc_call(Node, clean_acl_cache_all, [Node]).
@ -280,6 +284,15 @@ set_keepalive(ClientId, Interval)when Interval >= 0 andalso Interval =< 65535 ->
set_keepalive(_ClientId, _Interval) -> set_keepalive(_ClientId, _Interval) ->
{error, ?ERROR2, <<"mqtt3.1.1 specification: keepalive must between 0~65535">>}. {error, ?ERROR2, <<"mqtt3.1.1 specification: keepalive must between 0~65535">>}.
clean_pem_cache() ->
for_nodes(fun clean_pem_cache/1).
clean_pem_cache(Node) when Node =:= node() ->
_ = ssl_pem_cache:clear(),
ok;
clean_pem_cache(Node) ->
rpc_call(Node, ?FUNCTION_NAME, [Node]).
%% @private %% @private
call_client(ClientId, Req) -> call_client(ClientId, Req) ->
Results = [call_client(Node, ClientId, Req) || Node <- ekka_mnesia:running_nodes()], Results = [call_client(Node, ClientId, Req) || Node <- ekka_mnesia:running_nodes()],

View File

@ -43,6 +43,7 @@
, mgmt/1 , mgmt/1
, data/1 , data/1
, acl/1 , acl/1
, pem_cache/1
]). ]).
-define(PROC_INFOKEYS, [status, -define(PROC_INFOKEYS, [status,
@ -676,21 +677,11 @@ data(_) ->
%% @doc acl Command %% @doc acl Command
acl(["cache-clean", "node", Node]) -> acl(["cache-clean", "node", Node]) ->
case emqx_mgmt:clean_acl_cache_all(erlang:list_to_existing_atom(Node)) of with_log(fun() -> for_node(fun emqx_mgmt:clean_acl_cache_all/1, Node) end,
ok -> "ACL cache drain start");
emqx_ctl:print("ACL cache drain started on node ~s.~n", [Node]);
{error, Reason} ->
emqx_ctl:print("ACL drain failed on node ~s: ~0p.~n", [Node, Reason])
end;
acl(["cache-clean", "all"]) -> acl(["cache-clean", "all"]) ->
case emqx_mgmt:clean_acl_cache_all() of with_log(fun emqx_mgmt:clean_acl_cache_all/1,
ok -> "ACL cache drain start");
emqx_ctl:print("Started ACL cache drain in all nodes~n");
{error, Reason} ->
emqx_ctl:print("ACL cache-clean failed: ~p.~n", [Reason])
end;
acl(["cache-clean", ClientId]) -> acl(["cache-clean", ClientId]) ->
emqx_mgmt:clean_acl_cache(ClientId); emqx_mgmt:clean_acl_cache(ClientId);
@ -700,6 +691,15 @@ acl(_) ->
{"acl cache-clean <ClientId>", "Clears acl cache for given client"} {"acl cache-clean <ClientId>", "Clears acl cache for given client"}
]). ]).
pem_cache(["clean", "all"]) ->
with_log(fun emqx_mgmt:clean_pem_cache/0, "PEM cache clean");
pem_cache(["clean", "node", Node]) ->
with_log(fun() -> for_node(fun emqx_mgmt:clean_pem_cache/1, Node) end, "PEM cache clean");
pem_cache(_) ->
emqx_ctl:usage([{"pem_cache clean all", "Clears x509 certificate cache on all nodes"},
{"pem_cache clean node <Node>", "Clears x509 certificate cache on given node"}
]).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Dump ETS %% Dump ETS
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
@ -829,3 +829,20 @@ http_mod_name(Name) -> Name.
print_app_info({AppId, AppSecret, Name, Desc, Status, Expired}) -> print_app_info({AppId, AppSecret, Name, Desc, Status, Expired}) ->
emqx_ctl:print("app_id: ~s, secret: ~s, name: ~s, desc: ~s, status: ~s, expired: ~p~n", emqx_ctl:print("app_id: ~s, secret: ~s, name: ~s, desc: ~s, status: ~s, expired: ~p~n",
[AppId, AppSecret, Name, Desc, Status, Expired]). [AppId, AppSecret, Name, Desc, Status, Expired]).
for_node(Fun, Node) ->
try list_to_existing_atom(Node) of
NodeAtom ->
Fun(NodeAtom)
catch
error : badarg ->
{error, unknown_node}
end.
with_log(Fun, Msg) ->
case Fun() of
ok ->
emqx_ctl:print("~s OK~n", [Msg]);
{error, Reason} ->
emqx_ctl:print("~s FAILED~n~p~n", [Msg, Reason])
end.

View File

@ -1,6 +1,6 @@
# emqx-prometheus # emqx-prometheus
EMQ X Prometheus Agent EMQX Prometheus Agent
## push emqx stats/metrics to prometheus PushGateway ## push emqx stats/metrics to prometheus PushGateway
@ -48,7 +48,7 @@ json data
``` ```
## Before EMQ X v4.0.0 ## Before EMQX v4.0.0
The prometheus data simple is: The prometheus data simple is:
@ -279,5 +279,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -2,7 +2,7 @@
emqx-recon emqx-recon
========== ==========
EMQ X Recon Debug/Optimize Plugin EMQX Recon Debug/Optimize Plugin
emqx_recon.conf emqx_recon.conf
----=---------- ----=----------
@ -57,5 +57,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,5 +1,5 @@
EMQ X Retainer EMQX Retainer
============== ==============
The retainer plugin is responsible for storing retained MQTT messages. The retainer plugin is responsible for storing retained MQTT messages.
@ -55,5 +55,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team EMQX Team

View File

@ -1,7 +1,7 @@
# emqx-rule-engine # emqx-rule-engine
IoT Rule Engine for EMQ X Broker. IoT Rule Engine for EMQX Broker.
## Concept ## Concept

View File

@ -1,7 +1,7 @@
# EMQ X Rule Engine # EMQX Rule Engine
This is the design guide of message routing rule engine for the EMQ X Broker. This is the design guide of message routing rule engine for the EMQX Broker.
## Concept ## Concept
@ -149,7 +149,7 @@ The properties and behaviors of resources is defined by resource types. A resour
### Resource Type Provider ### Resource Type Provider
Provider of resource type is a EMQ X Plugin. Provider of resource type is a EMQX Plugin.
### Resource Manager ### Resource Manager

View File

@ -1,7 +1,7 @@
emqx-sn emqx-sn
======= =======
EMQ X MQTT-SN Gateway. EMQX MQTT-SN Gateway.
Configure Plugin Configure Plugin
---------------- ----------------
@ -113,5 +113,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X-Men Team. EMQX-Men Team.

View File

@ -2,7 +2,7 @@
emqx-stomp emqx-stomp
========== ==========
The plugin adds STOMP 1.0/1.1/1.2 protocol supports to the EMQ X broker. The plugin adds STOMP 1.0/1.1/1.2 protocol supports to the EMQX broker.
The STOMP clients could PubSub to the MQTT clients. The STOMP clients could PubSub to the MQTT clients.
@ -73,5 +73,5 @@ Apache License Version 2.0
Author Author
------ ------
EMQ X Team. EMQX Team.

View File

@ -1,6 +1,6 @@
{application, emqx_stomp, {application, emqx_stomp,
[{description, "EMQ X Stomp Protocol Plugin"}, [{description, "EMQ X Stomp Protocol Plugin"},
{vsn, "4.3.4"}, % strict semver, bump manually! {vsn, "4.3.5"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, [emqx_stomp_sup]}, {registered, [emqx_stomp_sup]},
{applications, [kernel,stdlib]}, {applications, [kernel,stdlib]},

View File

@ -1,8 +1,15 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{VSN, {VSN,
[{"4.3.3",[{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]}, [{"4.3.4",
{"4.3.2",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
{"4.3.3",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
{"4.3.2",
[{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]}, {load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
{"4.3.1", {"4.3.1",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
@ -12,14 +19,20 @@
[{restart_application,emqx_stomp}, [{restart_application,emqx_stomp},
{apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]}, {apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]},
{<<".*">>,[]}], {<<".*">>,[]}],
[{"4.3.3",[{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]}, [{"4.3.4",
{"4.3.2",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
{"4.3.3",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
{"4.3.2",
[{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]}, {load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
{"4.3.1", {"4.3.1",
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}, {load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]},
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]}, {load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
{"4.3.0", {"4.3.0",[{restart_application,emqx_stomp}]},
[{restart_application,emqx_stomp}]},
{<<".*">>,[]}]}. {<<".*">>,[]}]}.

View File

@ -91,8 +91,6 @@
-define(ENABLED(X), (X =/= undefined)). -define(ENABLED(X), (X =/= undefined)).
-elvis([{elvis_style, invalid_dynamic_call, #{ignore => [emqx_stomp_connection]}}]).
-dialyzer({nowarn_function, [ ensure_stats_timer/2 -dialyzer({nowarn_function, [ ensure_stats_timer/2
]}). ]}).

View File

@ -108,8 +108,6 @@
, init/2 , init/2
]}). ]}).
-elvis([{elvis_style, dont_repeat_yourself, disable}]).
-type(pstate() :: #pstate{}). -type(pstate() :: #pstate{}).
%% @doc Init protocol %% @doc Init protocol

View File

@ -1,9 +1,9 @@
# emqx-web-hook # emqx-web-hook
EMQ X WebHook plugin. EMQX WebHook plugin.
Please see: [EMQ X - WebHook](https://docs.emqx.io/broker/latest/en/advanced/webhook.html) Please see: [EMQX - WebHook](https://docs.emqx.io/broker/latest/en/advanced/webhook.html)
## emqx_web_hook.conf ## emqx_web_hook.conf

View File

@ -49,7 +49,7 @@ if ! check_eralng_start >/dev/null 2>&1; then
echoerr "FATAL: Unable to start Erlang." echoerr "FATAL: Unable to start Erlang."
echoerr "Please make sure openssl-1.1.1 (libcrypto) and libncurses are installed." echoerr "Please make sure openssl-1.1.1 (libcrypto) and libncurses are installed."
echoerr "Also ensure it's running on the correct platform," echoerr "Also ensure it's running on the correct platform,"
echoerr "this EMQ X release is built for $BUILT_ON" echoerr "this EMQX release is built for $BUILT_ON"
exit 1 exit 1
fi fi
echoerr "WARNING: There seem to be missing dynamic libs from the OS. Using libs from ${DYNLIBS_DIR}" echoerr "WARNING: There seem to be missing dynamic libs from the OS. Using libs from ${DYNLIBS_DIR}"

View File

@ -24,7 +24,7 @@ collect() {
} }
show_help() { show_help() {
echo "Collect information about the EMQ X node echo "Collect information about the EMQX node
USAGE: USAGE:

5
build
View File

@ -4,6 +4,9 @@
# arg1: profile, e.g. emqx | emqx-edge | emqx-pkg | emqx-edge-pkg # arg1: profile, e.g. emqx | emqx-edge | emqx-pkg | emqx-edge-pkg
# arg2: artifact, e.g. rel | relup | zip | pkg # arg2: artifact, e.g. rel | relup | zip | pkg
if [[ -n "$DEBUG" ]]; then
set -x
fi
set -euo pipefail set -euo pipefail
PROFILE="$1" PROFILE="$1"
@ -50,7 +53,7 @@ case "$UNAME" in
ARCH=arm ARCH=arm
;; ;;
esac esac
# used in -pkg Makefile:s # used in -pkg Makefile
export ARCH export ARCH
log() { log() {

View File

@ -1,6 +1,6 @@
apiVersion: v2 apiVersion: v2
name: emqx name: emqx
description: A Helm chart for EMQ X description: A Helm chart for EMQX
# A chart can be either an 'application' or a 'library' chart. # A chart can be either an 'application' or a 'library' chart.
# #
# Application charts are a collection of templates that can be packaged into versioned archives # Application charts are a collection of templates that can be packaged into versioned archives

View File

@ -1,5 +1,5 @@
# Introduction # Introduction
This chart bootstraps an [EMQ X](https://www.emqx.io/) deployment on a [Kubernetes](https://kubernetes.io/) (K8s) cluster using the [Helm](https://helm.sh/) package manager. This chart bootstraps an [EMQX](https://www.emqx.io/) deployment on a [Kubernetes](https://kubernetes.io/) (K8s) cluster using the [Helm](https://helm.sh/) package manager.
# Prerequisites # Prerequisites
+ [Kubernetes](https://kubernetes.io/) 1.6+ + [Kubernetes](https://kubernetes.io/) 1.6+
@ -31,21 +31,21 @@ $ helm del my-emqx
# Configuration # Configuration
The following sections describe the configurable parameters of the chart and their default values. The following sections describe the configurable parameters of the chart and their default values.
## [K8s]((https://kubernetes.io/)) specific settings ## [K8s]((https://kubernetes.io/)) specific settings
The following table lists the configurable K8s parameters of the [EMQ X](https://www.emqx.io/) chart and their default values. The following table lists the configurable K8s parameters of the [EMQX](https://www.emqx.io/) chart and their default values.
Parameter | Description | Default Value Parameter | Description | Default Value
--- | --- | --- --- | --- | ---
`replicaCount` | It is recommended to have odd number of nodes in a cluster, otherwise the emqx cluster cannot be automatically healed in case of net-split. | `3` `replicaCount` | It is recommended to have odd number of nodes in a cluster, otherwise the emqx cluster cannot be automatically healed in case of net-split. | `3`
`image.tag` | EMQ X Image tag (defaults to `.Chart.AppVersion`) | `nil` `image.tag` | EMQX Image tag (defaults to `.Chart.AppVersion`) | `nil`
`image.repository` | EMQ X Image repository | `emqx/emqx` `image.repository` | EMQX Image repository | `emqx/emqx`
`image.pullPolicy` | The image pull policy | `IfNotPresent` `image.pullPolicy` | The image pull policy | `IfNotPresent`
`image.pullSecrets ` | The image pull secrets (does not add image pull secrets to deployed pods) |``[]`` `image.pullSecrets ` | The image pull secrets (does not add image pull secrets to deployed pods) |``[]``
`recreatePods` | Forces the recreation of pods during upgrades, which can be useful to always apply the most recent configuration. | `false` `recreatePods` | Forces the recreation of pods during upgrades, which can be useful to always apply the most recent configuration. | `false`
`persistence.enabled` | Enable EMQ X persistence using PVC | `false` `persistence.enabled` | Enable EMQX persistence using PVC | `false`
`persistence.storageClass` | Storage class of backing PVC (uses alpha storage class annotation) | `nil` `persistence.storageClass` | Storage class of backing PVC (uses alpha storage class annotation) | `nil`
`persistence.existingClaim` | EMQ X data Persistent Volume existing claim name, evaluated as a template | `""` `persistence.existingClaim` | EMQX data Persistent Volume existing claim name, evaluated as a template | `""`
`persistence.accessMode` | PVC Access Mode for EMQ X volume | `ReadWriteOnce` `persistence.accessMode` | PVC Access Mode for EMQX volume | `ReadWriteOnce`
`persistence.size` | PVC Storage Request for EMQ X volume | `20Mi` `persistence.size` | PVC Storage Request for EMQX volume | `20Mi`
`initContainers` | Containers that run before the creation of EMQ X containers. They can contain utilities or setup scripts. |`{}` `initContainers` | Containers that run before the creation of EMQX containers. They can contain utilities or setup scripts. |`{}`
`resources` | CPU/Memory resource requests/limits |`{}` `resources` | CPU/Memory resource requests/limits |`{}`
`nodeSelector` | Node labels for pod assignment |`{}` `nodeSelector` | Node labels for pod assignment |`{}`
`tolerations` | Toleration labels for pod assignment |``[]`` `tolerations` | Toleration labels for pod assignment |``[]``
@ -67,32 +67,32 @@ Parameter | Description | Default Value
`service.loadBalancerSourceRanges` | Address(es) that are allowed when service is LoadBalancer | `[]` `service.loadBalancerSourceRanges` | Address(es) that are allowed when service is LoadBalancer | `[]`
`service.externalIPs` | ExternalIPs for the service | `[]` `service.externalIPs` | ExternalIPs for the service | `[]`
`service.annotations` | Service annotations (evaluated as a template) | `{}` `service.annotations` | Service annotations (evaluated as a template) | `{}`
`ingress.dashboard.enabled` | Enable ingress for EMQ X Dashboard | false `ingress.dashboard.enabled` | Enable ingress for EMQX Dashboard | false
`ingress.dashboard.ingressClassName` | Set the ingress class for EMQ X Dashboard `ingress.dashboard.ingressClassName` | Set the ingress class for EMQX Dashboard
`ingress.dashboard.path` | Ingress path for EMQ X Dashboard | `/` `ingress.dashboard.path` | Ingress path for EMQX Dashboard | `/`
`ingress.dashboard.hosts` | Ingress hosts for EMQ X Mgmt API | dashboard.emqx.local `ingress.dashboard.hosts` | Ingress hosts for EMQX Mgmt API | dashboard.emqx.local
`ingress.dashboard.tls` | Ingress tls for EMQ X Mgmt API | `[]` `ingress.dashboard.tls` | Ingress tls for EMQX Mgmt API | `[]`
`ingress.dashboard.annotations` | Ingress annotations for EMQ X Mgmt API | `{}` `ingress.dashboard.annotations` | Ingress annotations for EMQX Mgmt API | `{}`
`ingress.mgmt.enabled` | Enable ingress for EMQ X Mgmt API | `false` `ingress.mgmt.enabled` | Enable ingress for EMQX Mgmt API | `false`
`ingress.mqtt.ingressClassName` | Set the ingress class for EMQ X Mgmt API | `nil` `ingress.mqtt.ingressClassName` | Set the ingress class for EMQX Mgmt API | `nil`
`ingress.mgmt.path` | Ingress path for EMQ X Mgmt API | `/` `ingress.mgmt.path` | Ingress path for EMQX Mgmt API | `/`
`ingress.mgmt.hosts` | Ingress hosts for EMQ X Mgmt API | `api.emqx.local` `ingress.mgmt.hosts` | Ingress hosts for EMQX Mgmt API | `api.emqx.local`
`ingress.mgmt.tls` | Ingress tls for EMQ X Mgmt API | `[]` `ingress.mgmt.tls` | Ingress tls for EMQX Mgmt API | `[]`
`ingress.mgmt.annotations` | Ingress annotations for EMQ X Mgmt API | `{}` `ingress.mgmt.annotations` | Ingress annotations for EMQX Mgmt API | `{}`
`ingress.wss.enabled` | Enable ingress for EMQ X Mgmt API | `false` `ingress.wss.enabled` | Enable ingress for EMQX Mgmt API | `false`
`ingress.wss.ingressClassName` | Set the ingress class for EMQ X Mgmt API | `nil` `ingress.wss.ingressClassName` | Set the ingress class for EMQX Mgmt API | `nil`
`ingress.wss.path` | Ingress path for EMQ X WSS | `/` `ingress.wss.path` | Ingress path for EMQX WSS | `/`
`ingress.wss.hosts` | Ingress hosts for EMQ X WSS | `wss.emqx.local` `ingress.wss.hosts` | Ingress hosts for EMQX WSS | `wss.emqx.local`
`ingress.wss.tls` | Ingress tls for EMQ X WSS | `[]` `ingress.wss.tls` | Ingress tls for EMQX WSS | `[]`
`ingress.wss.annotations` | Ingress annotations for EMQ X WSS | `{}` `ingress.wss.annotations` | Ingress annotations for EMQX WSS | `{}`
`extraEnv` | Aditional container env vars | `[]` `extraEnv` | Aditional container env vars | `[]`
`extraEnvFrom` | Aditional container env from vars (eg. [config map](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/), [secrets](https://kubernetes.io/docs/concepts/configuration/secret/) | `[]` `extraEnvFrom` | Aditional container env from vars (eg. [config map](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/), [secrets](https://kubernetes.io/docs/concepts/configuration/secret/) | `[]`
`extraArgs` | Additional container executable arguments | `[]` `extraArgs` | Additional container executable arguments | `[]`
`extraVolumes` | Additional container volumes (eg. for mounting certs from secrets) | `[]` `extraVolumes` | Additional container volumes (eg. for mounting certs from secrets) | `[]`
`extraVolumeMounts` | Additional container volume mounts (eg. for mounting certs from secrets) | `[]` `extraVolumeMounts` | Additional container volume mounts (eg. for mounting certs from secrets) | `[]`
## EMQ X specific settings ## EMQX specific settings
The following table lists the configurable [EMQ X](https://www.emqx.io/)-specific parameters of the chart and their default values. The following table lists the configurable [EMQX](https://www.emqx.io/)-specific parameters of the chart and their default values.
Parameter | Description | Default Value Parameter | Description | Default Value
--- | --- | --- --- | --- | ---
`emqxConfig` | Map of [configuration](https://www.emqx.io/docs/en/latest/configuration/configuration.html) items expressed as [environment variables](https://www.emqx.io/docs/en/v4.3/configuration/environment-variable.html) (prefix can be omitted) or using the configuration files [namespaced dotted notation](https://www.emqx.io/docs/en/latest/configuration/configuration.html) | `nil` `emqxConfig` | Map of [configuration](https://www.emqx.io/docs/en/latest/configuration/configuration.html) items expressed as [environment variables](https://www.emqx.io/docs/en/v4.3/configuration/environment-variable.html) (prefix can be omitted) or using the configuration files [namespaced dotted notation](https://www.emqx.io/docs/en/latest/configuration/configuration.html) | `nil`
@ -104,7 +104,7 @@ Parameter | Description | Default Value
# Examples # Examples
This section provides some examples for the configuration of common scenarios. This section provides some examples for the configuration of common scenarios.
## Enable Websockets SSL via [nginx-ingress community controller](https://kubernetes.github.io/ingress-nginx/) ## Enable Websockets SSL via [nginx-ingress community controller](https://kubernetes.github.io/ingress-nginx/)
The following settings describe a working scenario for acessing [EMQ X](https://www.emqx.io/) Websockets with SSL termination at the [nginx-ingress community controller](https://kubernetes.github.io/ingress-nginx/). The following settings describe a working scenario for acessing [EMQX](https://www.emqx.io/) Websockets with SSL termination at the [nginx-ingress community controller](https://kubernetes.github.io/ingress-nginx/).
```yaml ```yaml
ingress: ingress:
wss: wss:

View File

@ -62,13 +62,13 @@ resources: {}
# cpu: 500m # cpu: 500m
# memory: 512Mi # memory: 512Mi
# Containers that run before the creation of EMQ X containers. They can contain utilities or setup scripts. # Containers that run before the creation of EMQX containers. They can contain utilities or setup scripts.
initContainers: {} initContainers: {}
# - name: mysql-probe # - name: mysql-probe
# image: alpine # image: alpine
# command: ["sh", "-c", "for i in $(seq 1 300); do nc -zvw1 mysql 3306 && exit 0 || sleep 3; done; exit 1"] # command: ["sh", "-c", "for i in $(seq 1 300); do nc -zvw1 mysql 3306 && exit 0 || sleep 3; done; exit 1"]
## EMQ X configuration item, see the documentation (https://hub.docker.com/r/emqx/emqx) ## EMQX configuration item, see the documentation (https://hub.docker.com/r/emqx/emqx)
emqxConfig: emqxConfig:
EMQX_NAME: "{{ .Release.Name }}" EMQX_NAME: "{{ .Release.Name }}"
@ -134,7 +134,7 @@ emqxLoadedModules: >
{emqx_mod_subscription, false}. {emqx_mod_subscription, false}.
{emqx_mod_topic_metrics, false}. {emqx_mod_topic_metrics, false}.
## EMQ X Enterprise Edition requires manual creation of a Secret containing the licensed content. Write the name of Secret to the value of "emqxLicenseSecretName" ## EMQX Enterprise Edition requires manual creation of a Secret containing the licensed content. Write the name of Secret to the value of "emqxLicenseSecretName"
## Example: ## Example:
## kubectl create secret generic emqx-license-secret-name --from-file=/path/to/emqx.lic ## kubectl create secret generic emqx-license-secret-name --from-file=/path/to/emqx.lic
emqxLicenseSecretName: emqxLicenseSecretName:
@ -203,7 +203,7 @@ ingress:
## Ingress shared annotations ## Ingress shared annotations
annotations: {} annotations: {}
## ingress for EMQ X Dashboard ## ingress for EMQX Dashboard
dashboard: dashboard:
enabled: false enabled: false
annotations: {} annotations: {}
@ -214,7 +214,7 @@ ingress:
- dashboard.emqx.local - dashboard.emqx.local
tls: [] tls: []
## ingress for EMQ X Mgmt API ## ingress for EMQX Mgmt API
mgmt: mgmt:
enabled: false enabled: false
annotations: {} annotations: {}
@ -225,7 +225,7 @@ ingress:
- api.emqx.local - api.emqx.local
tls: [] tls: []
## ingress for EMQ X Mgmt API ## ingress for EMQX Mgmt API
wss: wss:
enabled: false enabled: false
# ingressClassName: nginx # ingressClassName: nginx

View File

@ -23,6 +23,8 @@ COPY . /emqx
ARG PKG_VSN ARG PKG_VSN
ARG EMQX_NAME=emqx ARG EMQX_NAME=emqx
ENV EMQX_RELUP=false
RUN cd /emqx \ RUN cd /emqx \
&& rm -rf _build/$EMQX_NAME/lib \ && rm -rf _build/$EMQX_NAME/lib \
&& make $EMQX_NAME && make $EMQX_NAME

View File

@ -17,11 +17,11 @@
[the latest release](https://github.com/docker/docker-ce/releases/latest) [the latest release](https://github.com/docker/docker-ce/releases/latest)
# What is EMQ X # What is EMQX
[EMQ X MQTT broker](https://emqx.io/products/broker) 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. [EMQX MQTT broker](https://emqx.io/products/broker) 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. Starting from 3.0 release, *EMQX* 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 *EMQX* broker can scaled to 10+ million concurrent MQTT connections on one cluster.
# How to use this image # How to use this image
@ -39,7 +39,7 @@ The emqx broker runs as linux user `emqx` in the docker container.
### Configuration ### Configuration
Use the environment variable to configure the EMQ X docker container. Use the environment variable to configure the EMQX docker container.
By default, the environment variables with ``EMQX_`` prefix are mapped to key-value pairs in configuration files. By default, the environment variables with ``EMQX_`` prefix are mapped to key-value pairs in configuration files.
@ -72,9 +72,9 @@ EMQX_HOST
These environment variables will ignore for configuration file. These environment variables will ignore for configuration file.
#### EMQ X Configuration #### EMQX Configuration
> NOTE: All EMQ X Configuration in [etc/emqx.conf](https://github.com/emqx/emqx/blob/main-v4.3/etc/emqx.conf) could config by environment. The following list is just an example, not a complete configuration. > NOTE: All EMQX Configuration in [etc/emqx.conf](https://github.com/emqx/emqx/blob/main-v4.3/etc/emqx.conf) could config by environment. The following list is just an example, not a complete configuration.
| Options | Default | Mapped | Description | | Options | Default | Mapped | Description |
| ---------------------------| ------------------ | ------------------------- | ------------------------------------- | | ---------------------------| ------------------ | ------------------------- | ------------------------------------- |
@ -148,7 +148,7 @@ EMQX_LOADED_PLUGINS="emqx_auth_redis emqx_auth_mysql"
EMQX_LOADED_PLUGINS="emqx_auth_redis | emqx_auth_mysql" EMQX_LOADED_PLUGINS="emqx_auth_redis | emqx_auth_mysql"
``` ```
#### EMQ X Plugins Configuration #### EMQX Plugins Configuration
The environment variables which with ``EMQX_`` prefix are mapped to all emqx plugins' configuration file, ``.`` get replaced by ``__``. The environment variables which with ``EMQX_`` prefix are mapped to all emqx plugins' configuration file, ``.`` get replaced by ``__``.
@ -200,7 +200,7 @@ docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \
### Cluster ### 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. EMQX 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. Let's create a static node list cluster from docker-compose.
@ -256,7 +256,7 @@ Let's create a static node list cluster from docker-compose.
### Persistence ### Persistence
If you want to persist the EMQ X docker container, you need to keep the following directories: If you want to persist the EMQX docker container, you need to keep the following directories:
+ `/opt/emqx/data` + `/opt/emqx/data`
+ `/opt/emqx/etc` + `/opt/emqx/etc`
@ -316,7 +316,7 @@ docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \
``` ```
> REMEMBER: DO NOT RUN EMQ X DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE. > REMEMBER: DO NOT RUN EMQX DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE.
### Thanks ### Thanks

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
## EMQ docker image start script ## EMQ docker image start script
# Huang Rui <vowstar@gmail.com> # Huang Rui <vowstar@gmail.com>
# EMQ X Team <support@emqx.io> # EMQX Team <support@emqx.io>
## Shell setting ## Shell setting
if [[ -n "$DEBUG" ]]; then if [[ -n "$DEBUG" ]]; then

View File

@ -1,47 +0,0 @@
%% -*-: erlang -*-
[
{
elvis,
[
{config,
[
#{dirs => ["src", "apps/**/src", "lib-ce/**/src", "lib-ee/**/src"],
filter => "*.erl",
ruleset => erl_files,
rules => [
{elvis_style, state_record_and_type, disable},
{elvis_style, no_common_caveats_call, #{}},
{elvis_style, no_debug_call, #{ debug_functions => [ {ct, pal}
, {ct, print}
]}},
{elvis_style, operator_spaces, #{rules => [{right, "|"},
{left, "|"},
{right, "||"},
{left, "||"}]}}
]
},
#{dirs => ["test", "apps/**/test", "lib-ce/**/src"],
filter => "*.erl",
rules => [
{elvis_text_style, line_length, #{ limit => 100
, skip_comments => false }},
{elvis_style, dont_repeat_yourself, #{ min_complexity => 100 }}
]
},
#{dirs => ["."],
filter => "Makefile",
ruleset => makefiles
},
#{dirs => ["."],
filter => "rebar.config",
ruleset => rebar_config
},
#{dirs => ["."],
filter => "elvis.config",
ruleset => elvis_config
}
]
}
]
}
].

View File

@ -1,5 +1,5 @@
###################################################################### ######################################################################
## Erlang VM Args for EMQ X Broker ## Erlang VM Args
###################################################################### ######################################################################
## NOTE: ## NOTE:

View File

@ -1,5 +1,5 @@
###################################################################### ######################################################################
## Erlang VM Args for EMQ X Edge ## Erlang VM Args
###################################################################### ######################################################################
## NOTE: ## NOTE:

View File

@ -2,7 +2,7 @@
emqx-dashboard emqx-dashboard
============== ==============
Dashboard for the EMQ X Broker. Dashboard for the EMQX Broker.
REST API REST API
-------- --------

View File

@ -1,4 +1,4 @@
# EMQ X Extra plugin apps # EMQX Extra plugin apps
This directory keeps a `plugins` file which defines all the approved This directory keeps a `plugins` file which defines all the approved
external plugins from open-source community. external plugins from open-source community.
@ -20,7 +20,7 @@ e.g. For an Erlang plugin named `plugin_foo`:
``` ```
Note: The `-emqx_plugin(?MODULE)` attribute should be added to Note: The `-emqx_plugin(?MODULE)` attribute should be added to
`<plugin-name>_app.erl` file to indicate that this is an EMQ X Broker plugin. `<plugin-name>_app.erl` file to indicate that this is an EMQX Broker plugin.
For example: For example:
```erlang ```erlang

View File

@ -18,7 +18,7 @@ RELEASE="$(grep -E "define.+EMQX_RELEASE.+${EDITION}" include/emqx_release.hrl |
git_exact_vsn() { git_exact_vsn() {
local tag local tag
tag="$(git describe --tags --match "[e|v]*" --exact 2>/dev/null)" tag="$(git describe --tags --match "[e|v]*" --exact 2>/dev/null)"
echo "$tag" | sed 's/^[v|e]//g' echo "${tag#[e|v]}"
} }
GIT_EXACT_VSN="$(git_exact_vsn)" GIT_EXACT_VSN="$(git_exact_vsn)"

View File

@ -1,84 +0,0 @@
#!/usr/bin/env bash
## This script checks style of changed files.
## Expect argument 1 to be the git compare base.
set -euo pipefail
elvis_version='1.0.0-emqx-2'
base="${1:-}"
repo="${2:-emqx/emqx}"
REPO="${GITHUB_REPOSITORY:-${repo}}"
if [ "${base}" = "" ]; then
echo "Usage $0 <git-compare-base-ref>"
exit 1
fi
echo "elvis -v: $elvis_version"
echo "git diff base: $base"
if [ ! -f ./elvis ] || [ "$(./elvis -v | grep -oE '[1-9]+\.[0-9]+\.[0-9]+\-emqx-[0-9]+')" != "$elvis_version" ]; then
curl --silent --show-error -fLO "https://github.com/emqx/elvis/releases/download/$elvis_version/elvis"
chmod +x ./elvis
fi
if [[ "$base" =~ [0-9a-f]{8,40} ]]; then
# base is a commit sha1
compare_base="$base"
else
remote="$(git remote -v | grep -E "github\.com(:|/)$REPO((\.git)|(\s))" | grep fetch | awk '{print $1}')"
git fetch "$remote" "$base"
compare_base="$remote/$base"
fi
git_diff() {
git diff --name-only --diff-filter=ACMRTUXB "$compare_base"...HEAD
}
bad_file_count=0
for file in $(git_diff); do
if [ ! -f "$file" ]; then
# file is deleted, skip
continue
fi
if [[ $file != *.erl ]]; then
# not .erl file
continue
fi
if ! ./elvis rock "$file" -c elvis.config; then
bad_file_count=$(( bad_file_count + 1))
fi
done
if [ $bad_file_count -gt 0 ]; then
echo "elvis: $bad_file_count errors"
exit 1
fi
### now check new-line at EOF for changed files
nl_at_eof() {
local file="$1"
if ! [ -f "$file" ]; then
return
fi
case "$file" in
*.png|*rebar3)
return
;;
esac
local lastbyte
lastbyte="$(tail -c 1 "$file" 2>&1)"
if [ "$lastbyte" != '' ]; then
echo "$file"
return 1
fi
}
for file in $(git_diff); do
if ! nl_at_eof "$file"; then
bad_file_count=$(( bad_file_count + 1 ))
fi
done
exit $bad_file_count

View File

@ -13,4 +13,5 @@ if [ "$1" != "emqx" ]; then
BASEDIR="$1" BASEDIR="$1"
fi fi
# shellcheck disable=SC2038
find "${BASEDIR}/test/props" -name "prop_*.erl" 2>/dev/null | xargs -I{} basename {} .erl | xargs | tr ' ' ',' find "${BASEDIR}/test/props" -name "prop_*.erl" 2>/dev/null | xargs -I{} basename {} .erl | xargs | tr ' ' ','

View File

@ -12,4 +12,5 @@ TESTDIR="test"
if [ "$1" != "emqx" ]; then if [ "$1" != "emqx" ]; then
TESTDIR="$1/test" TESTDIR="$1/test"
fi fi
# shellcheck disable=SC2038
find "${TESTDIR}" -name "*_SUITE.erl" 2>/dev/null | xargs | tr ' ' ',' find "${TESTDIR}" -name "*_SUITE.erl" 2>/dev/null | xargs | tr ' ' ','

72
scripts/relup-base-packages.sh Executable file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env bash
## This script helps to download relup base version packages
if [[ -n "$DEBUG" ]]; then
set -x
fi
set -euo pipefail
PROFILE="${1}"
if [ "$PROFILE" = "" ]; then
PROFILE="emqx"
fi
case $PROFILE in
"emqx")
DIR='broker'
EDITION='community'
;;
"emqx-ee")
DIR='enterprise'
EDITION='enterprise'
;;
"emqx-edge")
DIR='edge'
EDITION='edge'
;;
esac
SYSTEM="${SYSTEM:-$(./scripts/get-distro.sh)}"
ARCH="${ARCH:-$(uname -m)}"
case "$ARCH" in
x86_64)
ARCH='amd64'
;;
aarch64)
ARCH='arm64'
;;
arm*)
ARCH=arm
;;
esac
SHASUM="sha256sum"
if [ "$SYSTEM" = "macos" ]; then
SHASUM="shasum -a 256"
fi
# ensure dir
cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")/.."
mkdir -p _upgrade_base
pushd _upgrade_base
for tag in $(../scripts/relup-base-vsns.sh $EDITION | xargs echo -n); do
filename="$PROFILE-$SYSTEM-${tag#[e|v]}-$ARCH.zip"
url="https://www.emqx.com/downloads/$DIR/${tag#[e|v]}/$filename"
echo "downloading base package from ${url} ..."
if [ ! -f "$filename" ] && curl -I -m 10 -o /dev/null -s -w "%{http_code}" "${url}" | grep -q -oE "^[23]+" ; then
curl -L -o "${filename}" "${url}"
if [ "$SYSTEM" != "centos6" ]; then
curl -L -o "${filename}.sha256" "${url}.sha256"
SUMSTR=$(cat "${filename}.sha256")
echo "got sha265sum: ${SUMSTR}"
## https://askubuntu.com/questions/1202208/checking-sha256-checksum
echo "${SUMSTR} ${filename}" | $SHASUM -c || exit 1
fi
fi
done
popd

View File

@ -1,8 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
# ensure dir
cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")/.."
## This script prints the relup upgrade base versions ## This script prints the relup upgrade base versions
## for the given EMQ X edition (specified as first arg) ## for the given EMQX edition (specified as first arg)
## ##
## The second argument is the current release version ## The second argument is the current release version
## if not provided, it's taken from pkg-vsn.sh ## if not provided, it's taken from pkg-vsn.sh
@ -17,8 +20,8 @@ parse_semver() {
echo "$1" | tr '.|-' ' ' echo "$1" | tr '.|-' ' '
} }
PROFILE="${1:-}" EDITION="${1:-}"
[ -z "${PROFILE}" ] && usage [ -z "${EDITION}" ] && usage
## Get the current release version ## Get the current release version
## e.g. ## e.g.
@ -46,7 +49,7 @@ else
IS_RELEASE=false IS_RELEASE=false
fi fi
case "${PROFILE}" in case "${EDITION}" in
*enterprise*) *enterprise*)
GIT_TAG_PREFIX="e" GIT_TAG_PREFIX="e"
;; ;;

View File

@ -3,9 +3,10 @@
set -euo pipefail set -euo pipefail
target_files=() target_files=()
while IFS='' read -r line; do while IFS='' read -r line;
do
target_files+=("$line"); target_files+=("$line");
done < <(grep -r -l --exclude-dir=.git --exclude-dir=_build "#!/bin/" .) done < <(git grep -r -l '^#!/\(bin/\|usr/bin/env bash\)' .)
return_code=0 return_code=0
for i in "${target_files[@]}"; do for i in "${target_files[@]}"; do

View File

@ -1,7 +1,12 @@
{application, emqx, {application, emqx,
[{id, "emqx"}, [{id, "emqx"},
{description, "EMQ X"}, {description, "EMQ X"},
{vsn, "4.4.1"}, % strict semver, bump manually! %% Note: this version is not the same as the release version! This
%% is simply the emqx `application' version, which is separate from
%% the emqx `release' version, which in turn is comprised of several
%% apps, one of which is this. See `emqx_release.hrl' for more
%% info.
{vsn, "4.4.2"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, []}, {registered, []},
{applications, [kernel,stdlib,gproc,gen_rpc,esockd,cowboy,sasl,os_mon]}, {applications, [kernel,stdlib,gproc,gen_rpc,esockd,cowboy,sasl,os_mon]},

View File

@ -1,7 +1,14 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{VSN, {VSN,
[{"4.4.0", [{"4.4.1",
[ {load_module,emqx_connection,brutal_purge,soft_purge,[]}
, {load_module,emqx_banned,brutal_purge,soft_purge,[]}
, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}
, {load_module,emqx_channel,brutal_purge,soft_purge,[]}
]},
{"4.4.0",
[ {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]} [ {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}
{load_module,emqx_banned,brutal_purge,soft_purge,[]},
, {load_module,emqx_ctl,brutal_purge,soft_purge,[]} , {load_module,emqx_ctl,brutal_purge,soft_purge,[]}
, {load_module,emqx_channel,brutal_purge,soft_purge,[]} , {load_module,emqx_channel,brutal_purge,soft_purge,[]}
, {load_module,emqx_connection,brutal_purge,soft_purge,[]} , {load_module,emqx_connection,brutal_purge,soft_purge,[]}
@ -19,8 +26,15 @@
]}, ]},
{<<".*">>,[]} {<<".*">>,[]}
], ],
[{"4.4.0", [{"4.4.1",
[ {load_module,emqx_connection,brutal_purge,soft_purge,[]}
, {load_module,emqx_banned,brutal_purge,soft_purge,[]}
, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}
, {load_module,emqx_channel,brutal_purge,soft_purge,[]}
]},
{"4.4.0",
[ {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]} [ {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}
, {load_module,emqx_banned,brutal_purge,soft_purge,[]}
, {load_module,emqx_ctl,brutal_purge,soft_purge,[]} , {load_module,emqx_ctl,brutal_purge,soft_purge,[]}
, {load_module,emqx_channel,brutal_purge,soft_purge,[]} , {load_module,emqx_channel,brutal_purge,soft_purge,[]}
, {load_module,emqx_connection,brutal_purge,soft_purge,[]} , {load_module,emqx_connection,brutal_purge,soft_purge,[]}

View File

@ -47,8 +47,6 @@
, code_change/3 , code_change/3
]). ]).
-elvis([{elvis_style, state_record_and_type, disable}]).
-define(BANNED_TAB, ?MODULE). -define(BANNED_TAB, ?MODULE).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------

View File

@ -1377,7 +1377,7 @@ process_alias(Packet = #mqtt_packet{
{ok, Topic} -> {ok, Topic} ->
NPublish = Publish#mqtt_packet_publish{topic_name = Topic}, NPublish = Publish#mqtt_packet_publish{topic_name = Topic},
{ok, Packet#mqtt_packet{variable = NPublish}, Channel}; {ok, Packet#mqtt_packet{variable = NPublish}, Channel};
false -> {error, ?RC_PROTOCOL_ERROR} error -> {error, ?RC_PROTOCOL_ERROR}
end; end;
process_alias(#mqtt_packet{ process_alias(#mqtt_packet{
@ -1551,11 +1551,13 @@ enrich_connack_caps(AckProps, _Channel) -> AckProps.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Enrich server keepalive %% Enrich server keepalive
enrich_server_keepalive(AckProps, #channel{clientinfo = #{zone := Zone}}) -> enrich_server_keepalive(AckProps, ?IS_MQTT_V5 = #channel{clientinfo = #{zone := Zone}}) ->
case emqx_zone:server_keepalive(Zone) of case emqx_zone:server_keepalive(Zone) of
undefined -> AckProps; undefined -> AckProps;
Keepalive -> AckProps#{'Server-Keep-Alive' => Keepalive} Keepalive -> AckProps#{'Server-Keep-Alive' => Keepalive}
end. end;
enrich_server_keepalive(AckProps, _Channel) -> AckProps.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Enrich response information %% Enrich response information
@ -1601,7 +1603,7 @@ init_alias_maximum(#mqtt_packet_connect{proto_ver = ?MQTT_PROTO_V5,
init_alias_maximum(_ConnPkt, _ClientInfo) -> undefined. init_alias_maximum(_ConnPkt, _ClientInfo) -> undefined.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Enrich Keepalive %% Ensure Keepalive
%% MQTT 5 %% MQTT 5
ensure_keepalive(#{'Server-Keep-Alive' := Interval}, Channel = #channel{conninfo = ConnInfo}) -> ensure_keepalive(#{'Server-Keep-Alive' := Interval}, Channel = #channel{conninfo = ConnInfo}) ->
@ -1723,7 +1725,7 @@ run_hooks(Name, Args, Acc) ->
-compile({inline, [find_alias/3, save_alias/4]}). -compile({inline, [find_alias/3, save_alias/4]}).
find_alias(_, _, undefined) -> false; find_alias(_, _, undefined) -> error;
find_alias(inbound, AliasId, _TopicAliases = #{inbound := Aliases}) -> find_alias(inbound, AliasId, _TopicAliases = #{inbound := Aliases}) ->
maps:find(AliasId, Aliases); maps:find(AliasId, Aliases);
find_alias(outbound, Topic, _TopicAliases = #{outbound := Aliases}) -> find_alias(outbound, Topic, _TopicAliases = #{outbound := Aliases}) ->

View File

@ -30,8 +30,6 @@
-compile(nowarn_export_all). -compile(nowarn_export_all).
-endif. -endif.
-elvis([{elvis_style, invalid_dynamic_call, #{ignore => [emqx_connection]}}]).
%% API %% API
-export([ start_link/3 -export([ start_link/3
, stop/1 , stop/1

View File

@ -57,8 +57,6 @@
, code_change/3 , code_change/3
]). ]).
-elvis([{elvis_style, invalid_dynamic_call, #{ignore => [emqx_ctl]}}]).
-record(state, {seq = 0}). -record(state, {seq = 0}).
-type(cmd() :: atom()). -type(cmd() :: atom()).

View File

@ -37,8 +37,6 @@
-export_type([config/0]). -export_type([config/0]).
-elvis([{elvis_style, no_nested_try_catch, #{ ignore => [emqx_logger_jsonfmt]}}]).
-type config() :: #{depth => pos_integer() | unlimited, -type config() :: #{depth => pos_integer() | unlimited,
report_cb => logger:report_cb(), report_cb => logger:report_cb(),
single_line => boolean()}. single_line => boolean()}.

View File

@ -84,8 +84,6 @@
-export([format/1]). -export([format/1]).
-elvis([{elvis_style, god_modules, disable}]).
-spec(make(emqx_topic:topic(), emqx_types:payload()) -> emqx_types:message()). -spec(make(emqx_topic:topic(), emqx_types:payload()) -> emqx_types:message()).
make(Topic, Payload) -> make(Topic, Payload) ->
make(undefined, Topic, Payload). make(undefined, Topic, Payload).

View File

@ -676,6 +676,13 @@ t_process_alias(_) ->
{ok, #mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"t">>}}, _Chan} = {ok, #mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"t">>}}, _Chan} =
emqx_channel:process_alias(#mqtt_packet{variable = Publish}, Channel). emqx_channel:process_alias(#mqtt_packet{variable = Publish}, Channel).
t_process_alias_inexistent_alias(_) ->
Publish = #mqtt_packet_publish{topic_name = <<>>, properties = #{'Topic-Alias' => 1}},
Channel = channel(),
?assertEqual(
{error, ?RC_PROTOCOL_ERROR},
emqx_channel:process_alias(#mqtt_packet{variable = Publish}, Channel)).
t_packing_alias(_) -> t_packing_alias(_) ->
Packet1 = #mqtt_packet{variable = #mqtt_packet_publish{ Packet1 = #mqtt_packet{variable = #mqtt_packet_publish{
topic_name = <<"x">>, topic_name = <<"x">>,
@ -712,6 +719,20 @@ t_packing_alias(_) ->
#mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"z">>}}, #mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"z">>}},
channel())). channel())).
t_packing_alias_inexistent_alias(_) ->
Publish = #mqtt_packet_publish{topic_name = <<>>, properties = #{'Topic-Alias' => 1}},
Channel = channel(),
Packet = #mqtt_packet{variable = Publish},
ExpectedChannel = emqx_channel:set_field(
topic_aliases,
#{ inbound => #{}
, outbound => #{<<>> => 1}
},
Channel),
?assertEqual(
{Packet, ExpectedChannel},
emqx_channel:packing_alias(Packet, Channel)).
t_check_pub_acl(_) -> t_check_pub_acl(_) ->
ok = meck:expect(emqx_zone, enable_acl, fun(_) -> true end), ok = meck:expect(emqx_zone, enable_acl, fun(_) -> true end),
Publish = ?PUBLISH_PACKET(?QOS_0, <<"t">>, 1, <<"payload">>), Publish = ?PUBLISH_PACKET(?QOS_0, <<"t">>, 1, <<"payload">>),