{"id":808,"date":"2023-12-13T11:33:31","date_gmt":"2023-12-13T16:33:31","guid":{"rendered":"https:\/\/80bits.blog\/?p=808"},"modified":"2023-12-13T11:33:33","modified_gmt":"2023-12-13T16:33:33","slug":"flashmq-como-instalar-un-servidor-mqtt-en-ubuntu-22-04","status":"publish","type":"post","link":"https:\/\/80bits.blog\/index.php\/2023\/12\/13\/flashmq-como-instalar-un-servidor-mqtt-en-ubuntu-22-04\/","title":{"rendered":"FlashMQ &#8211; C\u00f3mo Instalar Un Servidor Mqtt En Ubuntu 22.04"},"content":{"rendered":"\n<p>FlashMQ. <a href=\"https:\/\/en.wikipedia.org\/wiki\/MQTT\">MQTT (Message Queuing Telemetry Transport)<\/a> es un protocolo de mensajer\u00eda ligero y eficiente, dise\u00f1ado para comunicaciones de bajo ancho de banda y dispositivos con recursos limitados, como sensores y dispositivos de Internet de las Cosas (IoT).<\/p>\n\n\n\n<p>Para lo anterior, dado que se trata de IoT, necesito un servidor MQTT. Inicialmente, consider\u00e9 usar alguna de las soluciones en la nube como AWS o Azure IoT. Ambas opciones ofrecen soporte para MQTT, aunque solo para los niveles QoS 0 y 1. No brindan soporte para el nivel 2, lo cual no es cr\u00edtico para mis requerimientos, pero es un aspecto importante a tener en cuenta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"caracter\u00edsticas\">Caracter\u00edsticas de Mqtt<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Basado en el Modelo de Publicaci\u00f3n\/Suscripci\u00f3n<\/li>\n\n\n\n<li>Ligero y Eficiente<\/li>\n\n\n\n<li>Calidad de Servicio (QoS)<\/li>\n\n\n\n<li>Mensajes de Last Will and Testament (LWT)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"niveles-qos\">Niveles QoS<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>QoS 0: Entrega a lo M\u00e1s una Vez (At Most Once). Los mensajes se env\u00edan solo una vez y no se realiza ning\u00fan esfuerzo adicional para garantizar la entrega. Es \u00fatil cuando la velocidad es m\u00e1s cr\u00edtica que la fiabilidad<\/li>\n\n\n\n<li>Qos 1: Entrega al Menos una Vez (At Least Once). Los mensajes se aseguran de ser entregados al menos una vez al receptor. Adecuado cuando es importante no perder mensajes, pero donde no es un problema recibir duplicados.<\/li>\n\n\n\n<li>QoS 2: Entrega Exactamente una Vez (Exactly Once). Este es el nivel m\u00e1s alto de garant\u00eda de entrega, donde se asegura que cada mensaje se entrega exactamente una vez. Importante en situaciones donde es cr\u00edtico que un mensaje no se pierda ni se duplique.<\/li>\n<\/ul>\n\n\n\n<p>Habiendo expuesto el resumen sobre MQTT, ahora pasemos a la instalaci\u00f3n de FlashMQ.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"flashmq\">FlashMQ<\/h2>\n\n\n\n<p>Inicialmente, pens\u00e9 en utilizar <a href=\"https:\/\/mosquitto.org\/\">Mosquitto<\/a>, un servidor MQTT muy popular. Sin embargo, para las pruebas preliminares antes de lanzar mi servidor productivo, opt\u00e9 por <a href=\"https:\/\/www.flashmq.org\/\">FlashMQ<\/a>, ya que FlashMQ tiene una version de tipo <a href=\"https:\/\/appimage.org\/\">AppImage<\/a>, esto es un archivo unico ejecutable para linux.<\/p>\n\n\n\n<p>El sistema operativo elegido para la instalaci\u00f3n es Ubuntu 22.04, debido a que dispongo de una m\u00e1quina virtual en Digital Ocean que opera con esta versi\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"caracter\u00edsticas-1\">Caracter\u00edsticas de FlashMQ<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alto Rendimiento y Escalabilidad.<\/strong> FlashMQ est\u00e1 dise\u00f1ado para manejar millones de mensajes y clientes. Es capaz de procesar m\u00e1s de un mill\u00f3n de mensajes por segundo, las pruebas para esto se hicieron en un <a href=\"https:\/\/www.youtube.com\/watch?v=vZWLitdCkJQ\">servidor unico de 4 nucleos<\/a><\/li>\n\n\n\n<li><strong>Uso Eficiente de Recursos.<\/strong> Est\u00e1 optimizado para aprovechar al m\u00e1ximo los entornos multi-CPU<\/li>\n\n\n\n<li><strong>C\u00f3digo Fuente Abierto y Seguridad.<\/strong> Es un software de c\u00f3digo abierto, lo que significa que su c\u00f3digo est\u00e1 disponible para que los desarrolladores lo revisen y modifiquen seg\u00fan sea necesario, escrito en C++<\/li>\n\n\n\n<li><strong>Compatible con Diversas Versiones de MQTT<\/strong>. FlashMQ es compatible con las versiones 3.1, 3.1.1 y 5.0 del protocolo MQTT<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ejecutar FlashMQ<\/h3>\n\n\n\n<p>Para ejecutar FlashMQ con las opciones m\u00ednimas, que incluyen asignar un puerto de escucha, una IP y un archivo de configuraci\u00f3n b\u00e1sico para usuario y contrase\u00f1a, se requiere un archivo de configuraci\u00f3n, se puede usar el nombre que sea. Mi configuraci\u00f3n es la siguiente:<\/p>\n\n\n\n<p><em>flashmq.conf<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>listen {\n  protocol mqtt\n  inet_protocol ip4_ip6\n  inet4_bind_address ::1\n  inet6_bind_address ::1\n # fullchain \/foobar\/server.crt\n # privkey \/foobar\/server.key\n\n  # default = 8883\n  port 8883\n}\nlisten {\n  protocol mqtt\n  inet_protocol ip4\n\n  # default = 1883\n  port 1883\n}\nlisten {\n  protocol websockets\n  #fullchain \/foobar\/server.crt\n  #privkey \/foobar\/server.key\n\n  # default = 4443\n  port 4443\n}\nlisten {\n  protocol websockets\n\n  # default = 8080\n  port 8080\n}\nlisten {\n  port 2883\n  haproxy on\n}\n\nallow_anonymous false\n\nmosquitto_password_file \/path\/to\/mqttpassword.conf\n<\/code><\/pre>\n\n\n\n<p>Un vistazo r\u00e1pido al archivo nos muestra configuraciones como el protocolo <code>mqtt<\/code>, que escucha en el puerto <code>1883<\/code>, y el protocolo <code>websockets<\/code>, configurado para escuchar en el puerto <code>443<\/code> y <code>8080<\/code> sin SSL. Es importante destacar que FlashMQ soporta la comunicaci\u00f3n a trav\u00e9s de websockets.<\/p>\n\n\n\n<p>Hay otras caracter\u00edsticas recomendadas que no he aplicado en mi caso, como la creaci\u00f3n de certificados para ambos protocolos. Esto ser\u00eda esencial para evitar comunicaciones no cifradas y en texto plano. Sin embargo, en mi situaci\u00f3n particular, no considero necesaria esta capa de seguridad.<\/p>\n\n\n\n<p>Lo que si aplique es la configuraci\u00f3n de usuario y contrase\u00f1a, este debe ser otro archivo de configuraci\u00f3n con este formato:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flashuser:Flashmq123\n<\/code><\/pre>\n\n\n\n<p>Todos los datos deben estar en texto plano, ya que a continuaci\u00f3n es necesario formatearlos con el comando de <a href=\"https:\/\/mosquitto.org\/documentation\/authentication-methods\/\">Mosquitto<\/a>, ambos, Mosquitto y FlashMQ, utilizan el mismo sistema de usuarios. El comando correspondiente ser\u00eda el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mosquitto_passwd -U sample.conf\n<\/code><\/pre>\n\n\n\n<p>Donde <code>sample.conf<\/code> es el archivo del texto plano, este comando lo que har\u00e1 es sobrescribir el archivo dejando el usuario con la contrase\u00f1a cifrada.<\/p>\n\n\n\n<p><em>Nota: Debes de tener el binario <code>mosquitto_passwd<\/code> , normalmente viene incluido en la instalaci\u00f3n de mosquitto<\/em>.<\/p>\n\n\n\n<p>Si no tienes el comando esta es la linea de texto ya configurada con el usuario y contrase\u00f1a de mi ejemplo anterior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flashuser:$7$101$gg1F6LL0Ujn3spL+$G6r0pmEqTPTrPCWOICQ2WhQ2LOHfXv9bnxYYcZRKqTgGPjTBTdwDpuFrBqhUV5m6zCt0J02+vNLzsBCS4+ceuA==\n<\/code><\/pre>\n\n\n\n<p>Debes guardar el archivo con el nombre que elijas; en mi caso, lo he nombrado <code>mqttpassword.conf<\/code>. Luego, especifica la ruta del archivo de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mosquitto_password_file \/path\/to\/mqttpassword.conf\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"instalaci\u00f3n\"><strong>Instalaci\u00f3n<\/strong><\/h2>\n\n\n\n<p>Una primera opci\u00f3n para instalar FlashMQ ser\u00eda utilizar el archivo AppImage. Este m\u00e9todo requerir\u00eda simplemente ejecutar el archivo, abrir los puertos y estar\u00eda listo para usar.<\/p>\n\n\n\n<p>Ejecutar el archivo appimage, normalmente lo primero que hay que hacer es dar permisos de ejecuci\u00f3n al archivo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod +x flashmq.appimage\n<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s simplemente seria ejecutar el binario y pasar como par\u00e1metro el archivo de configuraci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/flashmq.appimage -c \/path\/to\/flashmq.conf\n<\/code><\/pre>\n\n\n\n<p>Este m\u00e9todo es eficaz siempre y cuando el usuario no cierre su sesi\u00f3n, ya que de lo contrario, el proceso se detendr\u00e1. Esto no es viable en situaciones como la m\u00eda, donde necesito que el proceso est\u00e9 activo de manera continua.<\/p>\n\n\n\n<p>Lo adecuado ser\u00eda crear un archivo de configuraci\u00f3n de inicio, particularmente para el gestor <code>systemd<\/code><\/p>\n\n\n\n<p><em>Si no sabes que gestor de inicio puede revisar esta publicaci\u00f3n. <a href=\"https:\/\/80bits.blog\/index.php\/2023\/11\/20\/linux-como-saber-que-sistema-de-inicio-estamos-usando\/\">Como saber qu\u00e9 sistema de inicio estamos usando<\/a><\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"crear-un-archivo-de-servicio\">Crear un archivo de servicio<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=FlashMQ Service\nAfter=network.target\n\n&#91;Service]\nExecStart=\/path\/to\/flashmq.appimage -c \/path\/to\/flashmq.conf\nType=simple\nRestart=on-failure\n\n&#91;Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n\n\n\n<p>El texto anterior debe guardarse en la ruta: <code>\/etc\/systemd\/system\/<\/code><\/p>\n\n\n\n<p>O simplemente abrir el editor nano pega y guardar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/systemd\/system\/flashmq.service\n<\/code><\/pre>\n\n\n\n<p>Una vez guardado y creado el archivo hay que hacer ejecutar esta serie de pasos:<\/p>\n\n\n\n<p><strong>Recargar systemd<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload\n<\/code><\/pre>\n\n\n\n<p><strong>Iniciar el servicio<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl start flashmq\n<\/code><\/pre>\n\n\n\n<p><strong>Obtener el estatus<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl start flashmq\n<\/code><\/pre>\n\n\n\n<p>Deber\u00edan ver algo como esto:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"757\" height=\"141\" src=\"https:\/\/80bits.blog\/wp-content\/uploads\/2023\/12\/image-20231213095706633.png\" alt=\"Flashmq systemd status\" class=\"wp-image-800\"\/><\/figure>\n\n\n\n<p><strong>Habilitar para que se ejecute al inicio del sistema<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable flashmq\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"instalaci\u00f3n-f\u00e1cil\">Instalaci\u00f3n f\u00e1cil<\/h3>\n\n\n\n<p>Si no quieren hacer todo el proceso anterior, pueden simplemente ejecutar los pasos que se indican en la <a href=\"https:\/\/www.flashmq.org\/download\/\">url de descarga de FlashMq<\/a><\/p>\n\n\n\n<p>Con esta opci\u00f3n, cada nueva versi\u00f3n de FlashMQ se actualizar\u00e1 autom\u00e1ticamente con las actualizaciones del sistema, ya que se a\u00f1aden las referencias correspondientes tanto en Debian como en Ubuntu.<\/p>\n\n\n\n<p>Lo \u00fanico que agregar\u00eda es que hay que agregar la referencia el archivo de contrase\u00f1as en la configuraci\u00f3n. <\/p>\n\n\n\n<p><strong>Editar el archivo de configuraci\u00f3n<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/flashmq\/flashmq.conf\n<\/code><\/pre>\n\n\n\n<p><strong>Agregar la linea o editar la linea<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mosquitto_password_file \/path\/to\/mqttpassword.conf\n<\/code><\/pre>\n\n\n\n<p><strong>Reiniciar el servicio<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart flashmq.service\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"probar-el-servicio\">Probar el servicio<\/h2>\n\n\n\n<p>Para poder probar y enviar mensajes y determinar que todo se esta ejecutando correctamente, pueden usar <a href=\"https:\/\/mqttx.app\/\">MQTTX<\/a> que es un cliente plataforma o tambi\u00e9n usar <a href=\"https:\/\/www.postman.com\/\">Postman<\/a> que tiene integrado un cliente Mqtt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>FlashMQ. MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajer\u00eda ligero y eficiente, dise\u00f1ado para comunicaciones de bajo ancho de banda y dispositivos con recursos limitados, como sensores y dispositivos de Internet de las Cosas (IoT). Para lo anterior, dado que se trata de IoT, necesito un servidor MQTT. Inicialmente, consider\u00e9 usar alguna de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":768,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[66,65],"tags":[52,87,73,86],"class_list":["post-808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-sistemas-operativos","tag-consola","tag-flashmq","tag-linux","tag-mqtt"],"jetpack_featured_media_url":"https:\/\/80bits.blog\/wp-content\/uploads\/2023\/11\/mqttImage_80bits.jpg","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/comments?post=808"}],"version-history":[{"count":19,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/808\/revisions"}],"predecessor-version":[{"id":830,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/808\/revisions\/830"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/media\/768"}],"wp:attachment":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/media?parent=808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/categories?post=808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/tags?post=808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}