{"id":11285,"date":"2025-12-02T19:08:28","date_gmt":"2025-12-02T18:08:28","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=11285"},"modified":"2025-12-02T22:30:02","modified_gmt":"2025-12-02T21:30:02","slug":"trazabilidad-de-activos-con-lorawan-e-ia-generativa-chirpstack-v4-como-contenedor-proxmox","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=11285","title":{"rendered":"Trazabilidad de activos con LoRaWAN e IA generativa. ChirpStack v4 como contenedor ProxMox"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 2 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=trazabilidad-de-activos-con-lorawan-e-ia-generativa\" class=\"series-1870\" title=\"Trazabilidad de activos con LoRaWAN e IA generativa\">Trazabilidad de activos con LoRaWAN e IA generativa<\/a><\/div>\n<p>El primer punto para iniciar el proyecto de trazabilidad LoRaWAN y GPS era disponer de un servidor de ChirpStack. El el pasado <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4725\" data-type=\"post\" data-id=\"4725\">ya realic\u00e9 un art\u00edculo al respecto<\/a>, pero han pasado ya 4 a\u00f1os desde entonces, y bastantes cosas han cambiado. Para empezar, la versi\u00f3n de ChirpStack, que ya ha va por la versi\u00f3n 4, mientras que el art\u00edculo anterior hac\u00eda referencia a la versi\u00f3n 3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"406\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-schema.webp\" alt=\"\" class=\"wp-image-11294\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-schema.webp 720w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-schema-300x169.webp 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><figcaption class=\"wp-element-caption\">ChirpStack Network Server<\/figcaption><\/figure>\n\n\n\n<p>Las diferencias entre estas versiones son las siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Principales Diferencias<\/strong>: ChirpStack v4 introduce mejoras significativas en lo relativo a facilidad de uso y arquitectura comparado con v3, enfoc\u00e1ndose en simplificar la configuraci\u00f3n y migraci\u00f3n. Mientras v3 requer\u00eda instancias separadas por regi\u00f3n, v4 soporta m\u00faltiples regiones en un solo servidor. Adem\u00e1s, v4 es totalmente compatible con ChirpStack Gateway Bridge v3 (versi\u00f3n 3.14.0+ usando protobuf), facilitando la transici\u00f3n sin interrupciones.<a href=\"https:\/\/www.chirpstack.io\/docs\/chirpstack\/changelog.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>Soporte Multi-Regi\u00f3n<\/strong>: En v4 se elimina la necesidad de m\u00faltiples instancias de Network Server por regi\u00f3n, permitiendo configurar gateways de diferentes regiones en un solo despliegue con archivos de configuraci\u00f3n predefinidos para regiones comunes de LoRa Alliance. Esto contrasta con v3, donde cada regi\u00f3n demandaba un setup independiente. Esta caracter\u00edstica reduce la complejidad operativa y el mantenimiento.<\/li>\n\n\n\n<li><strong>Interfaz de Usuario y API<\/strong>: La UI de v4 ha sido reescrita en TypeScript con gRPC-web para mayor usabilidad y modernidad, reemplazando la de v3 que era menos intuitiva. Respecto a APIs, v4 elimina el REST API embebido (recomendando un componente separado para REST sobre gRPC) y requiere actualizar clientes gRPC a v4, ya que los de v3 no son compatibles; los tokens API tambi\u00e9n deben regenerarse. Estos cambios priorizan eficiencia y seguridad.<\/li>\n\n\n\n<li><strong>Identificadores y Eventos<\/strong>: v4 cambia identificadores num\u00e9ricos (de v3) a UUIDs para entidades como organizaciones y usuarios, mejorando privacidad al evitar exposici\u00f3n de conteos en instancias p\u00fablicas. Los mensajes de eventos de integraci\u00f3n se refactorizan para incluir informaci\u00f3n base consistente (como tenant y device-profile) y uplinks decodificados como objetos directos, no strings JSON. Esto estandariza el manejo de datos.<\/li>\n\n\n\n<li><strong>Otras Mejoras y Cambios Rompedores<\/strong>: v4 a\u00f1ade soporte nativo para FUOTA (Firmware Updates Over The Air) sin necesidad de servidores adicionales, alineado con especificaciones TS003\/TS004\/TS005. Se remueve el descubrimiento de gateways (no compatible con Basics Station) y la interfaz NetworkControllerService, reemplazada por logs en Redis Streams. Los algoritmos ADR personalizados ahora se implementan en JavaScript en lugar de Go compilado. Para migrar, se recomienda un script que copia datos de v3 a nuevas bases PostgreSQL\/Redis.\u200b<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack-1024x584.png\" alt=\"\" class=\"wp-image-11286\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack-1024x584.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack-300x171.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack-768x438.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack-1536x876.png 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/servidor-chirpstack.png 1884w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Servidor ChirpStack v4<\/figcaption><\/figure>\n\n\n\n<p>En cuanto al despliegue, por mi parte opt\u00e9 por realizarlo como un contenedor de ProxMox. La verdadera raz\u00f3n para ello era que me apetec\u00eda probar un despliegue de contenedores en ProxMox, pero este tipo de despliegue tiene una serie de ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Eficiencia de Recursos<\/strong>: Los contenedores LXC de Proxmox para ChirpStack v4 son ligeros, comparten el kernel del host y consumen menos RAM\/CPU que una VM completa, permitiendo mayor densidad de instancias en hardware limitado sin <em>overhead<\/em> de OS emulado.<a href=\"https:\/\/readyspace.com\/proxmox-lxc-vs-vm\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>Arranque R\u00e1pido<\/strong>: Los contenedores LXC inician en segundos, lo que es ideal para desplegar ChirpStack v4 r\u00e1pidamente y escalar servicios LoRaWAN, a diferencia de VMs que tardan m\u00e1s en arrancar un SO completo.<\/li>\n\n\n\n<li><strong>Aislamiento de Aplicaci\u00f3n<\/strong>: Proporcionan aislamiento suficiente para ChirpStack (un servicio de red), protegiendo contra fallos sin el aislamiento total de VMs, lo que es perfecto para cargas de trabajo como servidores LoRaWAN en entornos Debian LXC.<\/li>\n\n\n\n<li><strong>Gesti\u00f3n Simplificada<\/strong>: Integraci\u00f3n nativa en ProxMox con backups autom\u00e1ticos, migraci\u00f3n entre nodos de cluster y GUI web unificada, lo que  reduce las necesidades de mantenimiento.<\/li>\n\n\n\n<li><strong>Portabilidad y Escalabilidad<\/strong>: Es f\u00e1cil clonar, migrar o respaldar contenedores, optimizando recursos para entornos de tipo IoT como ChirpStack, que tiene un consumo bajo de recursos en est\u00e1tico (ej. &lt;4MB en Alpine LXC vs 60MB en VM).<\/li>\n\n\n\n<li><strong>Compatibilidad Pr\u00e1ctica<\/strong>: ChirpStack v4 se despliega exitosamente en LXC Debian de manera directa o con Docker, lo que minimiza el <em>overhead<\/em> y facilita actualizaciones, aunque las VMs ofrecen m\u00e1s flexibilidad si se necesita un kernel independiente.\u200b<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"350\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-arquitectura-1024x350.png\" alt=\"\" class=\"wp-image-11287\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-arquitectura-1024x350.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-arquitectura-300x103.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-arquitectura-768x263.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/chirpstack-arquitectura.png 1176w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Arquitectura de ChirpStack v4<\/figcaption><\/figure>\n\n\n\n<p>La arquitectura de la v4 se ha simplificado, siendo s\u00f3lo necesario realziar un despliegue de la interfaz de gesti\u00f3n, y del Gateway Bridge; esto permite seguir interactuando desde los gateways mediante comunicaciones UDP bidireccionales. Las comunicaciones internas de los elementos se apoyan en un <em>broker<\/em> MQTT. En mi caso, opt\u00e9 por hacer uso de mi servidor MQTT, a fin de evitar despliegues adicionales innecesarios.<\/p>\n\n\n\n<p>Desde el punto de vista del proyecto, uno de los aspectos m\u00e1s interesantes es que la v4 permite hacer uso de claves API, para permitir la integraci\u00f3n de aplicaciones externas y realizar una adecuada securizaci\u00f3n de estas integraciones. Estas claves API pueden definirse tanto a nivel de servidor como a nivel de <em>tenant<\/em>, lo que resulta muy conveniente para controlar de manera muy granular los permisos de acceso al entorno.<\/p>\n\n\n\n<p>Otro de los aspectos a tener en cuenta es el relativo al cambio de la estructura de codificaci\u00f3n del <em>codec<\/em> que permite traducir la carga \u00fatil (<em>payload<\/em>) de los paquetes de datos LoRaWAN. Pero eso lo dejaremos para m\u00e1s adelante, cuando comente sobre los dispositivos.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 2 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=trazabilidad-de-activos-con-lorawan-e-ia-generativa\" class=\"series-1870\" title=\"Trazabilidad de activos con LoRaWAN e IA generativa\">Trazabilidad de activos con LoRaWAN e IA generativa<\/a><\/div><p>El primer punto para iniciar el proyecto de trazabilidad LoRaWAN<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[412,447,1871,1134,1310],"series":[1870],"class_list":["post-11285","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-chirpstack","tag-contenedor","tag-lowaran","tag-mqtt","tag-proxmox","series-trazabilidad-de-activos-con-lorawan-e-ia-generativa"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11285"}],"version-history":[{"count":2,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11285\/revisions"}],"predecessor-version":[{"id":11295,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11285\/revisions\/11295"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11285"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=11285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}