Back to articles
Technology Insight

Building a Robust Weather Monitoring Station and IoT Dashboard with EMQX MQTT Broker and InfluxDB v3 on a VPS

June 2, 2026

Introduction

In the era of industrial automation and smart infrastructure, real-time environmental monitoring has become a cornerstone for data-driven decision-making. Whether for agricultural optimization, smart city initiatives, or industrial climate control, deploying a reliable Internet of Things (IoT) architecture is essential. This technical guide provides a step-by-step blueprint for building an enterprise-ready weather monitoring station and centralized IoT dashboard. By leveraging the high-throughput capabilities of the EMQX MQTT Broker, the time-series storage efficiency of InfluxDB v3, and the flexibility of a Virtual Private Server (VPS), we will establish a robust data pipeline capable of handling real-time telemetry at scale.

Understanding the Architectural Components

Before diving into the deployment phase, it is crucial to understand why this specific technology stack is chosen for professional IoT applications:

  • EMQX MQTT Broker: As the world's most scalable open-source MQTT broker, EMQX handles massive numbers of concurrent connections with ultra-low latency. It acts as the central nervous system, receiving messages from edge sensors and routing them efficiently.
  • InfluxDB v3: The latest generation of the leading time-series database, rebuilt in Rust on top of Apache Arrow. It offers unparalleled compression, real-time querying capabilities, and seamless integration with visualization tools, making it ideal for chronological weather metrics.
  • Node-RED or Telegraf (The Data Bridge): To bridge the gap between the MQTT broker and the database, a lightweight data integration layer is used to subscribe to MQTT topics and write incoming payloads directly into InfluxDB.
  • Grafana: The industry standard for open-source analytics and visualization, used to build intuitive, real-time executive dashboards.

Step 1: Setting Up and Securing Your VPS

To ensure high availability and global accessibility, hosting the infrastructure on a cloud-based VPS (such as DigitalOcean, AWS EC2, or Linode) running Ubuntu 22.04 LTS or newer is highly recommended.

Server Preparation

First, access your server via SSH and update the system packages to their latest versions:

sudo apt update && sudo apt upgrade -y

Next, install Docker and Docker Compose, as containerization simplifies deployment, guarantees environment consistency, and streamlines updates:

sudo apt install docker.io docker-compose -y
sudo systemctl enable --now docker

Step 2: Deploying EMQX MQTT Broker via Docker

EMQX will serve as our ingestion gateway. We will deploy it using Docker to isolate it from the host OS system files.

Creating the Configuration

Create a dedicated directory for your IoT stack and establish a docker-compose.yml file:

mkdir ~/iot-stack && cd ~/iot-stack
nano docker-compose.yml

Paste the following configuration into the file to define the EMQX service:

version: '3.8'

services:
  emqx:
    image: emqx/emqx:latest
    container_name: emqx_broker
    ports:
      - "1883:1883" # MQTT TCP port
      - "8083:8083" # MQTT WebSockets port
      - "18083:18083" # EMQX Dashboard Management
    volumes:
      - emqx-data:/opt/emqx/data
      - emqx-log:/opt/emqx/log
    restart: always

volumes:
  emqx-data:
  emqx-log:

Launch the broker by running sudo docker-compose up -d. You can now access the EMQX Dashboard at http://your-vps-ip:18083 using the default credentials (admin/public). Security Warning: Change this password immediately upon your first login to prevent unauthorized access.

Step 3: Deploying and Configuring InfluxDB v3

With the ingestion layer active, the next step is provisioning the storage layer. InfluxDB v3 provides optimized engines specifically tailored for storing metrics like temperature, humidity, and atmospheric pressure.

Adding InfluxDB to the Stack

Update your docker-compose.yml file to append the InfluxDB service:

  influxdb:
    image: influxdb:latest
    container_name: influxdb_v3
    ports:
      - "8086:8086"
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=YourStrongPasswordHere
      - DOCKER_INFLUXDB_INIT_ORG=MyCompany
      - DOCKER_INFLUXDB_INIT_BUCKET=weather_metrics
    volumes:
      - influxdb-data:/var/lib/influxdb2
    restart: always

# Remember to add influxdb-data under the volumes section

Run sudo docker-compose up -d again to pull and initialize InfluxDB. Navigate to http://your-vps-ip:8086 to verify the initialization and generate an API Token, which will be required for secure data writes.

Step 4: Bridging the Pipeline (MQTT to InfluxDB)

To automatically route telemetry data from EMQX into InfluxDB, we can utilize the built-in EMQX Rule Engine, which eliminates the need for external middleware script maintenance. This reduces latency and simplifies the infrastructure.

Configuring the Ingestion Rule

  1. Log into the EMQX Dashboard and navigate to Integration -> Rules.
  2. Create a new rule with a SQL statement designed to parse incoming JSON telemetry payloads from your weather station:
SELECT payload.temperature as temp, payload.humidity as hum, payload.pressure as pres FROM "weather/station/+/data"
  1. Add an Action to the rule, choosing the InfluxDB data integration connector.
  2. Input your InfluxDB organization, bucket name, and paste the API Token generated in Step 3.
  3. Map the data fields explicitly to ensure your time-series tables stay structured and indexable.

Step 5: Simulating Hardware or Connecting the Edge Node

On the hardware side, an ESP32 micro-controller paired with a BME280 sensor serves as an ideal edge device. Below is a simplified, production-grade Arduino snippet demonstrating how the device publishes encrypted or standard JSON objects to the VPS:

#include 
#include 
#include 

const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";
const char* mqtt_server = "YOUR_VPS_IP";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  WiFi.begin(ssid, password);
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) { reconnect(); }
  client.loop();

  StaticJsonDocument<200> doc;
  doc["temperature"] = 24.5; // Replace with actual sensor readings
  doc["humidity"] = 62.1;
  doc["pressure"] = 1013.25;

  char buffer[256];
  serializeJson(doc, buffer);
  client.publish("weather/station/01/data", buffer);
  delay(60000); // Publish once per minute
}

Step 6: Creating the Executive Grafana Dashboard

With data successfully flowing from the ESP32 sensor, through EMQX, and into InfluxDB v3, the final phase is visualization.

Deploying Grafana

Add Grafana to your docker-compose.yml file under the services block:

  grafana:
    image: grafana/grafana:latest
    container_name: grafana_dash
    ports:
      - "3000:3000"
    restart: always

After deploying, log into Grafana at http://your-vps-ip:3000 (default credentials: admin/admin). Add InfluxDB as a Data Source, selecting the Flight SQL or Flux query language depending on your exact version setup, and insert your token. From there, you can design operational gauges, historical line graphs, and thresholds that trigger alerts if climate metrics deviate from safe parameters.

Conclusion and Best Practices

You have successfully implemented a high-performance, containerized IoT data pipeline on a VPS. This architecture provides a solid foundation that can scale from a single weather station to thousands of distributed environmental sensors. As you transition this setup into a production environment, remember to enforce TLS/SSL encryption for all MQTT connections on port 8883, implement strict ACL rules within EMQX to authenticate individual client IDs, and set up automated data retention policies in InfluxDB v3 to optimize storage costs over long periods.

Building a Robust Weather Monitoring Station and IoT Dashboard with EMQX MQTT Broker and InfluxDB v3 on a VPS | DPTCloud