diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 81% rename from .eslintrc.js rename to .eslintrc.cjs index 757b92405..2a26f562a 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -2,24 +2,27 @@ module.exports = { root: true, env: { node: true, + es2022: true, }, extends: [ 'plugin:vue/vue3-essential', 'eslint:recommended', '@vue/typescript/recommended', '@vue/prettier', - '@vue/prettier/@typescript-eslint', + '@vue/eslint-config-typescript', ], parserOptions: { - ecmaVersion: 2020, + ecmaVersion: 2022, }, ignorePatterns: ['dist', 'node_modules', '/src/assets/fonts', '/src/assets/iconfont'], rules: { + // FIXME:FIXME:FIXME: can not get node env now 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-empty-function': 'off', '@typescript-eslint/no-empty-function': [1], '@typescript-eslint/no-explicit-any': 'off', + 'vue/multi-word-component-names': 'off', }, overrides: [ { diff --git a/.github/workflows/build_emqx_for_test.yaml b/.github/workflows/build_emqx_for_test.yaml index 0b406be90..9a8a62503 100644 --- a/.github/workflows/build_emqx_for_test.yaml +++ b/.github/workflows/build_emqx_for_test.yaml @@ -15,13 +15,12 @@ jobs: OTP_VSN: '26.2.5-3' ELIXIR_VSN: '1.15.7' - steps: - name: checkout emqx code uses: actions/checkout@v3 with: repository: emqx/emqx - ref: release-58 + ref: release-59 - name: build and export to Docker id: build @@ -31,7 +30,7 @@ jobs: - name: export docker image run: | docker save $_EMQX_DOCKER_IMAGE_TAG | gzip > $EMQX_NAME-docker.tar.gz - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: '${{ env.EMQX_NAME }}-docker' path: '${{ env.EMQX_NAME }}-docker.tar.gz' diff --git a/.github/workflows/build_enterprise_package.yaml b/.github/workflows/build_enterprise_package.yaml index e14213efb..c2b006f22 100644 --- a/.github/workflows/build_enterprise_package.yaml +++ b/.github/workflows/build_enterprise_package.yaml @@ -3,26 +3,28 @@ name: build enterprise package on: pull_request: branches: - - 'enterprise' + - '**enterprise**' - 'dev/e/*' push: branches: - - 'enterprise' + - '**enterprise**' - 'dev/e/*' workflow_call: jobs: build: runs-on: ubuntu-20.04 - container: node:16.20 + container: node:20.17 steps: - uses: actions/checkout@v2 + - name: Install pnpm + run: npm install -g pnpm - name: install zip run: apt-get update && apt-get install -y zip - name: build run: | - yarn - yarn build:enterprise + pnpm install + pnpm build:enterprise - name: create package run: | touch dist/version @@ -31,7 +33,7 @@ jobs: PACKAGE_NAME=$(echo ${GITHUB_REF##*/}) # Extract tag from GITHUB_REF zip -rq emqx-enterprise-dashboard-$PACKAGE_NAME.zip ./dist echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: emqx-enterprise-dashboard path: dist/ diff --git a/.github/workflows/build_oss_package.yaml b/.github/workflows/build_oss_package.yaml index d303fdaf0..d6ffaf893 100644 --- a/.github/workflows/build_oss_package.yaml +++ b/.github/workflows/build_oss_package.yaml @@ -14,15 +14,17 @@ on: jobs: build: runs-on: ubuntu-20.04 - container: node:16.20 + container: node:20.17 steps: - uses: actions/checkout@v2 + - name: Install pnpm + run: npm install -g pnpm - name: install zip run: apt-get update && apt-get install -y zip - name: build run: | - yarn - yarn build + pnpm install + pnpm build - name: create package run: | touch dist/version @@ -31,7 +33,7 @@ jobs: PACKAGE_NAME=$(echo ${GITHUB_REF##*/}) # Extract tag from GITHUB_REF zip -rq emqx-dashboard-$PACKAGE_NAME.zip ./dist echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: emqx-dashboard path: dist/ diff --git a/.github/workflows/check_newest_schema.yaml b/.github/workflows/check_newest_schema.yaml index f3cc5dc93..ba5065c23 100644 --- a/.github/workflows/check_newest_schema.yaml +++ b/.github/workflows/check_newest_schema.yaml @@ -8,7 +8,7 @@ on: type: string env: - IS_CI: "true" + IS_CI: 'true' EMQX_NAME: ${{ inputs.emqx-name }} jobs: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: ${{ env.EMQX_NAME }}-docker path: /tmp @@ -34,17 +34,23 @@ jobs: - name: checkout dashboard code uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.17' - name: run script that checks schemas run: | - yarn - yarn orval + npm install -g pnpm + pnpm install + pnpm orval - name: check for changes run: | git_diff=$(git diff) if [ -n "$git_diff" ]; then - git diff + git diff src/types/schemas echo "Detected differences in the repository. Uploading mismatched schemas." exit 1 else @@ -53,7 +59,7 @@ jobs: - name: upload schemas if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: newest-schemas path: ./src/types/schemas/*.ts diff --git a/.github/workflows/check_package_version.yaml b/.github/workflows/check_package_version.yaml index dbd12bebe..d0fa66a00 100644 --- a/.github/workflows/check_package_version.yaml +++ b/.github/workflows/check_package_version.yaml @@ -8,7 +8,7 @@ on: type: string env: - IS_CI: "true" + IS_CI: 'true' EMQX_NAME: ${{ inputs.emqx-name }} jobs: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: ${{ env.EMQX_NAME }}-docker path: /tmp @@ -35,13 +35,16 @@ jobs: - name: checkout dashboard code uses: actions/checkout@v3 + - name: Install pnpm + run: npm install -g pnpm + - name: install dep run: | - yarn + pnpm install - name: run script that checks the version of the package run: | - node ./scripts/checkPackageVersion.js + node ./scripts/checkPackageVersion.cjs - name: check for script errors if: ${{ failure() }} diff --git a/.github/workflows/project_test.yaml b/.github/workflows/project_test.yaml index 8cbbf7e99..81aa92c26 100644 --- a/.github/workflows/project_test.yaml +++ b/.github/workflows/project_test.yaml @@ -4,7 +4,7 @@ on: pull_request: branches: - 'dev/*' - - 'enterprise' + - '**enterprise**' jobs: set_version: diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 691cbdc86..1150d93f7 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -15,7 +15,7 @@ jobs: - name: check branch and set output id: set-output run: | - if [[ "${{ github.base_ref }}" == enterprise ]]; then + if [[ "${{ github.ref_name }}" == e* ]]; then echo "emqx-name=emqx-enterprise" >> "$GITHUB_OUTPUT" else echo "emqx-name=emqx" >> "$GITHUB_OUTPUT" @@ -56,9 +56,17 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest steps: + - name: Generate GitHub App token + id: app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.AUTH_APP_ID }} + private-key: ${{ secrets.AUTH_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Create PR in emqx/emqx env: - GH_TOKEN: ${{ secrets.CI_GITHUB_TOKEN_EMQX_RW }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} EMQX_NAME: emqx VERSION: ${{ github.ref_name }} run: | @@ -74,9 +82,17 @@ jobs: if: (github.ref == 'refs/heads/enterprise') || startsWith(github.ref, 'refs/tags/e') runs-on: ubuntu-latest steps: + - name: Generate GitHub App token + id: app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.AUTH_APP_ID }} + private-key: ${{ secrets.AUTH_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Create PR in emqx/emqx env: - GH_TOKEN: ${{ secrets.CI_GITHUB_TOKEN_EMQX_RW }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} EMQX_NAME: emqx-enterprise VERSION: ${{ github.ref_name }} run: | diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..d0a778429 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index b6a7d89c6..209e3ef4b 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 +20 diff --git a/.prettierignore b/.prettierignore index 08067886e..f47ed7add 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,8 @@ # Ignore files: /src/assets/fonts /src/assets/iconfont +/src/auto-imports.d.ts +/src/components.d.ts +/src/types/schemas/* # Ignore all HTML files: *.html diff --git a/README.md b/README.md index 4366370f7..b4a8ff2b8 100644 --- a/README.md +++ b/README.md @@ -79,31 +79,31 @@ To set up for local development, follow these steps: 2. Install the dependencies: ```shell - yarn + pnpm install ``` 3. To start the development server, run: ```shell - yarn serve + pnpm dev ``` 4. For production compilation and minification: ```shell - yarn build + pnpm build ``` 5. Lint and fix files: ```shell - yarn lint + pnpm lint ``` Or, format the code with Prettier: ```shell - yarn format + pnpm format ``` ## ☁️ Development with Cloud Host @@ -125,11 +125,11 @@ To set up for development with a cloud host: 3. Start the development server: ```shell - yarn serve + pnpm serve ``` ## ⚙️ Vue.js Customize Configuration -Refer to the [Configuration Reference](https://cli.vuejs.org/config/) for more information. +Refer to the [Configuring Vite](https://vitejs.dev/config/#configuring-vite) for more information. After the completion of setup, the CI will run automatically and deploy upon successful execution. diff --git a/assets/overview-light.png b/assets/overview-light.png index e42600e0a..ab109aa39 100644 Binary files a/assets/overview-light.png and b/assets/overview-light.png differ diff --git a/auto-import.config.js b/auto-import.config.js new file mode 100644 index 000000000..337cc7960 --- /dev/null +++ b/auto-import.config.js @@ -0,0 +1,92 @@ +export default { + // targets to transform + include: [ + /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx + /\.vue$/, + /\.vue\?vue/, // .vue + ], + + // global imports to register + imports: [ + // presets + 'vue', + // custom + { + 'vue-router': [ + 'useRouter', + 'onBeforeRouteLeave', + 'useRoute', + 'createRouter', + 'createWebHashHistory', + 'onBeforeRouteUpdate', + ], + axios: [ + // default imports + ['default', 'axios'], // import { default as axios } from 'axios', + ], + lodash: [ + ['default', '_'], + 'get', + 'pick', + 'isFunction', + 'isString', + 'isPlainObject', + 'throttle', + 'cloneDeep', + 'escape', + 'isObject', + 'isUndefined', + 'omit', + 'round', + 'set', + 'escapeRegExp', + 'isEqual', + 'debounce', + 'snakeCase', + 'isArray', + 'chunk', + 'isRegExp', + 'orderBy', + 'assign', + 'merge', + 'camelCase', + 'mergeWith', + 'startCase', + 'groupBy', + 'isNumber', + 'lowerCase', + 'uniq', + ], + vuex: ['useStore', 'createStore'], + 'vue-i18n': ['useI18n'], + 'element-plus': ['ElMessage', 'ElMessageBox', 'ElNotification'], + }, + { + from: 'vue-router', + imports: ['RouteLocationRaw', 'RouteRecordRaw'], + type: true, + }, + { + from: 'vue-i18n', + imports: ['ComposerTranslation'], + type: true, + }, + ], + dts: 'src/auto-imports.d.ts', + vueTemplate: true, + dirs: [ + 'src/hooks/**', + 'src/common/constants.ts', + 'src/common/tools.ts', + { + glob: 'src/hooks/**', + types: true, // enable import the types + }, + ], +} + +export const autoImportComponentsConfig = { + dts: 'src/components.d.ts', + dirs: ['src/components/**'], + extensions: ['vue', 'tsx', 'jsx'], +} diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index c1b783eac..000000000 --- a/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ['@vue/cli-plugin-babel/preset'], -} diff --git a/index.html b/index.html new file mode 100644 index 000000000..c799c3452 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + +
+ + + +{modelValue}
} @@ -1101,6 +1116,9 @@ const SchemaForm = defineComponent({ (isSchemaLoading.value || props.recordLoading) && typesDoNotShowSkeleton.includes(props.type), ) + const schemaFormClass = computed( + () => `schema-form ${showSkeleton.value || showLoading.value ? 'is-loading' : ''}`, + ) ;(() => { if (props.form && _.isObject(props.form) && !isEmptyObj(props.form)) { configForm.value = _.cloneDeep(props.form) @@ -1108,14 +1126,11 @@ const SchemaForm = defineComponent({ init() })() - ctx.expose({ configForm, validate, clearValidate, getInitRecord }) + ctx.expose({ configForm, validate, clearValidate, validateField, getInitRecord }) return () => { return ( -force_shutdown
(强制关闭)功能,当进程堆内存或邮箱大小超过设定值时强制关闭进程',
+ en: 'Enable force_shutdown
feature. Process will be forcibly shutdown when heap memory or mailbox size exceeds the set value',
+ },
+ maxHeapSize: {
+ zh: '最大堆内存',
+ en: 'Max Heap Size',
+ },
+ maxHeapSizeDesc: {
+ zh: '进程的最大堆内存大小。如果启用了强制关闭功能,超过此限制的进程将自动退出或被强制终止。进程消息队列(邮箱)中的消息也是堆的一部分。进程关闭可分为以下两种情况:\n- 进程在运行时主动检查当前堆大小,发现超出限制后主动退出\n- 底层调度系统在为进程执行垃圾回收后检查当前堆大小,发现超出限制后强制终止进程\n\n注意:上述两种情况产生的错误日志会有所不同。前者生成的日志类似于 ...errorContext: connection_shutdown, reason: #{max => 2097152, reason => proc_heap_too_large, value => 2787348}..
,后者生成的日志类似于 ...Context: maximum heap size reached...
。',
+ en: 'The maximum heap size of the process. If the force_shutdown is enabled, processes that exceed this limit will automatically exit or be forcibly killed. Messages in the process message queue (mailbox) are also part of the heap. The shutdown of a process can be divided into the following two situations:\n- The process actively checks the current heap size during its own operation, and actively exits after finding that it exceeds the limit.\n- The underlying scheduling system checks the current heap size after performing garbage collection for the process, and forcibly kills the process after finding that it exceeds the limit.\n\nNote: The Error logs generated by the above two will be different. The log generated by the former is similar to ...errorContext: connection_shutdown, reason: #{max => 2097152, reason => proc_heap_too_large, value => 2787348}..
, and the log generated by the latter is similar to ...Context: maximum heap size reached...
.',
+ },
+ maxMailboxSize: {
+ zh: '最大邮箱大小',
+ en: 'Max Mailbox Size',
+ },
+ maxMailboxSizeDesc: {
+ zh: 'EMQX 为每个客户端连接创建至少一个轻量级进程。每个进程都有自己的消息队列(邮箱)来保存来自其他进程(如 MQTT 消息)的消息,以便进程可以随时从消息队列(邮箱)中读取消息。如果系统繁忙或进程因繁忙的套接字而挂起,消息队列可能会积累大量消息。为避免过度使用内存,当进程的消息队列长度超过此值时,EMQX 将强制关闭该进程。',
+ en: 'EMQX creates at least one lightweight process for each client connection. Each process has its own message queue (aka mailbox) to hold messages from other processes (e.g. MQTT messages) so that the process can read messages from the message queue (mailbox) at any time. If the system is busy or the process hangs due to a busy socket (see high_watermark
), the message queue can accumulate many messages. To avoid excessive memory usage, EMQX will force a process to shut down when the length of its message queue exceeds max_mailbox_size
.',
+ },
}
diff --git a/src/i18n/LogTrace.js b/src/i18n/LogTrace.ts
similarity index 100%
rename from src/i18n/LogTrace.js
rename to src/i18n/LogTrace.ts
diff --git a/src/i18n/MQTTRes.js b/src/i18n/MQTTRes.ts
similarity index 100%
rename from src/i18n/MQTTRes.js
rename to src/i18n/MQTTRes.ts
diff --git a/src/i18n/MonitoringIntegration.js b/src/i18n/MonitoringIntegration.js
deleted file mode 100644
index 4f07e355a..000000000
--- a/src/i18n/MonitoringIntegration.js
+++ /dev/null
@@ -1,189 +0,0 @@
-export default {
- monitoringPlatform: {
- zh: '监控平台',
- en: 'Monitoring platform',
- },
- monitoringPlatformFormItemLabel: {
- en: `Select a monitoring platform, for Prometheus, click the "Help button" after configuration to see how to configure the monitoring platform.`,
- zh: '选择一个监控平台,对于 Prometheus,配置后点击 "帮助按钮" 查看如何配置监控平台。',
- },
- enablePushgateway: {
- zh: '启用 Pushgateway',
- en: 'Enable Pushgateway',
- },
- enablePushgatewayDesc: {
- zh: '启用后,EMQX 将会将监控数据推送到 Pushgateway,然后由 Prometheus 从 Pushgateway 中拉取数据。',
- en: 'After enabling, EMQX will push the monitoring metrics data to the Pushgateway, and then Prometheus will pull the data from the Pushgateway.',
- },
- interval: {
- zh: '采集间隔',
- en: 'Interval',
- },
- jobName: {
- zh: 'Job 名称',
- en: 'Job Name',
- },
- jobNameDesc: {
- zh: `推送到 Pushgateway 的 Job 名称。可用变量为:emqx{'@'}127.0.0.1
则 name 变量的值为 emqx
,host 变量的值为 127.0.0.1
。\${'{'}name{'}'}/instance/\${'{'}name{'}'}~\${'{'}host{'}'}
`,
- en: `Job Name that is pushed to the Pushgateway. Available variables:emqx{'@'}127.0.0.1
then the name
variable takes value emqx
and the host
variable takes value 127.0.0.1
.\${'{'}name{'}'}/instance/\${'{'}name{'}'}~\${'{'}host{'}'}
`,
- },
- headersDesc: {
- zh: `推送到 Pushgateway 的 HTTP Headers 列表。 {'{'} Authorization = "some-authz-tokens"{'}'}
`,
- en: `A list of HTTP Headers when pushing to Pushgateway. {'{'} Authorization = "some-authz-tokens"{'}'}
`,
- },
- dataReportingInterval: {
- zh: '监控数据指标上报到监控服务的时间间隔。',
- en: 'The time interval at which monitoring data metrics are reported to the monitoring service.',
- },
- pushgatewayServer: {
- zh: 'Pushgateway 服务',
- en: 'Pushgateway Server',
- },
- pushgatewayDesc: {
- zh: '通常情况下不需要使用。启用后,将会在每个节点上启动 Pushgateway,用于收集 Prometheus Push 模式的监控数据。',
- en: 'Usually not needed. When enabled, Pushgateway will be started on each node to collect Prometheus Push mode monitoring data.',
- },
- learn: {
- zh: '了解',
- en: 'Learn ',
- },
- usePushgateway: {
- zh: '使用 Pushgateway',
- en: 'Use Pushgateway',
- },
- whenToUsePushgateway: {
- zh: '何时使用 Pushgateway',
- en: 'When to use Pushgateway',
- },
- promSetupHelp: {
- zh: 'Prometheus 与 Grafana 配置帮助',
- en: 'Prometheus and Grafana setup help',
- },
- promSetupHelpDesc: {
- zh: 'EMQX 支持将数据集成到 Prometheus 服务中来监控数据,可以使用 Grafana 来可视化监控数据。通常使用默认方法即可完成配置,也可选择使用 Pushgateway。',
- en: 'EMQX supports integrating data into the Prometheus service to monitor data, and you can use Grafana to visualize monitoring data. Usually the default method can be used to complete the configuration, or you can choose to use Pushgateway.',
- },
- pushgatewayInstall: {
- zh: '安装 Pushgateway 或 Node Exporter 服务',
- en: 'Install the Pushgateway or Node Exporter service',
- },
- promStepOne: {
- zh: '可以使用 Docker 来安装和启动 Pushgateway 服务,例如使用以下命令:',
- en: 'You can use Docker to install and start the Pushgateway service, for example, use the following command:',
- },
- nodeExporterDesc: {
- zh: '对于监控物理机或虚拟机的系统信息可使用 Node Exporter, 点击查看 ',
- en: 'For monitoring system information of physical machines or VM, you can use Node Exporter, click to view ',
- },
- installNodeExporter: {
- zh: '安装和运行 Node Exporter。',
- en: 'Installing and running the Node Exporter.',
- },
- promConfig: {
- zh: '配置 Prometheus',
- en: 'Configure Prometheus',
- },
- promConfigDesc: {
- zh: '生成 Prometheus 配置文件,包括 EMQX 服务地址,以及 EMQX 提供监控数据 API 的 Path。',
- en: 'Generate a Prometheus configuration file, including the EMQX service address, and the Path of the EMQX monitoring metrics data API.',
- },
- promStepTwo: {
- zh: '在 Prometheus 的配置文件中添加 Pushgateway 服务的地址,Node Exporter 和 Prometheus 的地址在有需要的情况下再添加。',
- en: 'Add the address of the Pushgateway service to the Prometheus configuration file, and add the address of Node Exporter and Prometheus if necessary.',
- },
- promRun: {
- zh: '再使用生成的配置文件来启动 Prometheus,例如使用以下命令:',
- en: 'Then use the generated configuration file to start Prometheus, for example, use the following command:',
- },
- grafConfig: {
- zh: '配置 Grafana',
- en: 'Configure Grafana',
- },
- promStepThree: {
- zh: '在 Grafana 中添加 Prometheus 作为数据源,然后添加配置或导入一个 Dashboard 来可视化监控数据,例如可使用以下启动命令:',
- en: 'Add Prometheus as a data source in Grafana, then add a configuration or import a Dashboard to visualize the monitoring data, for example, you can use the following startup command:',
- },
- clickDownloadTemplateDesc: {
- zh: '点击下方按钮下载默认的 Grafana Dashboard 模版。',
- en: 'Click the button below to download the default Grafana Dashboard template.',
- },
- clickDonwnloadTemplate: {
- zh: '下载 Grafana 模版',
- en: 'Download Grafana Template',
- },
- genPromConfig: {
- zh: '生成配置文件',
- en: 'Generate Configuration File',
- },
- pushgatewayRequired: {
- zh: '请配置 Pushgateway 地址',
- en: 'Please configure the Pushgateway address',
- },
- emqxRequired: {
- zh: '请配置 EMQX 地址',
- en: 'Please configure the EMQX address',
- },
- metricsPathRequired: {
- zh: '请配置 metrics API path',
- en: 'Please configure the metrics API path',
- },
- endpoint: {
- zh: '服务地址',
- en: 'Endpoint',
- },
- exportInterval: {
- zh: '导出间隔',
- // Must have a space at the beginning
- en: ' Export Interval',
- },
- enableBasicAuth: {
- zh: '启用基本认证',
- en: 'Enable Basic Auth',
- },
- enableBasicAuthDesc: {
- zh: '启用或禁用 Prometheus 抓取 API 的基本认证,不适用于 Pushgateway',
- en: 'Enable or disable basic authentication for Prometheus scrape API, not for Pushgateway',
- },
- featureSelection: {
- zh: '功能选择',
- en: 'Feature Selection',
- },
- metricsEnable: {
- zh: '指标',
- en: 'Metrics',
- },
- tracesEnable: {
- zh: '追踪',
- en: 'Traces',
- },
- tracesFilterTracesAll: {
- zh: '追踪全部消息',
- en: 'Traces All Messages',
- },
- tracesFilterTracesAllDesc: {
- zh: '当启用时,EMQX 将追踪所有发布的消息,如果无法从消息中提取追踪ID,则会生成一个新的追踪ID。当禁用时,只有在发布时带有追踪上下文(Trace context)的消息才会被追踪。',
- en: 'When enabled, the EMQX will trace all published messages. If a trace ID cannot be extracted from the message, a new trace ID will be generated. When disabled, only messages with trace context at the time of publishing will be traced.',
- },
- logsEnable: {
- zh: '日志',
- en: 'Logs',
- },
- logsLevel: {
- zh: '日志级别',
- en: 'Logs Level',
- },
- thisDoc: {
- zh: '此文档',
- en: 'this doc',
- },
-}
diff --git a/src/i18n/Plugins.js b/src/i18n/Plugins.ts
similarity index 76%
rename from src/i18n/Plugins.js
rename to src/i18n/Plugins.ts
index 5595d41cd..561387604 100644
--- a/src/i18n/Plugins.js
+++ b/src/i18n/Plugins.ts
@@ -59,10 +59,6 @@ export default {
zh: '插件描述',
en: 'Description',
},
- uploadPlugin: {
- zh: '上传插件',
- en: 'Upload plugin',
- },
dragFilePlaceholder: {
zh: '选择或拖拽文件到此处',
en: 'Select or drag files here',
@@ -91,10 +87,6 @@ export default {
zh: '请先上传文件',
en: 'Please upload the file first',
},
- installNow: {
- zh: '立即安装',
- en: 'Install now',
- },
moveToTop: {
zh: '移到顶部',
en: 'Move to top',
@@ -127,4 +119,28 @@ export default {
zh: '此插件不支持在 Dashboard 中进行配置。',
en: 'This plugin does not support configuration via the Dashboard.',
},
+ inConsistent: {
+ zh: '集群中各节点版本不一致',
+ en: 'Inconsistent for nodes in the cluster',
+ },
+ syncToNodes: {
+ zh: '同步至各节点',
+ en: 'Sync to Nodes',
+ },
+ confirmSyncPluginVersion: {
+ zh: '是否确认将版本 {currentVersion} 的插件 {name} 同步至以下节点',
+ en: 'Are you sure to sync version {currentVersion} of the plugin {name} to the following nodes?',
+ },
+ currentVersion: {
+ zh: '当前版本',
+ en: 'Current Version',
+ },
+ syncSuccess: {
+ zh: '同步成功',
+ en: 'Synchronized Successfully',
+ },
+ restartPluginTip: {
+ zh: '为保证同步后插件正常运行,请在同步后重新启动插件',
+ en: 'To ensure the plugin runs normally after synchronization, please restart the plugin after synchronization.',
+ },
}
diff --git a/src/i18n/Rule.js b/src/i18n/Rule.ts
similarity index 100%
rename from src/i18n/Rule.js
rename to src/i18n/Rule.ts
diff --git a/src/i18n/RuleEngine.js b/src/i18n/RuleEngine.ts
similarity index 98%
rename from src/i18n/RuleEngine.js
rename to src/i18n/RuleEngine.ts
index 1449c34aa..6f0a0aed4 100644
--- a/src/i18n/RuleEngine.js
+++ b/src/i18n/RuleEngine.ts
@@ -75,14 +75,6 @@ export default {
zh: 'HTTP 服务',
en: 'HTTP Server',
},
- bridgeDescHTTP: {
- zh: '发送数据到 HTTP 服务',
- en: 'Send data to HTTP Server',
- },
- bridgeDescMQTT: {
- zh: '使用 MQTT 桥接数据',
- en: 'Using MQTT to bridge data',
- },
trigger: {
zh: '触发器',
en: 'Trigger',
@@ -693,6 +685,14 @@ export default {
zh: '当取消终端订阅成功时触发规则',
en: `Triggered when the terminal subscription is cancelled successfully`,
},
+ sysAlarmActivatedDesc: {
+ zh: '当系统告警激活时触发规则',
+ en: `Trigger the rule when the system alarm is activated`,
+ },
+ sysAlarmDeactivatedDesc: {
+ zh: '当系统告警解除时触发规则',
+ en: `Trigger the rule when the system alarm is deactivated`,
+ },
useAction: {
zh: '使用动作',
en: 'Use action',
@@ -1089,6 +1089,10 @@ export default {
zh: '关联规则',
en: 'Associated Rules',
},
+ viewRules: {
+ zh: '查看规则',
+ en: 'View Rules',
+ },
directDispatch: {
zh: '直接派发',
en: 'Direct Dispatch',
diff --git a/src/i18n/RuleEvent.js b/src/i18n/RuleEvent.ts
similarity index 87%
rename from src/i18n/RuleEvent.js
rename to src/i18n/RuleEvent.ts
index 04289353c..59a576f27 100644
--- a/src/i18n/RuleEvent.js
+++ b/src/i18n/RuleEvent.ts
@@ -55,6 +55,14 @@ export default {
en: 'Message Transformation Failed',
zh: '消息转换失败',
},
+ eventsSysAlarmDeactivated: {
+ en: 'System Alarm Deactivated',
+ zh: '系统告警解除',
+ },
+ eventsSysAlarmActivated: {
+ en: 'System Alarm Activated',
+ zh: '系统告警激活',
+ },
bridgesMqtt: {
en: 'Mqtt Bridge Message',
zh: 'MQTT 桥接消息',
diff --git a/src/i18n/RuleSyntax.js b/src/i18n/RuleSyntax.ts
similarity index 96%
rename from src/i18n/RuleSyntax.js
rename to src/i18n/RuleSyntax.ts
index 7d368adab..cf61156bc 100644
--- a/src/i18n/RuleSyntax.js
+++ b/src/i18n/RuleSyntax.ts
@@ -1064,7 +1064,7 @@ export default {
},
hexstr2BinDesc: {
zh: 'Hex 字符串转为二进制数据',
- en: 'Binary to Hex String',
+ en: 'Hex String to Hex String',
},
hexstr2BinParams: {
zh: 'Hex 字符串',
@@ -1164,4 +1164,52 @@ Typical JQ programs describe simple transformations or filters for JSON data, bu
zh: '返回值为执行生成生成的 JSON 对象列表。如果执行超时或者 JQ 程序抛出异常,该函数将抛出异常。',
en: 'list of objects corresponding to the JSON objects generated by the given JQ program (parameter 1) when given the input provided by parameter 2. The function throws an exception if the execution did not finish before the timeout or if the jq program throws an exception.',
},
+ isEmptyDesc: {
+ zh: '判断 Map 或数组是否为空',
+ en: 'Return true if the map or array is empty',
+ },
+ isEmptyParams: {
+ zh: '要检查的值',
+ en: 'Value to check',
+ },
+ isEmptyReturns: {
+ zh: '布尔值,为空时返回 true',
+ en: 'Boolean value, true if empty',
+ },
+ mapSizeDesc: {
+ zh: '获取 Map 的大小',
+ en: 'Return the size of a map',
+ },
+ mapSizeParams: {
+ zh: 'Map 对象',
+ en: 'Map object',
+ },
+ mapSizeReturns: {
+ zh: 'Map 的大小',
+ en: 'The size of the map',
+ },
+ strUtf16LeDesc: {
+ zh: '将 UTF-8 字符串转换为 UTF-16 小端序编码',
+ en: 'Convert a UTF-8 string to UTF-16 little-endian'
+ },
+ strUtf16LeParams: {
+ zh: '要转换的字符串',
+ en: 'String to convert'
+ },
+ strUtf16LeReturns: {
+ zh: 'UTF-16 小端序编码的字符串',
+ en: 'UTF-16 little-endian encoded string'
+ },
+ sqlserverBin2HexstrDesc: {
+ zh: '将字符串或二进制转换为 SQL Server 十六进制格式(带 0x 前缀)',
+ en: 'Convert string or binary to SQL Server hex format with 0x prefix'
+ },
+ sqlserverBin2HexstrParams: {
+ zh: '要转换的数据',
+ en: 'Data to convert'
+ },
+ sqlserverBin2HexstrReturns: {
+ zh: 'SQL Server 格式的十六进制字符串',
+ en: 'Hex string in SQL Server format'
+ }
}
diff --git a/src/i18n/Settings.js b/src/i18n/Settings.ts
similarity index 100%
rename from src/i18n/Settings.js
rename to src/i18n/Settings.ts
diff --git a/src/i18n/Subs.js b/src/i18n/Subs.ts
similarity index 100%
rename from src/i18n/Subs.js
rename to src/i18n/Subs.ts
diff --git a/src/i18n/Tools.js b/src/i18n/Tools.ts
similarity index 92%
rename from src/i18n/Tools.js
rename to src/i18n/Tools.ts
index 328c24fdd..56cf59fdc 100644
--- a/src/i18n/Tools.js
+++ b/src/i18n/Tools.ts
@@ -79,6 +79,14 @@ export default {
zh: '订阅',
en: 'Subscribe',
},
+ invalidPubTopic: {
+ zh: '请输入有效的主题',
+ en: 'Please enter a valid topic',
+ },
+ invalidSubTopic: {
+ zh: '发布主题不能包含通配符',
+ en: 'Publish topic cannot contain wildcards',
+ },
time: {
zh: '时间',
en: 'Time',
diff --git a/src/i18n/Topics.js b/src/i18n/Topics.ts
similarity index 100%
rename from src/i18n/Topics.js
rename to src/i18n/Topics.ts
diff --git a/src/i18n/components.js b/src/i18n/components.ts
similarity index 93%
rename from src/i18n/components.js
rename to src/i18n/components.ts
index 4e1974c5c..7f793eadf 100644
--- a/src/i18n/components.js
+++ b/src/i18n/components.ts
@@ -24,8 +24,8 @@ export default {
en: 'Management',
},
diagnose: {
- zh: '问题分析',
- en: 'Diagnose',
+ zh: '诊断工具',
+ en: 'Diagnostics Tools',
},
acl: {
zh: 'ACL',
@@ -89,7 +89,7 @@ export default {
},
rule: {
zh: '规则',
- en: 'Rule',
+ en: 'Rules',
},
rules: {
zh: '规则',
@@ -108,8 +108,8 @@ export default {
en: 'Create Flow',
},
webhook: {
- zh: 'Webhook',
- en: 'Webhook',
+ zh: 'Webhooks',
+ en: 'Webhooks',
},
'webhook-create': {
zh: '创建 Webhook',
@@ -157,7 +157,7 @@ export default {
},
extension: {
zh: '扩展',
- en: 'Extension',
+ en: 'Extensions',
},
'mqtt-system-topic': {
zh: '系统主题',
@@ -172,12 +172,12 @@ export default {
en: 'Gateways',
},
exhook: {
- zh: 'ExHook',
- en: 'ExHook',
+ zh: 'ExHooks',
+ en: 'ExHooks',
},
'api-key': {
zh: 'API 密钥',
- en: 'API Key',
+ en: 'API Keys',
},
'banned-clients': {
zh: '黑名单',
@@ -257,11 +257,11 @@ export default {
},
'log-trace': {
zh: '日志追踪',
- en: 'Log Trace',
+ en: 'Log Traces',
},
connector: {
zh: '连接器',
- en: 'Connector',
+ en: 'Connectors',
},
extensions: {
zh: '插件扩展',
@@ -269,7 +269,7 @@ export default {
},
'mqtt-session': {
zh: '会话',
- en: 'Session',
+ en: 'Sessions',
},
'mqtt-retainer': {
zh: '保留消息',
@@ -287,6 +287,10 @@ export default {
zh: '会话持久化',
en: 'Durable Sessions',
},
+ 'mqtt-force-shutdown': {
+ zh: '强制关闭',
+ en: 'Force Shutdown',
+ },
/* For Quick Panel Start */
'rule-create': {
zh: '创建规则',
diff --git a/src/main.ts b/src/main.ts
index 23bad0fed..9746e6999 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -11,8 +11,8 @@ import ElementPlus from 'element-plus'
import elementI18nZhCn from 'element-plus/es/locale/lang/zh-cn'
import elementI18nEn from 'element-plus/es/locale/lang/en'
import safeHTML from '@/common/safeHTML'
-
import i18n from './i18n'
+import globalComponents from './components/global-components'
function bindDirective(app: Application) {
app.directive('safe-html', safeHTML)
@@ -27,6 +27,7 @@ const app = createApp(App)
})
.use(i18n)
.use(bindDirective)
+ .use(globalComponents)
.mount('#app')
export default app
diff --git a/src/router/index.ts b/src/router/index.ts
index 3c4656b73..5e6b775ba 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,6 +1,4 @@
import store from '@/store'
-import { Component } from 'vue'
-import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
const Layout = (): Promisecluster.discovery_strategy = dns
",
- "label": "Cluster Dns Name"
- },
- "rpc_keyfile": {
- "desc": "Path to the private key file for the rpc.certfile
.true
, the node will try to heal network partitions automatically.",
- "label": "Cluster Auto Heal"
- },
- "log_overload_kill_enable": {
- "desc": "Enable log handler overload kill feature.",
- "label": "Log Handler Overload Kill"
- },
- "node_etc_dir": {
- "desc": "etc
dir for the node",
- "label": "Etc Dir"
- },
- "cluster_proto_dist": {
- "desc": "The Erlang distribution protocol for the cluster.etc/ssl_dist.conf
",
- "label": "Cluster Protocol Distribution"
- },
- "log_burst_limit_enable": {
- "desc": "Enable log burst control feature.",
- "label": "Enable Burst"
- },
- "dist_buffer_size": {
- "desc": "Erlang's distribution buffer busy limit in kilobytes.",
- "label": "Erlang's dist buffer size(KB)"
- },
- "common_handler_max_depth": {
- "desc": "Maximum depth for Erlang term log formatting and Erlang process message queue inspection.",
- "label": "Max Depth"
- },
- "desc_log": {
- "desc": "EMQX logging supports multiple sinks for the log events.\nEach sink is represented by a _log handler_, which can be configured independently.",
- "label": "Log"
- },
- "common_handler_flush_qlen": {
- "desc": "If the number of buffered log events grows larger than this threshold, a flush (delete) operation takes place.\nTo flush events, the handler discards the buffered log messages without logging.",
- "label": "Flush Threshold"
- },
- "common_handler_chars_limit": {
- "desc": "Set the maximum length of a single log message. If this length is exceeded, the log message will be truncated.\nNOTE: Restrict char limiter if formatter is JSON , it will get a truncated incomplete JSON data, which is not recommended.",
- "label": "Single Log Max Length"
- },
- "cluster_k8s_namespace": {
- "desc": "Kubernetes namespace.",
- "label": "K8s Namespace"
- },
- "node_name": {
- "desc": "Unique name of the EMQX node. It must follow %name%{'@'}FQDN
or\n%name%{'@'}IPv4
format.",
- "label": "Node Name"
- },
- "rpc_port_discovery": {
- "desc": "manual
: discover ports by tcp_server_port
.stateless
: discover ports in a stateless manner, using the following algorithm.\nIf node name is emqxN{'@'}127.0.0.1
, where the N is an integer,\nthen the listening port will be 5370 + N.",
- "label": "RRC Port Discovery"
- },
- "log_overload_kill_restart_after": {
- "desc": "The handler restarts automatically after a delay in the event of termination, unless the value `infinity` is set, which blocks any subsequent restarts.",
- "label": "Handler Restart Timer"
- },
- "log_file_handler_rotation_size": {
- "desc": "This parameter controls log file rotation. The value `infinity` means the log file will grow indefinitely, otherwise the log file will be rotated once it reaches `max_size` in bytes.",
- "label": "Rotation Size"
- },
- "desc_log_file_handler": {
- "desc": "Log handler that prints log events to files.",
- "label": "Files Log Handler"
- },
- "rpc_socket_keepalive_count": {
- "desc": "How many times the keepalive probe message can fail to receive a reply\nuntil the RPC connection is considered lost.",
- "label": "RPC Socket Keepalive Count"
- },
- "cluster_etcd_server": {
- "desc": "List of endpoint URLs of the etcd cluster",
- "label": "Cluster Etcd Server"
- },
- "db_backend": {
- "desc": "Select the backend for the embedded database.rlog
is the default backend,\nthat is suitable for very large clusters.mnesia
is a backend that offers decent performance in small clusters.",
- "label": "DB Backend"
- },
- "desc_authorization": {
- "desc": "Settings that control client authorization.",
- "label": "Authorization"
- },
- "cluster_etcd_ssl": {
- "desc": "Options for the TLS connection to the etcd cluster.",
- "label": "Cluster Etcd SSL Option"
- },
- "rpc_insecure_fallback": {
- "desc": "Enable compatibility with old RPC authentication.",
- "label": "RPC insecure fallback"
- },
- "cluster_mcast_buffer": {
- "desc": "Size of the user-level buffer.",
- "label": "Cluster Muticast Buffer"
- },
- "rpc_authentication_timeout": {
- "desc": "Timeout for the remote node authentication.",
- "label": "RPC Authentication Timeout"
- },
- "cluster_call_retry_interval": {
- "desc": "Time interval to retry after a failed call.",
- "label": "Cluster Call Retry Interval"
- },
- "cluster_mcast_sndbuf": {
- "desc": "Size of the kernel-level buffer for outgoing datagrams.",
- "label": "Cluster Muticast Sendbuf"
- },
- "rpc_driver": {
- "desc": "Transport protocol used for inter-broker communication",
- "label": "RPC dirver"
- },
- "max_ets_tables": {
- "desc": "Max number of ETS tables",
- "label": "Max number of ETS tables"
- },
- "desc_db": {
- "desc": "Settings for the embedded database.",
- "label": "Database"
- },
- "desc_cluster_etcd": {
- "desc": "Service discovery using 'etcd' service.",
- "label": "Cluster Etcd"
- },
- "cluster_name": {
- "desc": "Human-friendly name of the EMQX cluster.",
- "label": "Cluster Name"
- },
- "log_rotation_enable": {
- "desc": "Enable log rotation feature.",
- "label": "Rotation Enable"
- },
- "cluster_call_cleanup_interval": {
- "desc": "Time interval to clear completed but stale transactions.\nEnsure that the number of completed transactions is less than the max_history
.",
- "label": "Clean Up Interval"
- },
- "desc_cluster_static": {
- "desc": "Service discovery via static nodes.\nThe new node joins the cluster by connecting to one of the bootstrap nodes.",
- "label": "Cluster Static"
- },
- "db_default_shard_transport": {
- "desc": "Defines the default transport for pushing transaction logs.db.shard_transports
.\ngen_rpc
uses the gen_rpc
library,\ndistr
uses the Erlang distribution.",
- "label": "Default Shard Transport"
- },
- "cluster_static_seeds": {
- "desc": "List EMQX node names in the static cluster. See node.name
.",
- "label": "Cluster Static Seeds"
- },
- "log_overload_kill_qlen": {
- "desc": "Maximum allowed queue length.",
- "label": "Max Queue Length"
- },
- "node_backtrace_depth": {
- "desc": "Maximum depth of the call stack printed in error messages and\nprocess_info
.",
- "label": "BackTrace Depth"
- },
- "desc_log_burst_limit": {
- "desc": "Large bursts of log events produced in a short time can potentially cause problems, such as:\n - Log files grow very large\n - Log files are rotated too quickly, and useful information gets overwritten\n - Overall performance impact on the system\n\nLog burst limit feature can temporarily disable logging to avoid these issues.",
- "label": "Log Burst Limit"
- },
- "common_handler_enable": {
- "desc": "Enable this log handler.",
- "label": "Enable Log Handler"
- },
- "common_handler_timestamp_format": {
- "desc": "Pick a timestamp format:auto
: automatically choose the best format based on log formatter. epoch
for JSON and rfc3339
for text.epoch
: Unix epoch time in microseconds.rfc3339
: RFC3339 format.",
- "label": "Timestamp Format"
- },
- "cluster_k8s_service_name": {
- "desc": "EMQX broker service name.",
- "label": "K8s Service Name"
- },
- "common_handler_rotation_count": {
- "desc": "Maximum number of log files.",
- "label": "Max Log Files Number"
- },
- "node_cookie": {
- "desc": "Secret cookie is a random string that should be the same on all nodes in\nthe given EMQX cluster, but unique per EMQX cluster. It is used to prevent EMQX nodes that\nbelong to different clusters from accidentally connecting to each other.",
- "label": "Node Cookie"
- },
- "db_role": {
- "desc": "Select a node role.core
nodes provide durability of the data, and take care of writes.\nIt is recommended to place core nodes in different racks or different availability zones.replicant
nodes are ephemeral worker nodes. Removing them from the cluster\ndoesn't affect database redundancybackend
is set\nto rlog
.",
- "label": "DB Role"
- },
- "rpc_tcp_server_port": {
- "desc": "Listening port used by RPC local service.cluster.k8s.address_type
to ip
will\nmake EMQX to discover IP addresses of peer nodes from Kubernetes API.",
- "label": "K8s Address Type"
- },
- "rpc_socket_sndbuf": {
- "desc": "TCP tuning parameters. TCP sending buffer size.",
- "label": "RPC Socket Sndbuf"
- },
- "cluster_mcast_ttl": {
- "desc": "Time-to-live (TTL) for the outgoing UDP datagrams.",
- "label": "Cluster Multicast TTL"
- },
- "db_core_nodes": {
- "desc": "List of core nodes that the replicant will connect to.backend
is set\nto rlog
and the role
is set to replicant
.etcd
),\nthere is no need to set this value.",
- "label": "Db Core Node"
- },
- "log_file_handler_path": {
- "desc": "The path and name of the log file.",
- "label": "Log File Name"
- },
- "log_file_handler_to": {
- "desc": "Name the log file.",
- "label": "Log File Name"
- },
- "node_dist_net_ticktime": {
- "desc": "This is the approximate time an EMQX node may be unresponsive until it is considered down and thereby disconnected.",
- "label": "Dist Net TickTime"
- },
- "desc_cluster_k8s": {
- "desc": "Service discovery via Kubernetes API server.",
- "label": "Cluster Kubernetes"
- },
- "desc_cluster_mcast": {
- "desc": "Service discovery via UDP multicast.",
- "label": "Cluster Multicast"
- },
- "rpc_cacertfile": {
- "desc": "Path to certification authority TLS certificate file used to validate rpc.certfile
.error
error
: only log errors in the Erlang processesprogress
: log process startup.",
- "label": "Report Type"
- },
- "node_data_dir": {
- "desc": "Path to the persistent data directory.address_type
is dns
\nor hostname
.",
- "label": "K8s Suffix"
- },
- "db_rpc_module": {
- "desc": "Protocol used for pushing transaction logs to the replicant nodes.",
- "label": "RPC Module"
- },
- "cluster_etcd_prefix": {
- "desc": "Key prefix used for EMQX service discovery.",
- "label": "Cluster Etcd Prefix"
- },
- "cluster_mcast_iface": {
- "desc": "Local IP address the node discovery service needs to bind to.",
- "label": "Cluster Multicast Interface"
- },
- "log_burst_limit_window_time": {
- "desc": "See max_count
.",
- "label": "Window Time"
- },
- "cluster_dns_record_type": {
- "desc": "DNS record type.",
- "label": "DNS Record Type"
- },
- "cluster_autoclean": {
- "desc": "Remove disconnected nodes from the cluster after this interval.",
- "label": "Cluster Auto Clean"
- },
- "process_limit": {
- "desc": "Maximum number of simultaneously existing processes for this Erlang system.\nThe actual maximum chosen may be much larger than the Number passed.\nFor more information, see: https://www.erlang.org/doc/man/erl.html",
- "label": "Erlang Process Limit"
- },
- "max_ports": {
- "desc": "Maximum number of simultaneously existing ports for this Erlang system.\nThe actual maximum chosen may be much larger than the Number passed.\nFor more information, see: https://www.erlang.org/doc/man/erl.html",
- "label": "Erlang Port Limit"
- },
- "desc_log_rotation": {
- "desc": "By default, the logs are stored in `./log` directory (for installation from zip file) or in `/var/log/emqx` (for binary installation).rpc.driver
is set to ssl
.",
- "label": "RPC Certfile"
- },
- "node_crash_dump_seconds": {
- "desc": "This variable gives the number of seconds that the emulator is allowed to spend writing a crash dump. When the given number of seconds have elapsed, the emulator is terminated.disabled
to have it disabled.",
- "label": "Global GC Interval"
- },
- "common_handler_time_offset": {
- "desc": "The time offset to be used when formatting the timestamp.\nCan be one of:\n - system
: the time offset used by the local system\n - utc
: the UTC time offset\n - +-[hh]:[mm]
: user specified time offset, such as \"-02:00\" or \"+00:00\"\nDefaults to: system
.",
- "label": "Time Offset"
- },
- "rpc_mode": {
- "desc": "In sync
mode the sending side waits for the ack from the receiving side.",
- "label": "RPC Mode"
- },
- "node_crash_dump_file": {
- "desc": "Location of the crash dump file.",
- "label": "Crash Dump File"
- },
- "cluster_mcast_loop": {
- "desc": "If true
, loop UDP datagrams back to the local socket.",
- "label": "Cluster Multicast Loop"
- },
- "rpc_socket_keepalive_interval": {
- "desc": "The interval between keepalive messages.",
- "label": "RPC Socket Keepalive Interval"
- },
- "common_handler_level": {
- "desc": "The log level for the current log handler.\nDefaults to warning.",
- "label": "Log Level"
- },
- "desc_rpc": {
- "desc": "EMQX uses a library called gen_rpc
for inter-broker communication.driver
is set to ssl
.",
- "label": "RPC SSL Server Port"
- },
- "desc_cluster": {
- "desc": "EMQX nodes can form a cluster to scale up the total capacity.text
for free text, and json
for structured logging.",
- "label": "Log Formatter"
- },
- "rpc_async_batch_size": {
- "desc": "The maximum number of batch messages sent in asynchronous mode.\n Note that this configuration does not work in synchronous mode.",
- "label": "Async Batch Size"
- },
- "cluster_call_max_history": {
- "desc": "Retain the maximum number of completed transactions (for queries).",
- "label": "Cluster Call Max History"
- },
- "cluster_discovery_strategy": {
- "desc": "Service discovery method for the cluster nodes. Possible values are:\n- manual: Use emqx ctl cluster
command to manage cluster.seeds
in config file.gen_rpc
uses the gen_rpc
library,\ndistr
uses the Erlang distribution.db.default_shard_transport
.",
- "label": "Shard Transports"
- },
- "common_handler_time_window": {
- "desc": "The time window for log throttling ensures that the same type of event is only logged once within the designated time frame to prevent log overflow. A detailed log encapsulating the activities within that period is generated at the end of the time window. The minimum configurable value for this window is one second.name
.\nFor flexible configuration mapping, the name
can be set to a listener's zone
config.\nNOTE: A built-in zone named default
is auto created and can not be deleted."
- },
- "fields_mqtt_quic_listener_certfile": {
- "desc": "Path to the certificate file. Will be deprecated in 5.1, use .ssl_options.certfile instead.",
- "label": "Certificate file"
- },
- "fields_rate_limit_conn_bytes_in": {
- "desc": "Limit the rate of receiving packets for a MQTT connection.\nThe rate is counted by bytes of packets per second.",
- "label": "Connection bytes in"
- },
- "crl_cache_capacity": {
- "desc": "The maximum number of CRL URLs that can be held in cache. If the cache is at full capacity and a new URL must be fetched, then it'll evict the oldest inserted URL in the cache.",
- "label": "CRL Cache Capacity"
- },
- "alarm_actions": {
- "desc": "The actions triggered when the alarm is activated.log
and publish
.\nlog
is to write the alarm to log (console or file).\npublish
is to publish the alarm as an MQTT message to the system topics:\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/activate
and\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/deactivate
",
- "label": "Alarm Actions"
- },
- "base_listener_max_connections": {
- "desc": "The maximum number of concurrent connections allowed by the listener.",
- "label": "Max connections"
- },
- "mqtt_peer_cert_as_username": {
- "desc": "Use the CN, DN field in the peer certificate or the entire certificate content as Username. Only works for the TLS connection.\nSupported configurations are the following:\n- cn
: CN field of the certificate\n- dn
: DN field of the certificate\n- crt
: Content of the DER
or PEM
certificate\n- pem
: Convert DER
certificate content to PEM
format and use as Username\n- md5
: MD5 value of the DER
or PEM
certificate",
- "label": "Use Peer Certificate as Username"
- },
- "fields_cache_enable": {
- "desc": "Enable or disable the authorization cache.",
- "label": "Enable or disable the authorization cache"
- },
- "fields_mqtt_quic_listener_disconnect_timeout_ms": {
- "desc": "How long to wait for an ACK before declaring a path dead and disconnecting. Default: 16000",
- "label": "Disconnect timeout ms"
- },
- "mqtt_max_topic_alias": {
- "label": "Max Topic Alias"
- },
- "common_ssl_opts_schema_user_lookup_fun": {
- "desc": "EMQX-internal callback that is used to lookup pre-shared key (PSK) identity.",
- "label": "SSL PSK user lookup fun"
- },
- "fields_listeners_wss": {
- "desc": "HTTPS websocket listeners.",
- "label": "HTTPS websocket listeners"
- },
- "sysmon_top_max_procs": {
- "desc": "Stop collecting data when the number of processes\nin the VM exceeds this value",
- "label": "Max procs"
- },
- "mqtt_use_username_as_clientid": {
- "desc": "Whether to use Username as Client ID.\nThis setting takes effect later than Use Peer Certificate as Username
and Use Peer Certificate as Client ID
.",
- "label": "Use Username as Client ID"
- },
- "mqtt_max_qos_allowed": {
- "label": "Max QoS Allowed"
- },
- "fields_mqtt_quic_listener_max_binding_stateless_operations": {
- "desc": "The maximum number of stateless operations that may be queued on a binding at any one time. Default: 100",
- "label": "Max binding stateless operations"
- },
- "fields_mqtt_quic_listener_stream_recv_buffer_default": {
- "desc": "Stream initial buffer size. Default: 4096",
- "label": "Stream recv buffer default"
- },
- "fields_mqtt_quic_listener_pacing_enabled": {
- "desc": "Pace sending to avoid overfilling buffers on the path. Default: 1 (Enabled)",
- "label": "Pacing enabled"
- },
- "mqtt_max_subscriptions": {
- "desc": "Maximum number of subscriptions allowed per client.",
- "label": "Max Subscriptions"
- },
- "persistent_session_builtin_messages_table": {
- "desc": "Performance tuning options for built-in messages table.",
- "label": "Persistent messages"
- },
- "sysmon_os_cpu_low_watermark": {
- "desc": "The threshold, as percentage of system CPU load,\n for how much system cpu can be used before the corresponding alarm is cleared.",
- "label": "CPU low watermark"
- },
- "fields_mqtt_quic_listener_tls_server_max_send_buffer": {
- "desc": "How much Server TLS data to buffer. Default: 8192",
- "label": "TLS server max send buffer"
- },
- "base_listener_bind": {
- "desc": "IP address and port for the listening socket.",
- "label": "IP address and port"
- },
- "server_ssl_opts_schema_handshake_timeout": {
- "desc": "Maximum time duration allowed for the handshake to complete",
- "label": "Handshake timeout"
- },
- "fields_deflate_opts_server_context_takeover": {
- "desc": "Takeover means the compression state is retained between server messages.",
- "label": "Server context takeover"
- },
- "mqtt_session_expiry_interval": {
- "desc": "Specifies how long the session will expire after the connection is disconnected, only for non-MQTT 5.0 connections.",
- "label": "Session Expiry Interval"
- },
- "mqtt_message_expiry_interval": {
- "desc": "The MQTT message expiry interval. For MQTT v5.0 clients, it is only effective if the Message-Expiry-Interval property is not specified for the message; for MQTT v3.1 and v3.1.1, it always applies. Note that it is not helpful to set this value to a greater value than the MQTT Session Expiry Interval, because once the session expires, all related messages are purged.",
- "label": "Message Expiry Interval"
- },
- "fields_listener_enabled": {
- "desc": "Enable listener.",
- "label": "Enable listener"
- },
- "mqtt": {
- "desc": "Global MQTT configuration.\nThe configs here work as default values which can be overridden in zone
configs"
- },
- "crl_cache_refresh_http_timeout": {
- "desc": "The timeout for the HTTP request when fetching CRLs. This is a global setting for all listeners.",
- "label": "CRL Cache Refresh HTTP Timeout"
- },
- "fields_tcp_opts_backlog": {
- "desc": "TCP backlog defines the maximum length that the queue of\npending connections can grow to.",
- "label": "TCP backlog length"
- },
- "broker_route_batch_clean": {
- "desc": "Enable batch clean for deleted routes."
- },
- "fields_mqtt_quic_listener_initial_window_packets": {
- "desc": "The size (in packets) of the initial congestion window for a connection. Default: 10",
- "label": "Initial window packets"
- },
- "flapping_detect_enable": {
- "desc": "Enable flapping connection detection feature.",
- "label": "Enable flapping detection"
- },
- "sysmon_top_db_password": {
- "desc": "EMQX user password in the PostgreSQL database",
- "label": "DB Password"
- },
- "fields_ws_opts_check_origins": {
- "desc": "List of allowed origins.check_origin_enable
.",
- "label": "Allowed origins"
- },
- "fields_deflate_opts_client_context_takeover": {
- "desc": "Takeover means the compression state is retained between client messages.",
- "label": "Client context takeover"
- },
- "base_listener_acceptors": {
- "desc": "The size of the listener's receiving pool.",
- "label": "Acceptors Num"
- },
- "common_ssl_opts_schema_cacertfile": {
- "desc": "Trusted PEM format CA certificates bundle file.ws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt
",
- "label": "WS MQTT Path"
- },
- "sysmon_os_procmem_high_watermark": {
- "desc": "The threshold, as percentage of system memory,\n for how much system memory can be allocated by one Erlang process before\n the corresponding alarm is raised.",
- "label": "ProcMem high wartermark"
- },
- "fields_listeners_quic": {
- "desc": "QUIC listeners.",
- "label": "QUIC listeners"
- },
- "fields_listeners_ws": {
- "desc": "HTTP websocket listeners.",
- "label": "HTTP websocket listeners"
- },
- "mqtt_retry_interval": {
- "desc": "Retry interval for QoS 1/2 message delivering.",
- "label": "Message Retry Interval"
- },
- "stats_enable": {
- "desc": "Enable/disable statistic data collection.",
- "label": "Enable/disable statistic data collection"
- },
- "fields_authorization_deny_action": {
- "desc": "The action when the authorization check rejects an operation.",
- "label": "Authorization deny action"
- },
- "fields_deflate_opts_server_max_window_bits": {
- "desc": "Specifies the size of the compression context for the server.",
- "label": "Server compression max window size"
- },
- "client_ssl_opts_schema_server_name_indication": {
- "desc": "Specify the host name to be used in TLS Server Name Indication extension.${'{'}clientid{'}'}
: clientid\n - ${'{'}username{'}'}
: username",
- "label": "mountpoint"
- },
- "mqtt_max_awaiting_rel": {
- "desc": "Specifies the maximum number of pending QoS 2 messages in each session until either PUBREL is received or timed out. When this limit is reached, new QoS 2 PUBLISH requests will be rejected with error code 147(0x93).",
- "label": "Max Awaiting PUBREL"
- },
- "ciphers_schema_quic": {
- "desc": "This config holds TLS cipher suite names separated by comma,\nor as an array of strings. e.g.\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"
or\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]
.\nversions
('tlsv1.1', 'tlsv1.2' or 'tlsv1.3')\nincompatible cipher suites will be silently dropped.\nFor instance, if only 'tlsv1.3' is given in the versions
,\nconfiguring cipher suites for other versions will have no effect.\nversions
.\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
true
, origin
HTTP header will be\n validated against the list of allowed origins configured in check_origins
\n parameter.",
- "label": "Check origin"
- },
- "sysmon_vm_busy_dist_port": {
- "desc": "When the RPC connection used to communicate with other nodes in the cluster is overloaded,\nthere will be a busy_dist_port
warning log,\nand an MQTT message is published to system topic $SYS/sysmon/busy_dist_port
.",
- "label": "Enable Busy Distribution Port monitoring"
- },
- "mqtt_max_mqueue_len": {
- "desc": "Maximum allowed queue length when persistent client are disconnected or inflight window is full.",
- "label": "Max Message Queue Length"
- },
- "mqtt_max_inflight": {
- "desc": "Maximum number of QoS 1 and QoS 2 messages that are allowed to be delivered simultaneously before completing the acknowledgment.",
- "label": "Max Inflight"
- },
- "persistent_session_store_enabled": {
- "desc": "Use the database to store information about persistent sessions.\nThis makes it possible to migrate a client connection to another\ncluster node if a node is stopped.",
- "label": "Enable persistent session store"
- },
- "fields_deflate_opts_level": {
- "desc": "Compression level.",
- "label": "Compression level"
- },
- "mqtt_server_keepalive": {
- "label": "Server Keep Alive"
- },
- "global_authentication": {
- "desc": "Default authentication configs for all MQTT listeners.\n\nFor per-listener overrides see authentication
in listener configs\n\nThis option can be configured with:\n[]
: The default value, it allows *ALL* logins{'{'}enable:true,backend:\"built_in_database\",mechanism=\"password_based\"{'}'}
min_alarm_sustain_duration
milliseconds passed since the last time we considered the connection 'congested'.Topic Priorities
(mqueue_priorities
).",
- "label": "Default Topic Priorities"
- },
- "client_ssl_opts_schema_enable": {
- "desc": "Enable TLS.",
- "label": "Enable TLS"
- },
- "fields_mqtt_quic_listener_mtu_discovery_missing_probe_count": {
- "desc": "The maximum number of stateless operations that may be queued on a binding at any one time. Default: 3",
- "label": "MTU discovery missing probe count"
- },
- "fields_tcp_opts_recbuf": {
- "desc": "The TCP receive buffer (OS kernel) for the connections.",
- "label": "TCP receive buffer"
- },
- "sysmon_vm_process_check_interval": {
- "desc": "The time interval for the periodic process limit check.",
- "label": "Process limit check interval"
- },
- "fields_mqtt_quic_listener_server_resumption_level": {
- "desc": "Controls resumption tickets and/or 0-RTT server support. Default: 0 (No resumption)",
- "label": "Server resumption level"
- },
- "fields_ws_opts_proxy_address_header": {
- "desc": "HTTP header used to pass information about the client IP address.\nRelevant when the EMQX cluster is deployed behind a load-balancer.",
- "label": "Proxy address header"
- },
- "sysmon_os_sysmem_high_watermark": {
- "desc": "The threshold, as percentage of system memory,\n for how much system memory can be allocated before the corresponding alarm is raised.",
- "label": "SysMem high wartermark"
- },
- "fields_tcp_opts_high_watermark": {
- "desc": "The socket is set to a busy state when the amount of data queued internally\nby the VM socket implementation reaches this limit.",
- "label": "TCP 高水位线"
- },
- "fields_mqtt_quic_listener_stateless_operation_expiration_ms": {
- "desc": "The time limit between operations for the same endpoint, in milliseconds. Default: 100",
- "label": "Stateless operation expiration ms"
- },
- "server_ssl_opts_schema_dhfile": {
- "desc": "Path to a file containing PEM-encoded Diffie-Hellman parameters\nto be used by the server if a cipher suite using Diffie-Hellman\nkey exchange is negotiated. If not specified, default parameters\nare used.dhfile
option is not supported by TLS 1.3.",
- "label": "SSL dhfile"
- },
- "flapping_detect_max_count": {
- "desc": "The maximum number of disconnects allowed for a MQTT Client in `window_time`",
- "label": "Max count"
- },
- "mqtt_max_topic_levels": {
- "label": "Max Topic Levels"
- },
- "force_shutdown_max_heap_size": {
- "desc": "Total heap size",
- "label": "Total heap size"
- },
- "persistent_store_on_disc": {
- "desc": "Save information about the persistent sessions on disc.\nIf this option is enabled, persistent sessions will survive full restart of the cluster.\nOtherwise, all the data will be stored in RAM, and it will be lost when all the nodes in the cluster are stopped.",
- "label": "Persist on disc"
- },
- "mqtt_ignore_loop_deliver": {
- "desc": "Whether the messages sent by the MQTT v3.1.1/v3.1.0 client will be forwarded to the client itself, similar to `No Local` in MQTT 5.0.",
- "label": "Ignore Loop Deliver"
- },
- "common_ssl_opts_schema_certfile": {
- "desc": "PEM format certificates chain file.$SYS/sysmon/long_schedule
.",
- "label": "Enable Long Schedule monitoring"
- },
- "mqtt_keepalive_multiplier": {
- "desc": "`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`. Default value is 1.5 as per MQTT 5.0.\n\nFor example, a Keep-Alive interval of 10 seconds yields a timeout of 15 seconds with a multiplier of 1.5. Increasing the multiplier value to 2 extends the timeout to 20 seconds.",
- "label": "Keep Alive Multiplier"
- },
- "force_gc_bytes": {
- "desc": "GC the process after specified number of bytes have passed through.",
- "label": "Process GC bytes"
- },
- "server_ssl_opts_schema_fail_if_no_peer_cert": {
- "desc": "Used together with {'{'}verify, verify_peer{'}'} by an TLS/DTLS server.\nIf set to true, the server fails if the client does not have a\ncertificate to send, that is, sends an empty certificate.\nIf set to false, it fails only if the client sends an invalid\ncertificate (an empty certificate is considered valid).",
- "label": "Force Verify Peer Certificate"
- },
- "fields_ws_opts_compress": {
- "desc": "If true
, compress WebSocket messages using zlib
.deflate_opts
belong to the compression-related parameter configuration.",
- "label": "Ws compress"
- },
- "fields_mqtt_quic_listener_keep_alive_interval": {
- "desc": "How often to send PING frames to keep a connection alive. 0 means disabled.",
- "label": "Keep Alive Interval"
- },
- "fields_cache_ttl": {
- "desc": "Time to live for the cached data.",
- "label": "Time to live for the cached data"
- },
- "sys_topics": {
- "desc": "System topics configuration."
- },
- "sys_event_client_subscribed": {
- "desc": "Enable to publish event message that client subscribed a topic successfully."
- },
- "sysmon_top_db_port": {
- "desc": "Port of the PostgreSQL database that collects the data points.",
- "label": "DB Port"
- },
- "fields_mqtt_quic_listener_max_operations_per_drain": {
- "desc": "The maximum number of operations to drain per connection quantum. Default: 16",
- "label": "Max operations per drain"
- },
- "fields_mqtt_quic_listener_datagram_receive_enabled": {
- "desc": "Advertise support for QUIC datagram extension. Reserve for the future. Default 0 (FALSE)",
- "label": "Datagram receive enabled"
- },
- "fields_mqtt_quic_listener_initial_rtt_ms": {
- "desc": "Initial RTT estimate.",
- "label": "Initial RTT ms"
- },
- "overload_protection_backoff_gc": {
- "desc": "When at high load, skip forceful GC.",
- "label": "Skip GC"
- },
- "broker_perf_route_lock_type": {
- "desc": "Performance tuning for subscribing/unsubscribing a wildcard topic.\nChange this parameter only when there are many wildcard topics.\n\nNOTE: when changing from/to `global` lock, it requires all nodes in the cluster to be stopped before the change.\n - `key`: mnesia transactional updates with per-key locks. Recommended for a single-node setup.\n - `tab`: mnesia transactional updates with table lock. Recommended for a cluster setup.\n - `global`: updates are protected with a global lock. Recommended for large clusters."
- },
- "fields_tcp_opts_nodelay": {
- "desc": "The TCP_NODELAY flag for the connections.",
- "label": "TCP_NODELAY"
- },
- "sysmon_top_db_username": {
- "desc": "Username of the PostgreSQL database",
- "label": "DB Username"
- },
- "broker": {
- "desc": "Message broker options."
- },
- "force_gc_count": {
- "desc": "GC the process after this many received messages.",
- "label": "Process GC messages num"
- },
- "mqtt_max_clientid_len": {
- "label": "Max Client ID Length"
- },
- "fields_ws_opts_supported_subprotocols": {
- "desc": "Comma-separated list of supported subprotocols.",
- "label": "Supported subprotocols"
- },
- "broker_shared_subscription_strategy": {
- "desc": "Dispatch strategy for shared subscription.\n - `random`: dispatch the message to a random selected subscriber\n - `round_robin`: select the subscribers in a round-robin manner\n - `round_robin_per_group`: select the subscribers in round-robin fashion within each shared subscriber group\n - `local`: select random local subscriber otherwise select random cluster-wide\n - `sticky`: always use the last selected subscriber to dispatch, until the subscriber disconnects.\n - `hash_clientid`: select the subscribers by hashing the `clientIds` of senders.\n - `hash_topic`: select the subscribers by hashing the source topic"
- },
- "fields_deflate_opts_mem_level": {
- "desc": "Specifies the size of the compression state.false
and check_origin_enable
is\n true
, the server will reject requests that don't have origin
\n HTTP header.",
- "label": "Allow origin absence"
- },
- "common_ssl_opts_schema_versions": {
- "desc": "All TLS/DTLS versions to be supported.['tlsv1.2', 'tlsv1.1']
here.",
- "label": "SSL versions"
- },
- "mqtt_listener_proxy_protocol_timeout": {
- "desc": "Timeout for proxy protocol. EMQX will close the TCP connection if proxy protocol packet is not received within the timeout.",
- "label": "Proxy protocol timeout"
- },
- "fields_mqtt_quic_listener_idle_timeout": {
- "desc": "How long a connection can go idle before it is gracefully shut down. 0 to disable",
- "label": "Idle Timeout"
- },
- "common_ssl_opts_schema_secure_renegotiate": {
- "desc": "SSL parameter renegotiation is a feature that allows a client and a server\nto renegotiate the parameters of the SSL connection on the fly.\nRFC 5746 defines a more secure way of doing this. By enabling secure renegotiation,\nyou drop support for the insecure renegotiation, prone to MitM attacks.",
- "label": "SSL renegotiate"
- },
- "sysmon_vm_busy_port": {
- "desc": "When a port (e.g. TCP socket) is overloaded, there will be a busy_port
warning log,\nand an MQTT message is published to the system topic $SYS/sysmon/busy_port
.",
- "label": "Enable Busy Port monitoring"
- },
- "sys_event_client_connected": {
- "desc": "Enable to publish client connected event messages"
- },
- "sysmon_vm_process_low_watermark": {
- "desc": "The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is cleared.",
- "label": "Process low watermark"
- },
- "mqtt_max_packet_size": {
- "desc": "If the size is out of the preset value, EMQX will disconnect the current connection",
- "label": "Max Packet Size"
- },
- "common_ssl_opts_schema_reuse_sessions": {
- "desc": "Enable TLS session reuse.",
- "label": "TLS session reuse"
- },
- "common_ssl_opts_schema_depth": {
- "desc": "Maximum number of non-self-issued intermediate certificates that can follow the peer certificate in a valid certification path.\nSo, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly;long_gc
log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_gc
.",
- "label": "Enable Long GC monitoring"
- },
- "fields_mqtt_quic_listener_keyfile": {
- "desc": "Path to the secret key file. Will be deprecated in 5.1, use .ssl_options.keyfile instead.",
- "label": "Key file"
- },
- "mqtt_peer_cert_as_clientid": {
- "desc": "Use the CN, DN field in the peer certificate or the entire certificate content as Client ID. Only works for the TLS connection.\nSupported configurations are the following:\n- cn
: CN field of the certificate\n- dn
: DN field of the certificate\n- crt
: DER
or PEM
certificate\n- pem
: Convert DER
certificate content to PEM
format and use as Client ID\n- md5
: MD5 value of the DER
or PEM
certificate",
- "label": "Use Peer Certificate as Client ID"
- },
- "persistent_session_store_message_gc_interval": {
- "desc": "The starting interval for garbage collection of undelivered messages to\na persistent session. This affects how often the \"max_retain_undelivered\"\nis checked for removal.",
- "label": "Message GC interval"
- },
- "broker_shared_dispatch_ack_enabled": {
- "desc": "Deprecated, will be removed in 5.1.\nEnable/disable shared dispatch acknowledgement for QoS 1 and QoS 2 messages.\nThis should allow messages to be dispatched to a different subscriber in the group in case the picked (based on `shared_subscription_strategy`) subscriber is offline."
- },
- "base_listener_enable_authn": {
- "desc": "Set true
(default) to enable client authentication on this listener, the authentication\nprocess goes through the configured authentication chain.\nWhen set to false
to allow any clients with or without authentication information such as username or password to log in.\nWhen set to quick_deny_anonymous
, it behaves like when set to true
, but clients will be\ndenied immediately without going through any authenticators if username
is not provided. This is useful to fence off\nanonymous clients early.",
- "label": "Enable authentication"
- },
- "force_shutdown_enable": {
- "desc": "Enable `force_shutdown` feature.",
- "label": "Enable `force_shutdown` feature"
- },
- "broker_enable_session_registry": {
- "desc": "Enable session registry"
- },
- "overload_protection_backoff_delay": {
- "desc": "The maximum duration of delay for background task execution during high load conditions.",
- "label": "Delay Time"
- },
- "ciphers_schema_common": {
- "desc": "This config holds TLS cipher suite names separated by comma,\nor as an array of strings. e.g.\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"
or\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]
.\nversions
('tlsv1.1', 'tlsv1.2' or 'tlsv1.3')\nincompatible cipher suites will be silently dropped.\nFor instance, if only 'tlsv1.3' is given in the versions
,\nconfiguring cipher suites for other versions will have no effect.\nversions
.\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
",
- "label": ""
- },
- "sys_event_client_disconnected": {
- "desc": "Enable to publish client disconnected event messages."
- },
- "crl_cache_refresh_interval": {
- "desc": "The period to refresh the CRLs from the servers. This is a global setting for all URLs and listeners.",
- "label": "CRL Cache Refresh Interval"
- },
- "mqtt_listener_proxy_protocol": {
- "desc": "Enable the Proxy Protocol V1/2 if the EMQX cluster is deployed behind HAProxy or Nginx.true
, the server will return an error when\n the client does not carry the Sec-WebSocket-Protocol
field.\n large_heap
log, and an MQTT message is published to\nthe system topic $SYS/sysmon/large_heap
.",
- "label": "Enable Large Heap monitoring"
- },
- "mqtt_shared_subscription_strategy": {
- "label": "Shared Subscription Strategy",
- "desc": "Dispatch strategy for shared subscription.Use Peer Certificate as Username
and Use Peer Certificate as Client ID
.',
+ label: 'Use Username as Client ID',
+ },
+ idle_timeout: {
+ desc: 'Configure the duration of time that a connection can remain idle (i.e., without any data transfer) before being: \n\n- Automatically disconnected if no CONNECT package is received from the client yet. \n- Put into hibernation mode to save resources if some CONNECT packages are already received.\n\nNote: Please set the parameter with caution as long idle time will lead to resource waste.',
+ label: 'Idle Timeout',
+ },
+ strict_mode: {
+ desc: 'Whether to parse MQTT messages in strict mode.\nIn strict mode, invalid utf8 strings in for example client ID, topic name, etc. will cause the client to be disconnected.',
+ label: 'Strict Mode',
+ },
+ shared_subscription: {
+ label: 'Allowed Shared Subscription',
+ },
+ server_keepalive: {
+ label: 'Server Keep Alive',
+ },
+ wildcard_subscription: {
+ label: 'Allowed Wildcard Subscription',
+ },
+ max_clientid_len: {
+ label: 'Max Client ID Length',
+ },
+ response_information: {
+ desc: 'Response Information cn
: CN field of the certificate\n- dn
: DN field of the certificate\n- crt
: Content of the DER
or PEM
certificate\n- pem
: Convert DER
certificate content to PEM
format and use as Username\n- md5
: MD5 value of the DER
or PEM
certificate',
+ label: 'Use Peer Certificate as Username',
+ },
+ client_attrs_init: {
+ label: 'Client Attributes',
+ desc: "Specify how to initialize client attributes.cn
: CN field of the certificate\n- dn
: DN field of the certificate\n- crt
: DER
or PEM
certificate\n- pem
: Convert DER
certificate content to PEM
format and use as Client ID\n- md5
: MD5 value of the DER
or PEM
certificate',
+ label: 'Use Peer Certificate as Client ID',
+ },
+ keepalive_multiplier: {
+ desc: '`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`. Default value is 1.5 as per MQTT 5.0.\n\nFor example, a Keep-Alive interval of 10 seconds yields a timeout of 15 seconds with a multiplier of 1.5. Increasing the multiplier value to 2 extends the timeout to 20 seconds.',
+ label: 'Keep Alive Multiplier',
+ },
+ shared_subscription_strategy: {
+ label: 'Shared Subscription Strategy',
+ desc: 'Dispatch strategy for shared subscription.Topic Priorities
(mqueue_priorities
).',
+ label: 'Default Topic Priorities',
+ },
+ mqueue_store_qos0: {
+ desc: 'Specifies whether to store QoS 0 messages in the message queue while the connection is down but the session remains.',
+ label: 'Store QoS 0 Message',
+ },
+ /* SESSION END */
+ /* LOG START */
+ enable: {
+ desc: 'Enable this log handler.',
+ label: 'Enable Log Handler',
+ },
+ level: {
+ desc: 'The log level for the current log handler.\nDefaults to warning.',
+ label: 'Log Level',
+ },
+ log_file_default_path: {
+ desc: 'The path and name of the log file.',
+ label: 'Log File Name',
+ },
+ payload_encode: {
+ desc: 'The encoding method of payload in logs',
+ label: 'Payload Encode',
+ },
+ rotation_count: {
+ desc: 'Maximum number of log files.',
+ label: 'Max Log Files Number',
+ },
+ rotation_size: {
+ desc: 'This parameter controls log file rotation. The value `infinity` means the log file will grow indefinitely, otherwise the log file will be rotated once it reaches `max_size` in bytes.',
+ label: 'Rotation Size',
+ },
+ time_offset: {
+ desc: 'The time offset to be used when formatting the timestamp.\nCan be one of:\n - system
: the time offset used by the local system\n - utc
: the UTC time offset\n - +-[hh]:[mm]
: user specified time offset, such as "-02:00" or "+00:00"\nDefaults to: system
.',
+ label: 'Time Offset',
+ },
+ timestamp_format: {
+ desc: 'Pick a timestamp format:auto
: automatically choose the best format based on log formatter. epoch
for JSON and rfc3339
for text.epoch
: Unix epoch time in microseconds.rfc3339
: RFC3339 format.',
+ label: 'Timestamp Format',
+ },
+ formatter: {
+ desc: 'Choose log formatter. text
for free text, and json
for structured logging.',
+ label: 'Log Formatter',
+ },
+ time_window: {
+ desc: 'The time window for log throttling ensures that the same type of event is only logged once within the designated time frame to prevent log overflow. A detailed log encapsulating the activities within that period is generated at the end of the time window. The minimum configurable value for this window is one second.busy_dist_port
warning log,\nand an MQTT message is published to system topic $SYS/sysmon/busy_dist_port
.',
+ label: 'Enable Busy Distribution Port monitoring',
+ },
+ busy_port: {
+ desc: 'When a port (e.g. TCP socket) is overloaded, there will be a busy_port
warning log,\nand an MQTT message is published to the system topic $SYS/sysmon/busy_port
.',
+ label: 'Enable Busy Port monitoring',
+ },
+ large_heap: {
+ desc: 'When the heap memory occupied by a process exceeds the size specified by large_heap
, the system will write a warning level large_heap
log, and an MQTT message is published to\nthe system topic $SYS/sysmon/large_heap
.',
+ label: 'Enable Large Heap monitoring',
+ },
+ long_gc: {
+ desc: 'When an Erlang process spends long time to perform garbage collection, a warning level long_gc
log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_gc
.',
+ label: 'Enable Long GC monitoring',
+ },
+ long_schedule: {
+ desc: "When the Erlang VM detect a task scheduled for too long, a warning level 'long_schedule' log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_schedule
.",
+ label: 'Enable Long Schedule monitoring',
+ },
+ process_check_interval: {
+ desc: 'The time interval for the periodic process limit check.',
+ label: 'Process limit check interval',
+ },
+ process_high_watermark: {
+ desc: 'The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is raised.',
+ label: 'Process high watermark',
+ },
+ process_low_watermark: {
+ desc: 'The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is cleared.',
+ label: 'Process low watermark',
+ },
+ /* ALARM END */
+}
diff --git a/src/schemaText/schema-text-zh.json b/src/schemaText/schema-text-zh.json
deleted file mode 100644
index 92d25f96a..000000000
--- a/src/schemaText/schema-text-zh.json
+++ /dev/null
@@ -1,1374 +0,0 @@
-{
- "emqx_conf_schema": {
- "common_handler_drop_mode_qlen": {
- "desc": "当缓冲的日志事件数大于此值时,新的日志事件将被丢弃。起到过载保护的功能。\n为了使过载保护算法正常工作必须要: sync_mode_qlen =< drop_mode_qlen =< flush_qlen
且 drop_mode_qlen > 1\n要禁用某些模式,请执行以下操作。\n- 如果sync_mode_qlen被设置为0,所有的日志事件都被同步处理。也就是说,异步日志被禁用。\n- 如果sync_mode_qlen被设置为与drop_mode_qlen相同的值,同步模式被禁用。也就是说,处理程序总是以异步模式运行,除非调用drop或flushing。\n- 如果drop_mode_qlen被设置为与flush_qlen相同的值,则drop模式被禁用,永远不会发生。",
- "label": "进入丢弃模式的队列长度"
- },
- "cluster_mcast_addr": {
- "desc": "指定多播 IPv4 地址。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。",
- "label": "多播地址"
- },
- "desc_cluster_dns": {
- "desc": "DNS SRV 记录服务发现。",
- "label": "DNS SRV 记录服务发现"
- },
- "cluster_dns_name": {
- "desc": "指定 DNS A 记录的名字。emqx 会通过访问这个 DNS A 记录来获取 IP 地址列表。\n当cluster.discovery_strategy
为 dns
时有效。",
- "label": "DNS名称"
- },
- "rpc_keyfile": {
- "desc": "rpc.certfile
的私钥文件的路径。etc
存放目录",
- "label": "Etc 目录"
- },
- "cluster_proto_dist": {
- "desc": "分布式 Erlang 集群协议类型。可选值为:etc/ssl_dist.conf
一起使用。",
- "label": "集群内部通信协议"
- },
- "log_burst_limit_enable": {
- "desc": "启用日志限流保护机制。",
- "label": "日志限流保护"
- },
- "dist_buffer_size": {
- "desc": "Erlang分布式缓冲区的繁忙阈值,单位是KB。",
- "label": "Erlang分布式缓冲区的繁忙阈值(KB)"
- },
- "common_handler_max_depth": {
- "desc": "Erlang 内部格式日志格式化和 Erlang 进程消息队列检查的最大深度。",
- "label": "最大深度"
- },
- "desc_log": {
- "desc": "EMQX 日志记录支持日志事件的多个接收器。 每个接收器由一个_log handler_表示,可以独立配置。",
- "label": "日志"
- },
- "common_handler_flush_qlen": {
- "desc": "如果缓冲日志事件的数量增长大于此阈值,则会发生冲刷(删除)操作。 日志处理进程会丢弃缓冲的日志消息。\n来缓解自身不会由于内存瀑涨而影响其它业务进程。日志内容会提醒有多少事件被删除。",
- "label": "冲刷阈值"
- },
- "common_handler_chars_limit": {
- "desc": "设置单个日志消息的最大长度。 如果超过此长度,则日志消息将被截断。最小可设置的长度为100。\n注意:如果日志格式为 JSON,限制字符长度可能会导致截断不完整的 JSON 数据。",
- "label": "单条日志长度限制"
- },
- "cluster_k8s_namespace": {
- "desc": "当使用 k8s 方式并且 cluster.k8s.address_type 指定为 dns 类型时,\n可设置 emqx 节点名的命名空间。与 cluster.k8s.suffix 一起使用用以拼接得到节点名列表。",
- "label": "K8s 命名空间"
- },
- "node_name": {
- "desc": "节点名。格式为 \\manual
: 通过 tcp_server_port
来发现端口。\nstateless
: 使用无状态的方式来发现端口,使用如下算法。如果节点名称是 \nemqxN{'@'}127.0.0.1
, N 是一个数字,那么监听端口就是 5370 + N。",
- "label": "RPC 端口发现策略"
- },
- "log_overload_kill_restart_after": {
- "desc": "如果处理进程终止,它会在以指定的时间后后自动重新启动。 `infinity` 不自动重启。",
- "label": "处理进程重启机制"
- },
- "log_file_handler_rotation_size": {
- "desc": "此参数控制日志文件轮换。 `infinity` 意味着日志文件将无限增长,否则日志文件将在达到 `max_size`(以字节为单位)时进行轮换。\n与 rotation count配合使用。如果 counter 为 10,则是10个文件轮换。",
- "label": "日志文件轮换大小"
- },
- "desc_log_file_handler": {
- "desc": "日志处理进程将日志事件打印到文件。",
- "label": "文件日志处理进程"
- },
- "rpc_socket_keepalive_count": {
- "desc": "keepalive 探测消息发送失败的次数,直到 RPC 连接被认为已经断开。",
- "label": "RPC Socket Keepalive 次数"
- },
- "cluster_etcd_server": {
- "desc": "指定 etcd 服务的地址。如有多个服务使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。",
- "label": "Etcd 服务器地址"
- },
- "db_backend": {
- "desc": "配置后端数据库驱动,默认值为 rlog
它适用于大规模的集群。\nmnesia
是备选数据库,适合中小集群。",
- "label": "内置数据库"
- },
- "desc_authorization": {
- "desc": "授权相关",
- "label": "授权"
- },
- "cluster_etcd_ssl": {
- "desc": "当使用 TLS 连接 etcd 时的配置选项。\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。",
- "label": "Etcd SSL 选项"
- },
- "rpc_insecure_fallback": {
- "desc": "兼容旧的无鉴权模式",
- "label": "向后兼容旧的无鉴权模式"
- },
- "cluster_mcast_buffer": {
- "desc": "用户级缓冲区的大小。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。",
- "label": "多播用户级缓冲区"
- },
- "rpc_authentication_timeout": {
- "desc": "远程节点认证的超时时间。",
- "label": "RPC 认证超时时间"
- },
- "cluster_call_retry_interval": {
- "desc": "当集群间调用出错时,多长时间重试一次。",
- "label": "重试时间间隔"
- },
- "cluster_mcast_sndbuf": {
- "desc": "外发数据报的内核级缓冲区的大小。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。",
- "label": "多播发送缓存区"
- },
- "rpc_driver": {
- "desc": "集群间通信使用的传输协议。",
- "label": "RPC 驱动"
- },
- "max_ets_tables": {
- "desc": "Erlang ETS 表的最大数量",
- "label": "Erlang 表的最大数量"
- },
- "desc_db": {
- "desc": "内置数据库的配置。",
- "label": "数据库"
- },
- "desc_cluster_etcd": {
- "desc": "使用 'etcd' 服务的服务发现。",
- "label": "'etcd' 服务的服务发现"
- },
- "cluster_name": {
- "desc": "EMQX集群名称。每个集群都有一个唯一的名称。服务发现时会用于做路径的一部分。",
- "label": "集群名称"
- },
- "log_rotation_enable": {
- "desc": "启用日志轮换功能。启动后生成日志文件后缀会加上对应的索引数字,比如:log/emqx.log.1。\n系统会默认生成*.siz/*.idx
用于记录日志位置,请不要手动修改这两个文件。",
- "label": "日志轮换"
- },
- "cluster_call_cleanup_interval": {
- "desc": "清理过期事务的时间间隔",
- "label": "清理间隔"
- },
- "desc_cluster_static": {
- "desc": "静态节点服务发现。新节点通过连接一个节点来加入集群。",
- "label": "静态节点服务发现"
- },
- "db_default_shard_transport": {
- "desc": "定义用于推送事务日志的默认传输。db.shard_transports
中基于每个分片被覆盖。\ngen_rpc
使用 gen_rpc
库,\ndistr
使用 Erlang 发行版。",
- "label": "事务日志传输默认协议"
- },
- "cluster_static_seeds": {
- "desc": "集群中的EMQX节点名称列表,\n指定固定的节点列表,多个节点间使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 static 时,此配置项才有效。\n适合于节点数量较少且固定的集群。",
- "label": "集群静态节点"
- },
- "log_overload_kill_qlen": {
- "desc": "允许的最大队列长度。",
- "label": "最大队列长度"
- },
- "node_backtrace_depth": {
- "desc": "错误信息中打印的最大堆栈层数",
- "label": "最大堆栈导数"
- },
- "desc_log_burst_limit": {
- "desc": "短时间内产生的大量日志事件可能会导致问题,例如:\n - 日志文件变得非常大\n - 日志文件轮换过快,有用信息被覆盖\n - 对系统的整体性能影响\n\n日志突发限制功能可以暂时禁用日志记录以避免这些问题。",
- "label": "日志突发限制"
- },
- "common_handler_enable": {
- "desc": "启用此日志处理进程。",
- "label": "启用日志处理进程"
- },
- "common_handler_timestamp_format": {
- "desc": "选择时间戳格式:auto
:根据日志的格式自动选择最合适的时间戳格式。对于 JSON 使用 epoch
,对于文本则使用 rfc3339
。epoch
:表示为自 Unix 纪元起的微秒数。rfc3339
:遵循 RFC3339 标准的时间格式。",
- "label": "时间戳格式"
- },
- "cluster_k8s_service_name": {
- "desc": "指定 Kubernetes 中 EMQX 的服务名。\n当 cluster.discovery_strategy 为 k8s 时,此配置项才有效。",
- "label": "K8s 服务别名"
- },
- "common_handler_rotation_count": {
- "desc": "轮换的最大日志文件数。",
- "label": "最大日志文件数"
- },
- "node_cookie": {
- "desc": "分布式 Erlang 集群使用的 cookie 值。集群间保持一致",
- "label": "节点 Cookie"
- },
- "db_role": {
- "desc": "选择节点的角色。core
节点提供数据的持久性,并负责写入。建议将核心节点放置在不同的机架或不同的可用区。repliant
节点是临时工作节点。 从集群中删除它们,不影响数据库冗余backend
时生效到 rlog
。",
- "label": "数据库角色"
- },
- "rpc_tcp_server_port": {
- "desc": "RPC 本地服务使用的 TCP 端口。cluster.k8s.address_type
为 ip
,则将从 Kubernetes 接口中获取集群中其他节点\n的IP地址。",
- "label": "K8s 地址类型"
- },
- "rpc_socket_sndbuf": {
- "desc": "TCP 调节参数。TCP 发送缓冲区大小。",
- "label": "RPC 套接字发送缓冲区大小"
- },
- "cluster_mcast_ttl": {
- "desc": "指定多播的 Time-To-Live 值。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。",
- "label": "多播TTL"
- },
- "db_core_nodes": {
- "desc": "当前节点连接的核心节点列表。backend
时生效到 rlog
\n并且设置role
为replicant
时生效。etcd
),则不需要设置该值。",
- "label": "数据库核心节点"
- },
- "log_file_handler_path": {
- "desc": "日志文件路径及名字。",
- "label": "日志文件名字"
- },
- "node_dist_net_ticktime": {
- "desc": "系统调优参数,此配置将覆盖 vm.args 文件里的 -kernel net_ticktime 参数。当一个节点持续无响应多久之后,认为其已经宕机并断开连接。",
- "label": "节点间心跳间隔"
- },
- "desc_cluster_k8s": {
- "desc": "Kubernetes 服务发现。",
- "label": "Kubernetes 服务发现"
- },
- "desc_cluster_mcast": {
- "desc": "UDP 组播服务发现。",
- "label": "UDP 组播服务发现"
- },
- "rpc_cacertfile": {
- "desc": "验证 rpc.certfile
的 CA 证书文件的路径。error
:仅记录 Erlang 进程中的错误。\n - progress
:除了 error 信息外,还需要记录进程启动的详细信息。",
- "label": "报告类型"
- },
- "node_data_dir": {
- "desc": "节点数据存放目录,可能会自动创建的子目录如下:max_count
。",
- "label": "Window Time"
- },
- "cluster_dns_record_type": {
- "desc": "DNS 记录类型。",
- "label": "DNS记录类型"
- },
- "cluster_autoclean": {
- "desc": "指定多久之后从集群中删除离线节点。",
- "label": "自动删除离线节点时间"
- },
- "process_limit": {
- "desc": "Erlang系统同时存在的最大进程数。\n实际选择的最大值可能比设置的数字大得多。\n参考: https://www.erlang.org/doc/man/erl.html",
- "label": "Erlang 最大进程数"
- },
- "max_ports": {
- "desc": "Erlang系统同时存在的最大端口数。\n实际选择的最大值可能比设置的数字大得多。\n参考: https://www.erlang.org/doc/man/erl.html",
- "label": "Erlang 最大端口数"
- },
- "desc_log_rotation": {
- "desc": "默认情况下,日志存储在 `./log` 目录(用于从 zip 文件安装)或 `/var/log/emqx`(用于二进制安装)。rpc.driver
设置为 ssl
时,此配置才会生效。",
- "label": "RPC 证书文件"
- },
- "node_crash_dump_seconds": {
- "desc": "该配置给出了运行时系统允许花费的写入崩溃转储的秒数。当给定的秒数已经过去,运行时系统将被终止。disabled
。",
- "label": "全局垃圾回收"
- },
- "common_handler_time_offset": {
- "desc": "日志中的时间戳使用的时间偏移量。\n可选值为:\n - system
: 本地系统使用的时区偏移量\n - utc
: 0 时区的偏移量\n - +-[hh]:[mm]
: 自定义偏移量,比如 \"-02:00\" 或者 \"+00:00\"\n默认值为本地系统的时区偏移量:system
。",
- "label": "时间偏移量"
- },
- "rpc_mode": {
- "desc": "在 sync
模式下,发送端等待接收端的 ack信号。",
- "label": "RPC 模式"
- },
- "node_crash_dump_file": {
- "desc": "设置 Erlang crash_dump 文件的存储路径和文件名。",
- "label": "节点崩溃时的Dump文件"
- },
- "cluster_mcast_loop": {
- "desc": "设置多播的报文是否投递到本地回环地址。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。",
- "label": "多播回环开关"
- },
- "rpc_socket_keepalive_interval": {
- "desc": "keepalive 消息的间隔。",
- "label": "RPC Socket Keepalive 间隔"
- },
- "common_handler_level": {
- "desc": "当前日志处理进程的日志级别。\n默认为 warning 级别。",
- "label": "日志级别"
- },
- "desc_rpc": {
- "desc": "EMQX 使用 gen_rpc
库来实现跨节点通信。 dirver
设置为 ssl
,\n此配置才会生效。",
- "label": "RPC SSL 服务监听端口"
- },
- "desc_cluster": {
- "desc": "EMQX 节点可以组成一个集群,以提高总容量。text
用于纯文本,json
用于结构化日志记录。",
- "label": "日志格式类型"
- },
- "rpc_async_batch_size": {
- "desc": "异步模式下,发送的批量消息的最大数量。",
- "label": "异步模式下的批量消息数量"
- },
- "cluster_call_max_history": {
- "desc": "集群间调用最多保留的历史记录数。只用于排错时查看。",
- "label": "最大历史记录"
- },
- "cluster_discovery_strategy": {
- "desc": "集群节点发现方式。可选值为:\n- manual: 使用 emqx ctl cluster
命令管理集群。gen_rpc
使用 gen_rpc
库,\ndistr
使用 Erlang 自带的 rpc 库。db.default_shard_transport
中设置的值。",
- "label": "事务日志传输协议"
- },
- "common_handler_time_window": {
- "desc": "日志节流的时间窗口,在设定的时间窗口内同一事件类型的日志只被记录一次以防止日志泛滥。时间窗口结束时将生成反映该时间段内的日志活动的详细日志。该窗口的最小可设置值为1秒。zone
是按name
分组的一组配置。\n对于灵活的配置映射,可以将 name
设置为侦听器的 zone
配置。\n注:名为 default
的内置区域是自动创建的,无法删除。"
- },
- "fields_mqtt_quic_listener_certfile": {
- "desc": "证书文件。在 5.1 中会被废弃,使用 .ssl_options.certfile 代替。",
- "label": "证书文件"
- },
- "fields_rate_limit_conn_bytes_in": {
- "desc": "限制 MQTT 连接接收数据包的速率。 速率以每秒的数据包字节数计算。",
- "label": "数据包速率"
- },
- "crl_cache_capacity": {
- "desc": "缓存中可容纳的 CRL URL 的最大数量。 如果缓存的容量已满,并且必须获取一个新的 URL,那么它将驱逐缓存中插入的最老的 URL。",
- "label": "CRL 缓存容量"
- },
- "alarm_actions": {
- "desc": "警报激活时触发的动作。log
和 publish
.\nlog
将告警写入日志 (控制台或者文件).\npublish
将告警作为 MQTT 消息发布到系统主题:\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/activate
and\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/deactivate
",
- "label": "告警动作"
- },
- "base_listener_max_connections": {
- "desc": "监听器允许的最大并发连接数。",
- "label": "最大并发连接数"
- },
- "mqtt_peer_cert_as_username": {
- "desc": "使用对端证书中的 CN、DN 字段或整个证书内容来作为用户名;仅适用于 TLS 连接。\n目前支持:\n- cn
: 取证书的 CN 字段\n- dn
: 取证书的 DN 字段\n- crt
: 取 DER
或 PEM
的证书内容\n- pem
: 将 DER
证书转换为 PEM
格式作为用户名\n- md5
: 取 DER
或 PEM
证书内容的 MD5 值",
- "label": "使用对端证书作为用户名"
- },
- "fields_cache_enable": {
- "desc": "启用或禁用授权缓存。",
- "label": "启用或禁用授权缓存"
- },
- "fields_mqtt_quic_listener_disconnect_timeout_ms": {
- "desc": "在判定路径无效和断开连接之前,要等待多长时间的ACK。默认:16000",
- "label": "断开连接超时 毫秒"
- },
- "mqtt_max_topic_alias": {
- "label": "最大主题别名数"
- },
- "common_ssl_opts_schema_user_lookup_fun": {
- "desc": "用于查找预共享密钥(PSK)标识的 EMQX 内部回调。",
- "label": "SSL PSK 用户回调"
- },
- "fields_listeners_wss": {
- "desc": "HTTPS websocket 监听器。",
- "label": "HTTPS websocket 监听器"
- },
- "sysmon_top_max_procs": {
- "desc": "当 VM 中的进程数超过此值时,停止收集数据。",
- "label": "最大进程数"
- },
- "mqtt_use_username_as_clientid": {
- "desc": "是否使用用户名作为客户端 ID。 作用时间晚于 对端证书作为用户名
和 对端证书作为客户端 ID
。",
- "label": "使用用户名作为客户端 ID"
- },
- "mqtt_max_qos_allowed": {
- "label": "最大 QoS"
- },
- "fields_mqtt_quic_listener_max_binding_stateless_operations": {
- "desc": "在任何时候可以在一个绑定上排队的无状态操作的最大数量。默认值:100",
- "label": "最大绑定无状态操作"
- },
- "fields_mqtt_quic_listener_stream_recv_buffer_default": {
- "desc": "流的初始缓冲区大小。默认:4096",
- "label": "流媒体接收缓冲区默认值"
- },
- "fields_mqtt_quic_listener_pacing_enabled": {
- "desc": "有节奏的发送,以避免路径上的缓冲区过度填充。默认值:1(已启用)",
- "label": "启用节奏发送"
- },
- "mqtt_max_subscriptions": {
- "desc": "允许每个客户端建立的最大订阅数量。",
- "label": "最大订阅数量"
- },
- "persistent_session_builtin_messages_table": {
- "desc": "用于内建消息表的性能调优参数。",
- "label": "持久化消息"
- },
- "sysmon_os_cpu_low_watermark": {
- "desc": "在解除相应警报之前可以使用多少系统 CPU 的阈值,以系统CPU负载的百分比表示。",
- "label": "CPU 低水位线"
- },
- "fields_mqtt_quic_listener_tls_server_max_send_buffer": {
- "desc": "缓冲多少TLS数据。 默认值:8192",
- "label": "TLS 服务器最大发送缓冲区"
- },
- "base_listener_bind": {
- "desc": "监听套接字的 IP 地址和端口。",
- "label": "IP 地址和端口"
- },
- "server_ssl_opts_schema_handshake_timeout": {
- "desc": "握手完成所允许的最长时间",
- "label": "握手超时时间"
- },
- "fields_deflate_opts_server_context_takeover": {
- "desc": "接管意味着在服务器消息之间保留压缩状态。",
- "label": "服务上下文接管"
- },
- "mqtt_session_expiry_interval": {
- "desc": "指定会话将在连接断开后多久过期,仅适用于非 MQTT 5.0 的连接。",
- "label": "会话过期间隔"
- },
- "mqtt_message_expiry_interval": {
- "desc": "MQTT 消息的过期时间间隔。对于 MQTT 5.0 版本的客户端,此设置仅在消息未指定 Message-Expiry-Interval 属性时才会生效。对于 MQTT 3.1 和 3.1.1 版本,此设置始终适用。值得注意的是,将此值设定为大于会话过期间隔是无效的,因为一旦会话过期,所有相关消息都将被清除。",
- "label": "消息过期间隔"
- },
- "fields_listener_enabled": {
- "desc": "启停监听器。",
- "label": "启停监听器"
- },
- "mqtt": {
- "desc": "全局的 MQTT 配置项。\nmqtt 下所有的配置作为全局的默认值存在,它可以被 zone
中的配置覆盖。"
- },
- "crl_cache_refresh_http_timeout": {
- "desc": "获取 CRLs 时 HTTP 请求的超时。 该配置对所有启用 CRL 检查的监听器监听器有效。",
- "label": "CRL 缓存刷新 HTTP 超时"
- },
- "fields_tcp_opts_backlog": {
- "desc": "TCP backlog 定义了挂起连接队列可以增长到的最大长度。",
- "label": "TCP 连接队列长度"
- },
- "broker_route_batch_clean": {
- "desc": "是否开启批量清除路由。"
- },
- "fields_mqtt_quic_listener_initial_window_packets": {
- "desc": "一个连接的初始拥堵窗口的大小(以包为单位)。默认值:10",
- "label": "初始窗口数据包"
- },
- "flapping_detect_enable": {
- "desc": "启用抖动检测功能。",
- "label": "启用抖动检测"
- },
- "sysmon_top_db_password": {
- "desc": "PostgreSQL 数据库的密码",
- "label": "数据库密码"
- },
- "fields_ws_opts_check_origins": {
- "desc": "允许的 origins 列表",
- "label": "允许的 origins"
- },
- "fields_deflate_opts_client_context_takeover": {
- "desc": "接管意味着在客户端消息之间保留压缩状态。",
- "label": "客户端上下文接管"
- },
- "base_listener_acceptors": {
- "desc": "监听器接收池的大小。",
- "label": "接收器数量"
- },
- "common_ssl_opts_schema_cacertfile": {
- "desc": "受信任的PEM格式 CA 证书捆绑文件ws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt
",
- "label": "WS MQTT 路径"
- },
- "sysmon_os_procmem_high_watermark": {
- "desc": "在发出相应警报之前,一个Erlang进程可以分配多少系统内存的阈值,以系统内存的百分比表示。",
- "label": "进程内存高水位线"
- },
- "fields_listeners_quic": {
- "desc": "QUIC 监听器。",
- "label": "QUIC 监听器"
- },
- "fields_listeners_ws": {
- "desc": "HTTP websocket 监听器。",
- "label": "HTTP websocket 监听器"
- },
- "mqtt_retry_interval": {
- "desc": "QoS 1/2 消息的重新投递间隔。",
- "label": "消息重试间隔"
- },
- "stats_enable": {
- "desc": "启用/禁用统计数据收集功能。",
- "label": "启用/禁用统计数据收集功能"
- },
- "fields_authorization_deny_action": {
- "desc": "授权检查拒绝操作时的操作。",
- "label": "授权检查拒绝操作时的操作"
- },
- "fields_deflate_opts_server_max_window_bits": {
- "desc": "指定服务器压缩上下文的大小。",
- "label": "服务器压缩窗口大小"
- },
- "client_ssl_opts_schema_server_name_indication": {
- "desc": "指定要在 TLS 服务器名称指示扩展中使用的主机名。disable
阻止发送服务器名称指示扩展,并禁用主机名验证检查。",
- "label": "服务器名称指示"
- },
- "fields_mqtt_quic_listener_retry_memory_limit": {
- "desc": "在使用无状态重试之前,可用于握手连接的可用内存的百分比。计算为`N/65535`。默认值:65",
- "label": "重试内存限制"
- },
- "force_shutdown_max_message_queue_len": {
- "desc": "消息队列的最大长度。",
- "label": "进程邮箱消息队列的最大长度"
- },
- "sys_heartbeat_interval": {
- "desc": "发送心跳系统消息的间隔时间,它包括:\n - `$SYS/brokers/listeners.tcp.\\.mountpoint
设置为'some_tenant',那么客户端实际上订阅了主题'some_tenant/t'。\"\"
以禁用该功能${'{'}clientid{'}'}
: clientid\n- ${'{'}username{'}'}
: username",
- "label": "mountpoint"
- },
- "mqtt_max_awaiting_rel": {
- "desc": "为每个会话指定未收到 PUBREL 且未超时的最大 QoS 2 消息数量。超过限制后,新的 QoS 2 消息发布会被拒绝,并返回 147(0x93) 错误。",
- "label": "最大待发 PUBREL 数量"
- },
- "ciphers_schema_quic": {
- "desc": "此配置保存由逗号分隔的 TLS 密码套件名称,或作为字符串数组。例如\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"
或\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]
。\n版本
兼容('tlsv1.1'、'tlsv1.2'或'tlsv1.3')。\n不兼容的密码套件将被自动删除。\n\n例如,如果只有 versions
仅配置为 tlsv1.3
。为其他版本配置密码套件将无效。\n\ntlsv1.3
。应在ssl.versions
中禁用。\n\n\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
true
,origin
HTTP 头将根据check_origins
参数中配置的允许来源列表进行验证。",
- "label": "检查 origin"
- },
- "sysmon_vm_busy_dist_port": {
- "desc": "启用后,当用于集群接点之间 RPC 的连接过忙时,会触发一条带有 busy_dist_port
关键字的 warning 级别日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_dist_port
的 MQTT 系统消息。",
- "label": "启用分布式端口过忙监控"
- },
- "mqtt_max_mqueue_len": {
- "desc": "最大消息队列长度。持久客户端断开连接或飞行窗口已满时,允许排队的的最大消息数量。",
- "label": "最大消息队列长度"
- },
- "mqtt_max_inflight": {
- "desc": "完成应答前,最多允许同时投递的 QoS 1 和 QoS 2 消息数量。",
- "label": "最大飞行窗口"
- },
- "persistent_session_store_enabled": {
- "desc": "使用数据库存储有关持久会话的信息。\n这使得在节点停止时,可以将客户端连接迁移到另一个群集节点。",
- "label": "启用持久会话保存"
- },
- "fields_deflate_opts_level": {
- "desc": "压缩级别",
- "label": "压缩级别"
- },
- "mqtt_server_keepalive": {
- "label": "服务端 Keep Alive"
- },
- "global_authentication": {
- "desc": "全局 MQTT 监听器的默认认证配置。 为每个监听器配置认证参考监听器器配置中的authentication
配置。\n\n该配置可以被配置为:\n[]
: 默认值,允许所有的登录请求\n {'{'}enable:true,backend:\"built_in_database\",mechanism=\"password_based\"{'}'}
allow
或 deny
的结果。\n\n如果在所有的认证器都执行完后,还是没有结果,登录将被拒绝。"
- },
- "fields_mqtt_quic_listener_load_balancing_mode": {
- "desc": "0: 禁用, 1: SERVER_ID_IP, 2: SERVER_ID_FIXED. 默认: 0",
- "label": "负载平衡模式"
- },
- "persistent_session_store_session_message_gc_interval": {
- "desc": "持久会话消息的临时数据垃圾收集的开始间隔。\n这不会影响持久会话消息的生命周期长度。",
- "label": "会话消息清理间隔"
- },
- "server_ssl_opts_schema_ocsp_refresh_http_timeout": {
- "desc": "检查 OCSP 响应时,HTTP 请求的超时。",
- "label": "OCSP 刷新 HTTP 超时"
- },
- "fields_tcp_opts_send_timeout": {
- "desc": "连接的 TCP 发送超时。",
- "label": "TCP 发送超时"
- },
- "sysmon_vm_process_high_watermark": {
- "desc": "在发出相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。",
- "label": "进程数高水位线"
- },
- "fields_tcp_opts_buffer": {
- "desc": "驱动程序使用的用户空间缓冲区的大小。",
- "label": "TCP 用户态缓冲区"
- },
- "server_ssl_opts_schema_honor_cipher_order": {
- "desc": "一个重要的安全设置,它强制根据服务器指定的顺序而不是客户机指定的顺序设置密码,从而强制服务器管理员执行(通常配置得更正确)安全顺序。",
- "label": "SSL honor cipher order"
- },
- "conn_congestion_min_alarm_sustain_duration": {
- "desc": "清除警报前的最短时间。min_alarm_sustain_duration
毫秒时,主题优先级
(mqueue_priorities
) 中的主题将会使用该优先级。",
- "label": "默认主题优先级"
- },
- "client_ssl_opts_schema_enable": {
- "desc": "启用 TLS。",
- "label": "启用 TLS"
- },
- "fields_mqtt_quic_listener_mtu_discovery_missing_probe_count": {
- "desc": "在任何时候都可以在一个绑定上排队的无状态操作的最大数量。默认值:3",
- "label": "MTU发现丢失的探针数量"
- },
- "fields_tcp_opts_recbuf": {
- "desc": "连接的 TCP 接收缓冲区(OS 内核)。",
- "label": "TCP 接收缓冲区"
- },
- "sysmon_vm_process_check_interval": {
- "desc": "定期进程限制检查的时间间隔。",
- "label": "进程限制检查时间"
- },
- "fields_mqtt_quic_listener_server_resumption_level": {
- "desc": "连接恢复 和/或 0-RTT 服务器支持。默认值:0(无恢复功能)",
- "label": "服务端连接恢复支持"
- },
- "fields_ws_opts_proxy_address_header": {
- "desc": "HTTP 头,用于传递有关客户端 IP 地址的信息。\n当 EMQX 集群部署在负载平衡器后面时,这一点非常重要。",
- "label": "客户端地址头"
- },
- "sysmon_os_sysmem_high_watermark": {
- "desc": "在发出相应报警之前可以分配多少系统内存的阈值,以系统内存的百分比表示。",
- "label": "系统内存高水位线"
- },
- "fields_tcp_opts_high_watermark": {
- "desc": "当 VM 套接字实现内部排队的数据量达到此限制时,套接字将设置为忙碌状态。",
- "label": ""
- },
- "fields_mqtt_quic_listener_stateless_operation_expiration_ms": {
- "desc": "同一个对端的操作之间的时间限制,单位是毫秒。 默认:100",
- "label": "无状态操作过期 毫秒"
- },
- "server_ssl_opts_schema_dhfile": {
- "desc": "如果协商使用Diffie-Hellman密钥交换的密码套件,则服务器将使用包含PEM编码的Diffie-Hellman参数的文件的路径。如果未指定,则使用默认参数。dhfile
选项。",
- "label": "SSL dhfile"
- },
- "flapping_detect_max_count": {
- "desc": "MQTT 客户端在“窗口”时间内允许的最大断开次数。",
- "label": "最大断开次数"
- },
- "mqtt_max_topic_levels": {
- "label": "最大主题层级"
- },
- "force_shutdown_max_heap_size": {
- "desc": "Heap 的总大小。",
- "label": "Heap 的总大小"
- },
- "persistent_store_on_disc": {
- "desc": "将持久会话数据保存在磁盘上。如果为 false 则存储在内存中。\n如开启, 持久会话数据可在集群重启后恢复。\n如关闭, 数据仅存储在内存中, 则在整个集群停止后丢失。",
- "label": "持久化在磁盘上"
- },
- "mqtt_ignore_loop_deliver": {
- "desc": "设置由 MQTT v3.1.1/v3.1.0 客户端发布的消息是否将转发给其本身;类似 MQTT 5.0 协议中的 `No Local` 选项。",
- "label": "忽略循环投递"
- },
- "common_ssl_opts_schema_certfile": {
- "desc": "PEM格式证书链文件$SYS/sysmon/long_schedule
的 MQTT 系统消息。",
- "label": "启用长调度监控"
- },
- "mqtt_keepalive_multiplier": {
- "desc": "`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`,根据 MQTT 5.0,默认值为1.5。\n\n例如,如果 Keep-Alive interval 为 10 秒,那么乘以 1.5 的倍数,将产生 15 秒的超时。将倍数值增加到 2,超时将延长到 20 秒。",
- "label": "Keep Alive 倍数"
- },
- "force_gc_bytes": {
- "desc": "在进程处理过多少个字节之后,对此进程执行垃圾回收。",
- "label": "垃圾回收字节数"
- },
- "server_ssl_opts_schema_fail_if_no_peer_cert": {
- "desc": "TLS/DTLS 服务器与 {'{'}verify,verify_peer{'}'} 一起使用。\n如果设置为true,则如果客户端没有要发送的证书,即发送空证书,服务器将失败。\n如果设置为false,则仅当客户端发送无效证书(空证书被视为有效证书)时才会失败。",
- "label": "强制验证对端证书"
- },
- "fields_ws_opts_compress": {
- "desc": "如果 true
,则使用zlib
压缩 WebSocket 消息deflate_opts
下的配置项属于压缩相关参数配置。",
- "label": "Ws 压缩"
- },
- "fields_mqtt_quic_listener_keep_alive_interval": {
- "desc": "发送 PING 帧的频率,以保活连接. 设为 0 表示禁用。",
- "label": "PING 保活频率"
- },
- "fields_cache_ttl": {
- "desc": "缓存数据的生存时间。",
- "label": "缓存数据的生存时间"
- },
- "sys_topics": {
- "desc": "系统主题配置。"
- },
- "sys_event_client_subscribed": {
- "desc": "是否开启客户端已成功订阅主题事件消息。"
- },
- "sysmon_top_db_port": {
- "desc": "收集数据点的 PostgreSQL 数据库的端口。",
- "label": "数据库端口"
- },
- "fields_mqtt_quic_listener_max_operations_per_drain": {
- "desc": "每个连接操作的最大耗费操作数。默认:16",
- "label": "每次操作最大操作数"
- },
- "fields_mqtt_quic_listener_datagram_receive_enabled": {
- "desc": "宣传对QUIC Datagram 扩展的支持。为将来保留。默认为0(FALSE)",
- "label": "启用 Datagram 接收"
- },
- "fields_mqtt_quic_listener_initial_rtt_ms": {
- "desc": "初始RTT估计",
- "label": "Initial RTT 毫秒"
- },
- "overload_protection_backoff_gc": {
- "desc": "高负载时,跳过强制 GC。",
- "label": "跳过GC"
- },
- "broker_perf_route_lock_type": {
- "desc": "通配主题订阅/取消订阅性能调优。\n建议仅当通配符主题较多时才更改此参数。\n\n注:当从/更改为 `global` 锁时,它要求集群中的所有节点在更改之前停止。\n - `key`:为 Mnesia 事务涉及到的每个 key 上锁,建议单节点时使用。\n - `tab`:为 Mnesia 事务涉及到的表上锁,建议在集群中使用。\n - `global`:所以更新操作都被全局的锁保护,仅建议在超大规模集群中使用。"
- },
- "fields_tcp_opts_nodelay": {
- "desc": "连接的 TCP_NODELAY 标识",
- "label": "TCP_NODELAY"
- },
- "sysmon_top_db_username": {
- "desc": "PostgreSQL 数据库的用户名",
- "label": "数据库用户名"
- },
- "broker": {
- "desc": "Broker 相关配置项。"
- },
- "force_gc_count": {
- "desc": "在进程收到多少消息之后,对此进程执行垃圾回收。",
- "label": "垃圾回收消息数"
- },
- "mqtt_max_clientid_len": {
- "label": "最大客户端 ID 长度"
- },
- "fields_ws_opts_supported_subprotocols": {
- "desc": "逗号分隔的 subprotocols 支持列表。",
- "label": "Subprotocols 支持列表"
- },
- "broker_shared_subscription_strategy": {
- "desc": "共享订阅消息派发策略。\n - `random`:随机挑选一个共享订阅者派发;\n - `round_robin`:使用 round-robin 策略派发;\n - `round_robin_per_group`:在共享组内循环选择下一个成员;\n - `local`:选择随机的本地成员,否则选择随机的集群范围内成员;\n - `sticky`:总是使用上次选中的订阅者派发,直到它断开连接;\n - `hash_clientid`:通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者;\n - `hash_topic`:通过对源主题进行 Hash 处理来选择订阅者。"
- },
- "fields_deflate_opts_mem_level": {
- "desc": "指定压缩状态的大小false
and check_origin_enable
is true
, the server will reject requests that don't have origin
HTTP header.",
- "label": "允许 origin 缺失"
- },
- "common_ssl_opts_schema_versions": {
- "desc": "支持所有TLS/DTLS版本tlsv1.3
中使用,如果打算使用 PSK 密码套件,请确保这里配置为 [\"tlsv1.2\",\"tlsv1.1\"]
。",
- "label": "SSL 版本"
- },
- "mqtt_listener_proxy_protocol_timeout": {
- "desc": "代理协议超时。如果在超时时间内未收到代理协议数据包,EMQX将关闭TCP连接。",
- "label": "Proxy protocol 超时时间"
- },
- "fields_mqtt_quic_listener_idle_timeout": {
- "desc": "一个连接在被关闭之前可以空闲多长时间。0表示禁用。",
- "label": "空闲超时时间"
- },
- "common_ssl_opts_schema_secure_renegotiate": {
- "desc": "SSL 参数重新协商是一种允许客户端和服务器动态重新协商 SSL 连接参数的功能。\nRFC 5746 定义了一种更安全的方法。通过启用安全的重新协商,您就失去了对不安全的重新协商的支持,从而容易受到 MitM 攻击。",
- "label": "SSL 重新协商"
- },
- "sysmon_vm_busy_port": {
- "desc": "当一个系统接口(例如 TCP socket)过忙,会触发一条带有 busy_port
关键字的 warning 级别的日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_port
的 MQTT 系统消息。",
- "label": "启用端口过忙监控"
- },
- "sys_event_client_connected": {
- "desc": "是否开启客户端已连接事件消息。"
- },
- "sysmon_vm_process_low_watermark": {
- "desc": "在清除相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。",
- "label": "进程数低水位线"
- },
- "mqtt_max_packet_size": {
- "desc": "允许的最大 MQTT 报文大小,超出此大小后将断开当前客户端连接。",
- "label": "最大报文大小"
- },
- "common_ssl_opts_schema_reuse_sessions": {
- "desc": "启用 TLS 会话重用。",
- "label": "TLS 会话重用"
- },
- "common_ssl_opts_schema_depth": {
- "desc": "在有效的证书路径中,可以跟随对等证书的非自颁发中间证书的最大数量。\n因此,如果深度为0,则对等方必须由受信任的根 CA 直接签名;long_gc
关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_gc
的 MQTT 系统消息。",
- "label": "启用长垃圾回收监控"
- },
- "fields_mqtt_quic_listener_keyfile": {
- "desc": "私钥文件。在 5.1 中会被废弃,使用 .ssl_options.keyfile 代替。",
- "label": "私钥文件"
- },
- "mqtt_peer_cert_as_clientid": {
- "desc": "使用对端证书中的 CN、DN 字段或整个证书内容来作为客户端 ID。仅适用于 TLS 连接;\n目前支持:\n- cn
: 取证书的 CN 字段\n- dn
: 取证书的 DN 字段\n- crt
: 取 DER
或 PEM
证书的内容\n- pem
: 将 DER
证书内容转换为 PEM
格式作为客户端 ID\n- md5
: 取 DER
或 PEM
证书内容的 MD5 值",
- "label": "使用对端证书作为客户端 ID"
- },
- "persistent_session_store_message_gc_interval": {
- "desc": "将未送达的消息垃圾收集到持久会话的开始间隔。\n这会影响检查 \"max_retain_undelivered\"(最大保留未送达)的删除频率。",
- "label": "消息清理间隔"
- },
- "broker_shared_dispatch_ack_enabled": {
- "desc": "该配置项已废弃,会在 5.1 中移除。\n启用/禁用 QoS 1 和 QoS 2 消息的共享派发确认。\n开启后,允许将消息从未及时回复 ACK 的订阅者 (例如,客户端离线) 重新派发给另外一个订阅者。"
- },
- "base_listener_enable_authn": {
- "desc": "配置 true
(默认值)启用客户端进行身份认证,通过检查认配置的认认证器链来决定是否允许接入。\n配置 false
时,将不对客户端做任何认证,任何客户端,不论是不是携带用户名等认证信息,都可以接入。\n配置 quick_deny_anonymous
时,行为跟 true
类似,但是会对匿名\n客户直接拒绝,不做使用任何认证器对客户端进行身份检查。",
- "label": "启用身份认证"
- },
- "force_shutdown_enable": {
- "desc": "启用 `force_shutdown` 功能。",
- "label": "启用 `force_shutdown` 功能"
- },
- "broker_enable_session_registry": {
- "desc": "是否启用 Session Registry"
- },
- "overload_protection_backoff_delay": {
- "desc": "高负载时,一些不重要的任务可能会延迟执行,在这里设置允许延迟的时间。",
- "label": "延迟时间"
- },
- "ciphers_schema_common": {
- "desc": "此配置保存由逗号分隔的 TLS 密码套件名称,或作为字符串数组。例如\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"
或\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]
。\n版本
兼容('tlsv1.1'、'tlsv1.2'或'tlsv1.3')。\n不兼容的密码套件将被自动删除。\n\n例如,如果只有 versions
仅配置为 tlsv1.3
。为其他版本配置密码套件将无效。\n\ntlsv1.3
。应在ssl.versions
中禁用。\n\n\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
",
- "label": ""
- },
- "sys_event_client_disconnected": {
- "desc": "是否开启客户端已断开连接事件消息。"
- },
- "crl_cache_refresh_interval": {
- "desc": "从服务器刷新CRL的周期。 该配置对所有 URL 和监听器有效。",
- "label": "CRL 缓存刷新间隔"
- },
- "mqtt_listener_proxy_protocol": {
- "desc": "如果EMQX集群部署在 HAProxy 或 Nginx 之后,请启用代理协议 V1/2 true
,当客户端未携带Sec WebSocket Protocol
字段时,服务器将返回一个错误。\nlarge_heap
关键字的\nwarning 级别日志。同时还会发布一条主题为 $SYS/sysmon/busy_dist_port
的 MQTT 系统消息。",
- "label": "启用大 heap 监控"
- },
- "mqtt_shared_subscription_strategy": {
- "label": "共享订阅策略",
- "desc": "共享订阅的调度策略。对端证书作为用户名
和 对端证书作为客户端 ID
。',
+ label: '使用用户名作为客户端 ID',
+ },
+ idle_timeout: {
+ desc: '设置连接被断开或进入休眠状态前的等待时间,空闲超时后\n\n- 如暂未收到客户端的 CONNECT 报文,连接将断开;\n- 如已收到客户端的 CONNECT 报文,连接将进入休眠模式以节省系统资源。\n\n注意:请合理设置该参数值,如等待时间设置过长,可能造成系统资源的浪费。',
+ label: '空闲超时',
+ },
+ strict_mode: {
+ desc: '是否以严格模式解析 MQTT 消息。严格模式下,如客户端 ID、主题名称等中包含无效 utf8 字符串,连接将被断开。',
+ label: '严格模式',
+ },
+ shared_subscription: {
+ label: '允许共享订阅',
+ },
+ server_keepalive: {
+ label: '服务端 Keep Alive',
+ },
+ wildcard_subscription: {
+ label: '允许通配符订阅',
+ },
+ max_clientid_len: {
+ label: '最大客户端 ID 长度',
+ },
+ response_information: {
+ desc: 'UTF-8 字符串,用于指定返回给客户端的响应主题,如 `reqrsp/`,此时请求和应答客户端都需要使用 `reqrsp/` 前缀的主题来完成通讯。如希望禁用此功能,请在下方的文字框中输入`""`;仅适用于 MQTT 5.0 客户端。',
+ label: '响应信息',
+ },
+ shared_subscription_initial_sticky_pick: {
+ label: '共享订阅初始 Sticky 选择策略',
+ desc: '当`共享订阅策略`设置为 `sticky` 时,用于初始订阅者选择的策略:cn
: 取证书的 CN 字段\n- dn
: 取证书的 DN 字段\n- crt
: 取 DER
或 PEM
的证书内容\n- pem
: 将 DER
证书转换为 PEM
格式作为用户名\n- md5
: 取 DER
或 PEM
证书内容的 MD5 值',
+ label: '使用对端证书作为用户名',
+ },
+ client_attrs_init: {
+ label: '客户端属性',
+ desc: "指定如何初始化客户端属性。cn
: 取证书的 CN 字段\n- dn
: 取证书的 DN 字段\n- crt
: 取 DER
或 PEM
证书的内容\n- pem
: 将 DER
证书内容转换为 PEM
格式作为客户端 ID\n- md5
: 取 DER
或 PEM
证书内容的 MD5 值',
+ label: '使用对端证书作为客户端 ID',
+ },
+ keepalive_multiplier: {
+ desc: '`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`,根据 MQTT 5.0,默认值为1.5。\n\n例如,如果 Keep-Alive interval 为 10 秒,那么乘以 1.5 的倍数,将产生 15 秒的超时。将倍数值增加到 2,超时将延长到 20 秒。',
+ label: 'Keep Alive 倍数',
+ },
+ shared_subscription_strategy: {
+ label: '共享订阅策略',
+ desc: '共享订阅的调度策略。主题优先级
(mqueue_priorities
) 中的主题将会使用该优先级。',
+ label: '默认主题优先级',
+ },
+ mqueue_store_qos0: {
+ desc: '在连接断开但会话保持期间,是否需要在消息队列中存储 QoS 0 消息。',
+ label: '存储 QoS 0 消息',
+ },
+ /* SESSION END */
+ /* LOG START */
+ enable: {
+ desc: '启用此日志处理进程。',
+ label: '启用日志处理进程',
+ },
+ level: {
+ desc: '当前日志处理进程的日志级别。\n默认为 warning 级别。',
+ label: '日志级别',
+ },
+ log_file_default_path: {
+ desc: '日志文件路径及名字。',
+ label: '日志文件名字',
+ },
+ payload_encode: {
+ desc: '日志中 Payload 的编码方式。',
+ label: 'Payload 编码',
+ },
+ rotation_count: {
+ desc: '轮换的最大日志文件数。',
+ label: '最大日志文件数',
+ },
+ rotation_size: {
+ desc: '此参数控制日志文件轮换。 `infinity` 意味着日志文件将无限增长,否则日志文件将在达到 `max_size`(以字节为单位)时进行轮换。\n与 rotation count配合使用。如果 counter 为 10,则是10个文件轮换。',
+ label: '日志文件轮换大小',
+ },
+ time_offset: {
+ desc: '日志中的时间戳使用的时间偏移量。\n可选值为:\n - system
: 本地系统使用的时区偏移量\n - utc
: 0 时区的偏移量\n - +-[hh]:[mm]
: 自定义偏移量,比如 "-02:00" 或者 "+00:00"\n默认值为本地系统的时区偏移量:system
。',
+ label: '时间偏移量',
+ },
+ timestamp_format: {
+ desc: '选择时间戳格式:auto
:根据日志的格式自动选择最合适的时间戳格式。对于 JSON 使用 epoch
,对于文本则使用 rfc3339
。epoch
:表示为自 Unix 纪元起的微秒数。rfc3339
:遵循 RFC3339 标准的时间格式。',
+ label: '时间戳格式',
+ },
+ formatter: {
+ desc: '选择日志格式类型。 text
用于纯文本,json
用于结构化日志记录。',
+ label: '日志格式类型',
+ },
+ time_window: {
+ desc: '日志节流的时间窗口,在设定的时间窗口内同一事件类型的日志只被记录一次以防止日志泛滥。时间窗口结束时将生成反映该时间段内的日志活动的详细日志。该窗口的最小可设置值为1秒。busy_dist_port
关键字的 warning 级别日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_dist_port
的 MQTT 系统消息。',
+ label: '启用分布式端口过忙监控',
+ },
+ busy_port: {
+ desc: '当一个系统接口(例如 TCP socket)过忙,会触发一条带有 busy_port
关键字的 warning 级别的日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_port
的 MQTT 系统消息。',
+ label: '启用端口过忙监控',
+ },
+ large_heap: {
+ desc: '当进程占用的堆内存超过 large_heap 指定的大小时,系统会触发一条带有 large_heap
关键字的 warning 级别日志。同时还会发布一条主题为 $SYS/sysmon/large_heap
的 MQTT 系统消息。',
+ label: '启用大 heap 监控',
+ },
+ long_gc: {
+ desc: '当系统检测到某个 Erlang 进程垃圾回收占用过长时间,会触发一条带有 long_gc
关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_gc
的 MQTT 系统消息。',
+ label: '启用长垃圾回收监控',
+ },
+ long_schedule: {
+ desc: "启用后,如果 Erlang VM 调度器出现某个任务占用时间过长时,会触发一条带有 'long_schedule' 关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_schedule
的 MQTT 系统消息。",
+ label: '启用长调度监控',
+ },
+ process_check_interval: {
+ desc: '定期进程限制检查的时间间隔。',
+ label: '进程限制检查时间',
+ },
+ process_high_watermark: {
+ desc: '在发出相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。',
+ label: '进程数高水位线',
+ },
+ process_low_watermark: {
+ desc: '在清除相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。',
+ label: '进程数低水位线',
+ },
+}
diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts
index 4fe5ca9f4..e662f80a6 100644
--- a/src/shims-vue.d.ts
+++ b/src/shims-vue.d.ts
@@ -8,9 +8,17 @@ declare module '*.vue' {
export default component
}
+declare module 'vuex' {
+ export * from 'vuex/types/index.d.ts'
+ export * from 'vuex/types/helpers.d.ts'
+ export * from 'vuex/types/logger.d.ts'
+ export * from 'vuex/types/vue.d.ts'
+}
+
declare module '@/common/highlight/sql'
+declare module '@/common/highlight/bash'
declare module 'js-sql-parser'
-declare module 'highlight.js/lib/core'
-declare module 'highlight.js/lib/languages/sql'
+declare module 'highlight.js/*'
+declare module 'monaco-editor/esm/vs/basic-languages/sql/sql'
declare module 'hocon-parser'
declare module 'github-markdown-css/*.css'
diff --git a/src/store/index.ts b/src/store/index.ts
index d57c57aca..366c80a56 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -1,6 +1,4 @@
-import { createStore } from 'vuex'
import { getUser, setUser, removeUser } from '@/common/auth'
-import { DEFAULT_CLIENT_TABLE_COLUMNS } from '@/common/constants'
import { UserInfo } from '@/types/common'
import { TestRuleTarget } from '@/types/enum'
import { RuleEvent } from '@/types/rule'
@@ -176,7 +174,7 @@ export default createStore({
},
isDev() {
return false
- // return process.env.NODE_ENV === 'development'
+ // return import.meta.env.DEV
},
getSchema(state) {
return (key: string) => {
diff --git a/src/style/common.scss b/src/style/common.scss
index d7f0f5234..0d8484bd5 100644
--- a/src/style/common.scss
+++ b/src/style/common.scss
@@ -2,7 +2,8 @@
@use './themes/dark.scss';
@use 'normalize.scss';
@use '@/style/schemaForm.scss';
-@use "sass:math";
+@use './variables.scss';
+@use 'sass:math';
@font-face {
font-family: 'Roboto';
@@ -41,15 +42,12 @@
src: url(../assets/fonts/Roboto-BlackItalic.ttf) format('truetype');
}
-$font: Roboto, -apple-system, BlinkMacSystemFont, PingFang SC, Hiragino Sans GB, Helvetica Neue,
- Helvetica, Arial, sans-serif;
-
body {
padding: 0;
margin: 0;
color: var(--el-text-color-primary);
font-size: 14px;
- font-family: $font;
+ font-family: variables.$font;
background-color: var(--color-bg);
}
@@ -69,7 +67,7 @@ a {
textarea,
code {
- font-family: $font;
+ font-family: variables.$font;
}
img {
@@ -120,6 +118,9 @@ p.description {
&.with-padding-top {
padding-top: 32px;
}
+ &.with-padding-bottom {
+ padding-bottom: 32px;
+ }
}
.app-wrapper-compact {
@@ -173,6 +174,11 @@ p.description {
.el-date-editor {
width: 100%;
}
+ .col-oper {
+ display: flex !important;
+ align-items: center;
+ justify-content: flex-end;
+ }
}
.emq-table-footer {
@@ -228,22 +234,22 @@ p.description {
}
.g-coap::before {
- background-image: url('~@/assets/gateway/coap.png');
+ background-image: url('@/assets/gateway/coap.png');
}
.g-lwm2m::before {
- background-image: url('~@/assets/gateway/lwm2m.png');
+ background-image: url('@/assets/gateway/lwm2m.png');
}
.g-mqttsn::before {
- background-image: url('~@/assets/gateway/mqttsn.png');
+ background-image: url('@/assets/gateway/mqttsn.png');
}
.g-stomp::before {
- background-image: url('~@/assets/gateway/stomp.png');
+ background-image: url('@/assets/gateway/stomp.png');
}
.g-tcp::before {
- background-image: url('~@/assets/gateway/tcp.png');
+ background-image: url('@/assets/gateway/tcp.png');
}
.g-exproto::before {
- background-image: url('~@/assets/gateway/exproto.png');
+ background-image: url('@/assets/gateway/exproto.png');
}
.section-header {
@@ -750,10 +756,15 @@ code {
padding: 0.25rem 0.5rem;
margin: 0;
color: var(--color-text-mdcode);
- font-size: .85em;
+ font-size: 0.85em;
border-radius: 3px;
background-color: var(--color-bg-mdcode);
- font-family: Menlo, Monaco, Consolas, Courier New, monospace;
+ font-family:
+ Menlo,
+ Monaco,
+ Consolas,
+ Courier New,
+ monospace;
}
[data-theme='dark'] {
@@ -885,14 +896,26 @@ code {
}
.vue-flow__handle-left {
- left: math.div(-$handle-size, 2)
+ left: math.div(-$handle-size, 2);
}
.vue-flow__handle-right {
- right: math.div(-$handle-size, 2)
+ right: math.div(-$handle-size, 2);
}
.vue-flow__handle {
--vf-handle: #babcbe;
}
}
+
+label.custom-required::after {
+ content: '*';
+ color: var(--el-color-danger);
+ margin-left: 4px;
+}
+
+.el-table__cell.overflow-visible {
+ .cell {
+ overflow: visible;
+ }
+}
diff --git a/src/style/management.scss b/src/style/management.scss
index 4cf23ca32..7b5cf76d8 100644
--- a/src/style/management.scss
+++ b/src/style/management.scss
@@ -5,12 +5,6 @@
.section-header {
margin-top: 0;
}
-
- .col-oper {
- display: flex !important;
- align-items: center;
- justify-content: flex-end;
- }
.show-more {
font-size: 18px;
cursor: pointer;
diff --git a/src/style/normalize.scss b/src/style/normalize.scss
index d0a6f0f26..0b346b6d4 100644
--- a/src/style/normalize.scss
+++ b/src/style/normalize.scss
@@ -1,6 +1,7 @@
-@use "sass:math";
+@use 'sass:math';
+@use 'sass:color';
/* Components Reset Colors */
-@forward "element-plus/theme-chalk/src/common/var.scss" with (
+@forward 'element-plus/theme-chalk/src/common/var.scss' with (
$main: (
'padding': 0px,
),
@@ -42,10 +43,10 @@
),
$drawer: (
'bg-color': var(--color-bg-content),
- ),
+ )
);
-@use "element-plus/theme-chalk/src/index";
+@use 'element-plus/theme-chalk/src/index';
/* Root Colors */
:root {
@@ -56,13 +57,16 @@
--el-text-color-secondary: var(--color-text-secondary);
--el-disabled-text-color: var(--color-text-primary);
--el-border-color-light: var(--color-border-normal);
- --el-color-success: #00B173;
- --el-color-danger: #EB4E3D;
- --el-color-warning: #F19710;
- --el-color-info: #7A7B80;
+ --el-color-success: #00b173;
+ --el-color-danger: #eb4e3d;
+ --el-color-warning: #f19710;
+ --el-color-info: #7a7b80;
--el-box-shadow-light: var(--color-shadow-primary) 0px 4px 12px;
--el-border: 1px solid var(--color-border-primary);
--el-fill-color-light: var(--color-bg-split);
+ --el-fill-color-blank: var(--color-bg-content);
+ --el-border-color: var(--color-border-primary);
+ --el-menu-hover-bg-color: var(--color-bg-split);
}
/* Menu */
@@ -89,7 +93,7 @@
border-left: 4px solid transparent;
color: #ffffffd9;
&:hover {
- background-color: #1F303C;
+ background-color: #1f303c;
border-radius: 8px;
}
}
@@ -115,11 +119,11 @@
min-width: initial;
&.is-active {
color: #fff;
- background-color: #1F303C;
+ background-color: #1f303c;
border-radius: 8px;
}
&:hover {
- background-color: #1F303C;
+ background-color: #1f303c;
border-radius: 8px;
}
}
@@ -141,17 +145,19 @@
color: #ffffffd9;
&.is-active {
color: #fff;
- background-color: #1F303C;
+ background-color: #1f303c;
}
&:hover {
color: #fff;
- background-color: #1F303C;
+ background-color: #1f303c;
}
}
}
&.el-menu--horizontal {
+ height: auto;
background-color: transparent;
border-bottom: 1px solid var(--color-border-card);
+ margin-bottom: 32px;
& > .el-menu-item {
height: 36px;
padding: 0px 12px;
@@ -161,11 +167,10 @@
color: var(--color-primary);
}
}
- margin-bottom: 32px;
}
&.el-menu--collapse {
- >.el-sub-menu.is-active .el-sub-menu__title {
- background-color: #1F303C;
+ > .el-sub-menu.is-active .el-sub-menu__title {
+ background-color: #1f303c;
color: #fff;
}
}
@@ -177,7 +182,7 @@
&:before,
.el-table__inner-wrapper:after,
.el-table__inner-wrapper:before {
- content: "" !important;
+ content: '' !important;
position: absolute;
background-color: transparent;
pointer-events: none;
@@ -239,7 +244,8 @@
}
}
.el-table__row:last-child {
- th.el-table__cell.is-leaf, td.el-table__cell {
+ th.el-table__cell.is-leaf,
+ td.el-table__cell {
border-bottom: none;
}
}
@@ -251,6 +257,7 @@
& + .el-dropdown {
margin-left: 0;
margin-right: 12px;
+ vertical-align: middle;
}
}
}
@@ -301,7 +308,7 @@
color: var(--color-text-primary) !important;
}
.el-progress-bar__inner {
- background: linear-gradient(135deg, #0AD18E 0%, #03A4A5 100%);
+ background: linear-gradient(135deg, #0ad18e 0%, #03a4a5 100%);
}
.el-progress-bar {
&__outer {
@@ -349,7 +356,7 @@
/* Tabs Card */
.el-tabs--card {
- &>.el-tabs__header {
+ & > .el-tabs__header {
border-bottom: 1px solid var(--color-border-card);
margin-bottom: 0px;
.el-tabs__nav {
@@ -363,7 +370,10 @@
outline: none;
border-left: none;
border-top: 2px solid transparent;
- transition: border-top 0.3s, color 0.3s, padding 0.3s;
+ transition:
+ border-top 0.3s,
+ color 0.3s,
+ padding 0.3s;
&.is-active,
.is-focus {
outline: none;
@@ -376,33 +386,38 @@
}
@mixin border-gradient($from, $to, $weight: 0) {
- $mix-main: mix($from, $to);
- $mix-sub-from: mix($mix-main, $from);
- $mix-sub-to: mix($mix-main, $to);
-
- box-shadow: 0 1px 0 $weight rgba($mix-sub-to, .25),
- 0 -1px 0 $weight rgba($mix-sub-from, .25),
- 1px 0 0 $weight rgba($mix-sub-to, .25),
- -1px 0 0 $weight rgba($mix-sub-from, .25),
- 1px -1px 0 $weight rgba($mix-main, .5),
- -1px 1px 0 $weight rgba($mix-main, .5),
- 1px 1px 0 $weight rgba($to, .75),
- -1px -1px 0 $weight rgba($from, .75);
+ $mix-main: color.mix($from, $to);
+ $mix-sub-from: color.mix($mix-main, $from);
+ $mix-sub-to: color.mix($mix-main, $to);
+
+ box-shadow:
+ 0 1px 0 $weight rgba($mix-sub-to, 0.25),
+ 0 -1px 0 $weight rgba($mix-sub-from, 0.25),
+ 1px 0 0 $weight rgba($mix-sub-to, 0.25),
+ -1px 0 0 $weight rgba($mix-sub-from, 0.25),
+ 1px -1px 0 $weight rgba($mix-main, 0.5),
+ -1px 1px 0 $weight rgba($mix-main, 0.5),
+ 1px 1px 0 $weight rgba($to, 0.75),
+ -1px -1px 0 $weight rgba($from, 0.75);
}
/* Button */
.el-button {
&.el-button--primary:not(.is-link) {
- background: linear-gradient(135deg, #0AD18E 0%, #03A4A5 100%);
+ background: linear-gradient(135deg, #0ad18e 0%, #03a4a5 100%);
border: none;
color: #fff;
&.is-plain {
background: var(--color-bg-content);
color: var(--color-primary);
@include border-gradient(#7ad8b3, #6dbebe);
+ &:not(.el-button--small, .el-button--large) {
+ // the border is shadow, so we need to set the height to 30px (32 - 2)
+ height: 30px;
+ }
}
&:hover {
- background: linear-gradient(135deg, #53DEB0 0%, #4EBFC0 100%);
+ background: linear-gradient(135deg, #53deb0 0%, #4ebfc0 100%);
color: #fff;
}
&.is-disabled {
@@ -410,8 +425,8 @@
&:hover,
&:focus,
&:active {
- background: linear-gradient(135deg, #CDF5E8 0%, #CCEDED 100%);
- color: #86DBC1;
+ background: linear-gradient(135deg, #cdf5e8 0%, #cceded 100%);
+ color: #86dbc1;
}
}
}
@@ -419,7 +434,7 @@
min-height: 22px;
padding: 4px 9px;
}
- &+.el-dropdown {
+ & + .el-dropdown {
margin-left: 10px;
}
}
@@ -438,12 +453,15 @@
.el-button.is-link.is-disabled:active {
--el-color-primary-light-5: #86dbc1;
}
+.el-button:focus-visible {
+ outline: none;
+}
/* Dropdown */
.el-dropdown-menu {
background: var(--color-bg-content);
}
-.el-dropdown__popper.el-popper[role=tooltip] {
+.el-dropdown__popper.el-popper[role='tooltip'] {
background: var(--color-bg-content);
}
.el-dropdown-menu__item:not(.is-disabled):hover {
@@ -490,11 +508,11 @@
}
/* Select */
-.el-select__popper.el-popper[role=tooltip] .el-popper__arrow::before {
+.el-select__popper.el-popper[role='tooltip'] .el-popper__arrow::before {
border: 1px solid var(--color-border-normal);
background: var(--color-bg-content);
}
-.el-select__popper.el-popper[role=tooltip] {
+.el-select__popper.el-popper[role='tooltip'] {
background: var(--color-bg-content);
}
.el-select .el-select__tags .el-tag--info {
@@ -507,7 +525,7 @@
}
.el-input.is-disabled {
&.el-input-group--append .el-input-group__append .el-select .el-input .el-input__wrapper,
- &.el-input-group--append .el-input-group__append {
+ &.el-input-group--append .el-input-group__append {
box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset;
}
@@ -525,7 +543,6 @@
}
}
-
/* Date Edtior */
.el-date-editor {
--el-date-editor-width: 100%;
@@ -541,14 +558,14 @@
}
.el-date-table td.in-range .el-date-table-cell:hover,
.el-date-table td.in-range .el-date-table-cell {
- background-color: var(--color-bg-split);
+ background-color: var(--color-bg-split);
}
.el-picker-panel .el-time-panel {
background-color: var(--color-bg-content);
}
-.el-picker-panel *[slot=sidebar],
+.el-picker-panel *[slot='sidebar'],
.el-picker-panel__sidebar {
background-color: var(--color-bg-content);
}
@@ -572,15 +589,15 @@
.el-step__icon {
background-color: var(--color-primary);
border: none;
- &::before {
- position: absolute;
- content: '';
- border-radius: 50%;
- left: -4px;
- width: 32px;
- height: 32px;
- background-color: #00b17333;
- }
+ &::before {
+ position: absolute;
+ content: '';
+ border-radius: 50%;
+ left: -4px;
+ width: 32px;
+ height: 32px;
+ background-color: #00b17333;
+ }
}
}
}
@@ -597,7 +614,9 @@
.el-popper {
font-size: 13px;
line-height: 1.6;
- &:not(.el-select__popper):not(.el-picker__popper):not(.is-wider):not(.el-cascader__dropdown):not(.el-autocomplete__popper) {
+ &:not(.el-select__popper):not(.el-picker__popper):not(.is-wider):not(.el-cascader__dropdown):not(
+ .el-autocomplete__popper
+ ) {
max-width: 330px;
}
&.is-wider {
@@ -635,8 +654,8 @@
font-weight: normal;
border-radius: 8px;
&.el-tag--danger {
- background-color: #FCECEC;
- border: 1px solid #E44242;
+ background-color: #fcecec;
+ border: 1px solid #e44242;
}
&.el-tag--info {
border: 1px solid var(--color-border-primary);
@@ -658,6 +677,7 @@
/* Message */
.el-message {
+ align-items: flex-start;
padding: 16px;
border-radius: 8px;
box-shadow: var(--el-notification-shadow);
@@ -671,26 +691,26 @@
word-break: break-all;
}
.el-message__closeBtn {
- transform: none;
- top: 16px + math.div(14px * 0.5, 2);
+ transform: translateY(3px);
color: #343741;
font-size: 14px;
}
&--success {
- border: 1px solid #00A890;
- background-color: #E2FFF5;
+ border: 1px solid #00a890;
+ background-color: #e2fff5;
}
&--error {
- border: 1px solid #EB4E3D;
- background-color: #FFE9E7;
+ border: 1px solid #eb4e3d;
+ background-color: #ffe9e7;
}
&--warning {
- border: 1px solid #F19710;
- background-color: #FFF0DA;
+ border: 1px solid #f19710;
+ background-color: #fff0da;
}
- &--message, &--info {
- border: 1px solid #469CF7;
- background-color: #E6EEFF;
+ &--message,
+ &--info {
+ border: 1px solid #469cf7;
+ background-color: #e6eeff;
}
}
@@ -711,19 +731,19 @@
/* Card */
.el-card {
+ border: 1px solid var(--color-border-card);
+ position: relative;
&.is-always-shadow {
box-shadow: none;
}
- border: 1px solid var(--color-border-card);
&.allow-overflow {
overflow: visible;
}
- position: relative;
&.top-border,
&.top-primary {
&:before {
position: absolute;
- content: "";
+ content: '';
top: 0px;
left: 0px;
width: 100%;
@@ -753,7 +773,7 @@
}
}
}
-.el-form-item__content>.el-row {
+.el-form-item__content > .el-row {
width: 100%;
}
.el-form-item__label {
@@ -783,7 +803,6 @@
}
}
-
/* Description */
.el-descriptions {
.el-descriptions__title {
@@ -833,11 +852,14 @@
}
/* Pagination */
-.el-pagination.is-background .btn-prev:disabled, .el-pagination.is-background .btn-next:disabled {
- color: #D0D4DC;
+.el-pagination.is-background .btn-prev:disabled,
+.el-pagination.is-background .btn-next:disabled {
+ color: #d0d4dc;
background-color: var(--color-bg-content);
}
-.el-pagination.is-background .btn-prev, .el-pagination.is-background .btn-next, .el-pagination.is-background .el-pager li {
+.el-pagination.is-background .btn-prev,
+.el-pagination.is-background .btn-next,
+.el-pagination.is-background .el-pager li {
border-radius: 8px;
border: 1px solid var(--color-border-primary);
background-color: var(--color-bg-content);
@@ -901,7 +923,7 @@
}
}
-/* Skeleton */
+/* Skeleton */
[data-theme='dark'] {
.el-skeleton {
--el-skeleton-color: #323947;
@@ -928,7 +950,6 @@
padding: 16px 24px;
margin-right: 0;
border-bottom: 1px solid var(--color-border-card);
-
}
.el-dialog__body {
diff --git a/src/style/rule.scss b/src/style/rule.scss
index b46832a71..a37ff0af8 100644
--- a/src/style/rule.scss
+++ b/src/style/rule.scss
@@ -40,6 +40,13 @@
.detail-header img {
height: 40px;
}
+ .block-title {
+ max-width: 400px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: nowrap;
+ margin: 0;
+ }
.info-tags {
.el-tag,
.node-status {
@@ -192,6 +199,9 @@
}
}
}
+ a.io-item {
+ color: unset;
+ }
.btn-add {
margin-top: 24px;
:deep(span) {
@@ -205,6 +215,7 @@
}
.delete-second-confirm {
+ padding: 0px 16px 4px;
.el-dialog__header {
display: none;
}
diff --git a/src/style/themes/dark.scss b/src/style/themes/dark.scss
index 4b8fba4ea..8b1cbd910 100644
--- a/src/style/themes/dark.scss
+++ b/src/style/themes/dark.scss
@@ -1,14 +1,15 @@
[data-theme='dark'] {
/* Background */
- --color-bg: #18191D;
+ --color-bg: #18191d;
--color-bg-content: #212429;
- --color-bg-split: #272B32;
+ --color-bg-split: #272b32;
--color-bg-main: #17181b;
--color-bg-popper: #fff;
--color-bg-trans: #212429e6;
--color-bg-lighter: #323a48;
--color-bg-mdcode: #ffffff14;
- --color-bg-table-hd: #353A41;
+ --color-bg-details: #1b2028ed;
+ --color-bg-table-hd: #353a41;
/* Text */
--color-text-primary: #fff;
--color-text-secondary: #d2d3d5;
diff --git a/src/style/themes/light.scss b/src/style/themes/light.scss
index 12d8bf349..7fb8eec47 100644
--- a/src/style/themes/light.scss
+++ b/src/style/themes/light.scss
@@ -2,25 +2,26 @@
/* Background */
--color-bg: #071927;
--color-bg-content: #fff;
- --color-bg-split: #F8FAFE;
+ --color-bg-split: #f8fafe;
--color-bg-main: #f9fafb;
--color-bg-popper: #282e38;
--color-bg-trans: #ffffffe6;
- --color-bg-lighter: #E6EDFB;
+ --color-bg-lighter: #e6edfb;
--color-bg-mdcode: #f4f4f4;
- --color-bg-table-hd: #EEF0F5;
+ --color-bg-details: #ffffffed;
+ --color-bg-table-hd: #eef0f5;
/* Text */
--color-text-primary: #343741;
--color-text-secondary: #5a5f6f;
- --color-text-placeholder: #BAC1CD;
+ --color-text-placeholder: #bac1cd;
--color-text-popper: #fff;
--color-title-primary: #192144;
--color-text-footer: #8e8e8e;
- --color-text-mdcode: #EB4E3D;
+ --color-text-mdcode: #eb4e3d;
--color-text-progress: #1f3547a8;
/* Border */
- --color-border-primary: #D0D4DC;
- --color-border-card: #E2E6F0;
+ --color-border-primary: #d0d4dc;
+ --color-border-card: #e2e6f0;
--color-border-normal: #eeedf6;
/* Colors */
--color-primary: #00b173;
diff --git a/src/style/variables.scss b/src/style/variables.scss
new file mode 100644
index 000000000..271a111cb
--- /dev/null
+++ b/src/style/variables.scss
@@ -0,0 +1,10 @@
+$font:
+ Roboto,
+ -apple-system,
+ BlinkMacSystemFont,
+ PingFang SC,
+ Hiragino Sans GB,
+ Helvetica Neue,
+ Helvetica,
+ Arial,
+ sans-serif;
diff --git a/src/types/auth.d.ts b/src/types/auth.d.ts
index 94e9a9e71..0de1d7d7d 100644
--- a/src/types/auth.d.ts
+++ b/src/types/auth.d.ts
@@ -1,5 +1,6 @@
import { MetricsDataWithExtraData } from './common'
-import { BannedType, ConnectionStatus } from './enum'
+import { BannedType, ConnectionStatus, QoSLevel } from './enum'
+import { AuthzRuleAction, AuthzRulePermission } from './typeAlias'
export interface AuthzSetting {
deny_action: 'ignore' | 'disconnect'
@@ -49,9 +50,14 @@ export interface AuthnItem {
}
export interface BuiltInDBRule {
- permission: string
- action: string
+ permission: AuthzRulePermission
+ action: AuthzRuleAction
topic: string
+ qos?: Array{{ item }}
+ +{{ item }}
+{{ tl('promSetupHelpDesc') }}
-{{ tl('promConfigDesc') }}
-- {{ tl('nodeExporterDesc') }} - - {{ tl('installNodeExporter') }} - -
-{{ tl('promRun') }}
-{{ tl('promStepThree') }}
-{{ tl('clickDownloadTemplateDesc') }}
-{{ tl('promStepOne') }}
-- {{ tl('nodeExporterDesc') }} - - {{ tl('installNodeExporter') }} - -
- -{{ tl('promStepTwo') }}
-{{ tl('promRun') }}
-{{ tl('promStepThree') }}
-{{ tl('clickDownloadTemplateDesc') }}
-