From 49565f93467d6645831a1fe4a8b91532a1b7a751 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger <47644445+meienberger@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:26:01 +0200 Subject: [PATCH] Wraithers mqttx (#3715) * Create docker-compose.yml * Create config.json * Create description.md * Remove logo at the top of description.md * Upload logo * Rename logo1.jpg to logo.jpg * Update usage option for local Eclipse Mosquitto broker * Update port to unused The Google Doc listing ports (https://docs.google.com/spreadsheets/d/13U8MNCOiQjR4XohNCl9-CrmqS8_CA-oFEy3wrnJBJks/edit?usp=sharing) was outdated. The new table view in the Tipi Appstore helped me find the port clash. * fix(mqttx): fix description, logo and domain exposition --------- Co-authored-by: Wraithers <4705057+Wraithers@users.noreply.github.com> --- apps/mqttx/config.json | 21 ++++++ apps/mqttx/docker-compose.yml | 37 +++++++++++ apps/mqttx/metadata/description.md | 103 +++++++++++++++++++++++++++++ apps/mqttx/metadata/logo.jpg | Bin 0 -> 34439 bytes 4 files changed, 161 insertions(+) create mode 100644 apps/mqttx/config.json create mode 100644 apps/mqttx/docker-compose.yml create mode 100644 apps/mqttx/metadata/description.md create mode 100644 apps/mqttx/metadata/logo.jpg diff --git a/apps/mqttx/config.json b/apps/mqttx/config.json new file mode 100644 index 00000000..7ae70b4d --- /dev/null +++ b/apps/mqttx/config.json @@ -0,0 +1,21 @@ +{ + "name": "MQTTX", + "available": true, + "exposable": true, + "port": 8217, + "id": "mqttx", + "tipi_version": 1, + "version": "v1.9.10", + "categories": [ + "utilities" + ], + "description": "MQTTX Web is an open-source MQTT browser client and an online MQTT WebSocket client tool.", + "short_desc": "MQTT websocket browser client tool", + "author": "EMQX", + "source": "https://github.com/emqx/MQTTX/", + "form_fields": [], + "supported_architectures": [ + "arm64", + "amd64" + ] +} diff --git a/apps/mqttx/docker-compose.yml b/apps/mqttx/docker-compose.yml new file mode 100644 index 00000000..e4bc17a3 --- /dev/null +++ b/apps/mqttx/docker-compose.yml @@ -0,0 +1,37 @@ +services: + mqttx: + image: emqx/mqttx-web:v1.9.10 + container_name: 'mqttx' + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/mqttx:/app/data + - /etc/localtime:/etc/localtime:ro + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.mqttx-web-redirect.redirectscheme.scheme: https + traefik.http.services.mqttx.loadbalancer.server.port: 80 + # Web + traefik.http.routers.mqttx-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.mqttx-insecure.entrypoints: web + traefik.http.routers.mqttx-insecure.service: mqttx + traefik.http.routers.mqttx-insecure.middlewares: mqttx-web-redirect + # Websecure + traefik.http.routers.mqttx.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.mqttx.entrypoints: websecure + traefik.http.routers.mqttx.service: mqttx + traefik.http.routers.mqttx.tls.certresolver: myresolver + # Local domain + traefik.http.routers.mqttx-local-insecure.rule: Host(`mqttx.${LOCAL_DOMAIN}`) + traefik.http.routers.mqttx-local-insecure.entrypoints: web + traefik.http.routers.mqttx-local-insecure.service: mqttx + traefik.http.routers.mqttx-local-insecure.middlewares: mqttx-web-redirect + # Local domain secure + traefik.http.routers.mqttx-local.rule: Host(`mqttx.${LOCAL_DOMAIN}`) + traefik.http.routers.mqttx-local.entrypoints: websecure + traefik.http.routers.mqttx-local.service: mqttx + traefik.http.routers.mqttx-local.tls: true diff --git a/apps/mqttx/metadata/description.md b/apps/mqttx/metadata/description.md new file mode 100644 index 00000000..d664a54d --- /dev/null +++ b/apps/mqttx/metadata/description.md @@ -0,0 +1,103 @@ +[MQTTX](https://mqttx.app) is a cross-platform [MQTT 5.0](https://www.emqx.com/en/blog/introduction-to-mqtt-5) client tool open sourced by [EMQ](https://www.emqx.com/en), which can run on macOS, Linux and Windows, and supports formatting MQTT payload. + +[MQTTX](https://mqttx.app) simplifies test operation with the help of a familiar, chat-like interface. It’s easy and quick to create multiple, simultaneous online MQTT client connections, and can test the connection, publishing, and subscription functions of MQTT/TCP, MQTT/TLS, MQTT/WebSocket as well as other MQTT protocol features. + +> [MQTT](https://www.emqx.com/en/blog/the-easiest-guide-to-getting-started-with-mqtt) stands for MQ Telemetry Transport. It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks. + +## Preview + +![mqttx-preview](https://raw.githubusercontent.com/emqx/MQTTX/main/assets/mqttx-web-preview.png) + +## Usage + +See the MQTTX [documentation](https://mqttx.app/docs) or [manual](./docs/manual.md) for details. + +1. Get MQTT Broker Ready. + + - If you do not need to deploy the MQTT Broker locally, you can use the [public MQTT 5.0 Broker](https://www.emqx.com/en/mqtt/public-mqtt5-broker) provided by [EMQX Cloud](https://www.emqx.com/en/cloud) for testing: + + ```shell + Broker IP: broker.emqx.io + Broker TCP Port: 1883 + Broker SSL Port: 8883 + ``` + + - To run MQTT Broker locally, use the [Eclipse Mosquitto](https://github.com/runtipi/runtipi-appstore/blob/master/apps/eclipse-mosquitto/) Tipi app. Follow the steps mentioned in its [description](https://github.com/runtipi/runtipi-appstore/blob/master/apps/eclipse-mosquitto/metadata/description.md) to turn on Websockets so that the MQTTX web client can connect to it. + +2. Connection configuration. Click the `+` button in the left menu bar and fill in the corresponding required fields in the form. + +3. After the connection information is configured, click the `Connect` button in the upper right corner to create a connection and connect to MQTT Broker. + +4. After the MQTT is connected successfully, you can perform MQTT publish and subscription tests. + +![mqttx-gif](https://raw.githubusercontent.com/emqx/MQTTX/main/assets/mqttx-gif.gif) + +## Get Involved + +- Follow [@EMQTech on Twitter](https://twitter.com/EMQTech). +- If you have a specific question, check out our [discussion forums](https://github.com/emqx/emqx/discussions). +- For general discussions, join us on the [official Discord](https://discord.gg/xYGf3fQnES) team. +- Keep updated on [EMQX YouTube](https://www.youtube.com/channel/UC5FjR77ErAxvZENEWzQaO5Q) by subscribing. + +## Develop + +Recommended version for Node environment: + +- v16.\*.\* + +```shell +# Clone +git clone git@github.com:emqx/MQTTX.git + +# Install dependencies +cd MQTTX +yarn install + +# Compiles and hot-reloads for development +yarn run electron:serve + +# Compiles and minifies for production +yarn run electron:build +``` + +After the building is successful, the corresponding installation file for the successful build ing will appear in the `dist_electron` directory. + +If you need to package it as an installation package for an independent operating system, please refer to the following command: + +```shell +# For Windows +yarn run electron:build-win + +# For Linux +yarn run electron:build-linux + +# For macOS +yarn run electron:build-mac +``` + +## Contributing + +Please make sure to read the [Contributing Guide](https://github.com/emqx/MQTTX/blob/main/.github/CONTRIBUTING.md) before making a pull request. + +## Technology Stack + +- [Electron](https://electronjs.org/) +- [Vue](https://vuejs.org/) + [Element](https://element.eleme.io) +- [TypeScript](https://www.typescriptlang.org/) +- [TypeORM](https://github.com/typeorm/typeorm) +- [SQLite](https://github.com/mapbox/node-sqlite3) +- [MQTT.js](https://github.com/mqttjs/MQTT.js) + +## Resources + +- [MQTT Programming](https://www.emqx.com/en/blog/category/mqtt-programming) + + A series of blogs to help developers get started quickly with MQTT in PHP, Node.js, Python, Golang, and other programming languages. + +- [MQTT SDKs](https://www.emqx.com/en/mqtt-client-sdk) + + We have selected popular MQTT client SDKs in various programming languages and provided code examples to help you quickly understand the use of MQTT clients. + +## License + +Apache License 2.0, see [LICENSE](https://github.com/emqx/MQTTX/blob/main/LICENSE). diff --git a/apps/mqttx/metadata/logo.jpg b/apps/mqttx/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3db51c1a0b81da9582a5552125efa71bb119599 GIT binary patch literal 34439 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�J!X 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