Deploying the Elastic Stack on Raspberry Pi 4 for IoT Data Orchestration

The Elastic Stack, commonly referred to as the ELK Stack, represents a sophisticated ecosystem designed for the ingestion, processing, storage, and visualization of massive volumes of data. Comprised of Elasticsearch, Logstash, and Kibana, this platform allows users to transform raw, unstructured data into actionable insights in real time. When deployed on the Raspberry Pi 4, the ELK Stack becomes a powerful edge-computing hub, specifically optimized for collecting time-series data from distributed IoT devices such as the ESP32 and the Raspberry Pi Pico W. The inherent scalability of the stack ensures that vast datasets from sensors can be stored efficiently and queried rapidly, facilitating critical operations like anomaly detection, network visibility, and predictive maintenance across complex IoT deployments.

Architectural Components of the ELK Ecosystem

The ELK Stack is not a single application but a synergistic collection of three distinct tools that form a data pipeline.

Elasticsearch serves as the heart of the stack. It is a distributed, open-source search and analytics engine capable of storing any type of data. In the context of a Raspberry Pi 4 deployment, Elasticsearch handles the indexing and storage of sensor data, allowing for near real-time search capabilities across millions of records.

Logstash acts as the data processing pipeline. It ingests data from multiple sources simultaneously, transforms it (through filtering and grooming), and then sends it to a "sink," which in this architecture is typically Elasticsearch. Logstash is essential for normalizing the unstructured data streams coming from various IoT sensors before they are indexed.

Kibana provides the visualization layer. It is a window into Elasticsearch, allowing users to create dashboards, charts, and maps to visualize the data. Because Kibana is a web-based interface, it enables remote monitoring of the Raspberry Pi's data collection without requiring direct access to the command line.

Bare Metal Installation and Configuration on Raspberry Pi 4

For users seeking maximum performance and direct hardware control, a bare metal installation on the Raspberry Pi 4 is the preferred method. This approach involves installing the components directly onto the operating system, typically Raspberry Pi OS or Ubuntu.

The initial phase requires the system to be fully updated to ensure compatibility with the Java Runtime Environment and the Elastic binaries.

bash sudo apt update && sudo apt upgrade

Elasticsearch requires a Java environment to operate. The following command installs the necessary Java Development Kit and the Java Foreign Function Interface (JFFI) libraries:

bash sudo apt install openjdk-8-jdk libjffi-java libjffi-jni

Once the environment is prepared, the Elasticsearch 6.8.10 package is downloaded and installed via the Debian package manager:

bash sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.deb sudo dpkg -i elasticsearch-6.8.10.deb

Elasticsearch Technical Tuning

After installation, the configuration file located at /etc/elasticsearch/elasticsearch.yml must be edited to define the node's identity and network behavior. The following parameters are critical:

  • cluster.name: Set to secsrv.ledger.org.uk to define the cluster identity.
  • node.name: Set to node01.secsrv.ledger.org.uk to identify the specific node.
  • network.host: Set to the static IP of the Pi, for example, 192.168.1.1, to allow network communication.
  • discovery.type: Set to single-node since the Raspberry Pi 4 is acting as a standalone server rather than part of a multi-node cluster.
  • xpack.ml.enabled: Set to false to disable Machine Learning features, which are too resource-intensive for the Pi's ARM processor.

Memory management is the most frequent point of failure on Raspberry Pi deployments. The Java Virtual Machine (JVM) options must be modified in /etc/elasticsearch/jvm.options to prevent the system from crashing due to Out-of-Memory (OOM) errors. For a Raspberry Pi 4, the heap size is typically set to 2GB:

text -Xms2g -Xmx2g

Once configured, the service is initialized and verified:

bash sudo systemctl start elasticsearch sudo systemctl status elasticsearch

Logstash Deployment and Configuration

Logstash is installed using a similar process to Elasticsearch, utilizing the .deb package for version 6.8.10:

bash sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.10.deb sudo dpkg -i logstash-6.8.10.deb

To ensure the Logstash configuration is optimized for the specific Raspberry Pi 4 environment, the ELKPI4 repository is cloned from GitHub:

bash sudo apt install git git clone https://github.com/ledge39/ELKPI4.git

The configuration file at /etc/logstash/logstash.yml is then modified to link with the Elasticsearch node:

  • node.name: node01.secsrv.ledger.org.uk
  • http.host: "192.168.1.1"
  • xpack.monitoring.enabled: false
  • xpack.management.enabled: false

The configuration files from the cloned repository are then moved into the system directory:

bash sudo cp -rf ELKPI4/conf.d /etc/logstash/ sudo systemctl start logstash sudo systemctl status logstash

Overcoming the Kibana ARM Architecture Challenge

One of the primary technical hurdles when deploying the Elastic Stack on a Raspberry Pi 4 is that Kibana does not provide an official ARM release. Because Kibana is bundled with its own version of Node.js, and that version is typically compiled for x86-64 architectures, it will not execute on the ARMv7l or ARM64 architecture of the Pi.

Manual Node.js Integration

To resolve this, the bundled Node.js binary must be replaced with a native ARM version. First, the correct Node.js binary for ARMv7l is downloaded and extracted:

bash sudo wget https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-armv7l.tar.xz sudo tar -xvf node-v10.19.0-linux-armv7l.tar.xz node-v10.19.0-linux-armv7l/bin/node --strip 2 sudo cp ./node /usr/local/bin/

Next, the Kibana package is downloaded and extracted to /usr/share/kibana/:

bash sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-linux-x86_64.tar.gz sudo mkdir /usr/share/kibana/ sudo tar -xvf kibana-6.8.10-linux-x86_64.tar.gz --strip 1 --directory /usr/share/kibana/

The critical fix involves navigating to the Kibana node binary directory and replacing the x86-64 node and npm binaries with symbolic links to the native ARM versions installed in /usr/local/bin/.

bash cd /opt/local/kibana/node/bin/ sudo mv node node~ sudo mv npm npm~ sudo ln -s `which node` node sudo ln -s `which npm` npm

Kibana Systemd Service Configuration

To ensure Kibana starts automatically on boot and runs in the background, a systemd unit file must be created at /etc/systemd/system/kibana.service. This prevents the application from running in the foreground of an SSH session.

The unit file content:

```text
[Unit]
Description=Kibana 4
After=elasticsearch.service

[Service]
Type=simple
User=elasticsearch
EnvironmentFile=/etc/default/kibana
ExecStart=/opt/local/kibana/bin/kibana

[Install]
WantedBy=multi-user.target
```

Additionally, a default environment file is created at /etc/default/kibana:

text CONFIG_PATH=/opt/local/kibana/config/kibana.yml NODE_ENV=production

The service is then activated using the following sequence:

bash systemctl daemon-reload systemctl enable kibana systemctl start kibana systemctl status kibana

Containerized Deployment via Docker and Docker Compose

For users who prefer isolation and ease of updates, the Elastic Stack can be deployed using Docker. This method leverages the deviantony/docker-elk project, which packages the components into containers.

Hardware and Software Requirements

The Docker deployment has specific minimum requirements to ensure the stack does not crash due to resource exhaustion:

Requirement Minimum Specification
Docker Engine $\ge$ 18.06
Docker Compose $\ge$ 2.0 (CLI)
Available RAM $\ge$ 1.5 GB dedicated to Docker
OS Permission Docker daemon access for the Linux user

Docker Setup Workflow

The deployment follows a streamlined process of cloning and orchestration:

  1. Clone the project repository from GitHub.
  2. Execute the setup container: docker compose up setup.
  3. Launch the stack in detached mode: docker compose up -d.
  4. Access the Kibana web interface at http://localhost:5601.

This containerized approach allows for scaling the Elasticsearch cluster via Docker Compose scaling and provides easier integration with other tools like Beats, Curator, and Fleet.

IoT Data Integration: Raspberry Pi Pico W to ELK Stack

The ultimate utility of the ELK Stack on a Raspberry Pi 4 is the ability to ingest data from microcontroller devices. The Raspberry Pi Pico W, using MicroPython, can forward sensor readings as HTTP POST requests to Logstash.

MicroPython Configuration on Pico W

First, the urequests module must be installed to handle HTTP communication. If it is not bundled with the firmware, it is installed via upip:

python try: import urequests except ImportError: import upip upip.install('micropython-urequests') import urequests

The Pico W must then establish a wireless connection to the local network to reach the Raspberry Pi 4:

python import network, time SSID = "YOUR_SSID" PASSWORD = "YOUR_PASSWORD" wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(SSID, PASSWORD) for _ in range(10): if wlan.isconnected(): break print("Connecting...") time.sleep(1) print("Connected:", wlan.ifconfig())

Once connected, the Pico W sends sensor data to the Logstash TCP input, which is then indexed by Elasticsearch and visualized in Kibana. This transforms the Raspberry Pi 4 into a home SIEM (Security Information and Event Management) system and a central network visibility hub.

Deployment Methodology and Comparison

The ELK Stack offers various installation paths depending on the production requirements and the desired level of resilience.

Method Use Case Primary Advantage Primary Disadvantage
Bare Metal Low-latency, High Performance Direct hardware access Complex ARM binary fixes
Docker Rapid Prototyping, Testing Isolation and easy setup Overhead of container runtime
Cloud/Managed Enterprise Scale Zero maintenance High recurring costs
Config Management Production Clusters Consistency (Ansible/Chef) Steep learning curve

Conclusion

The deployment of the Elastic Stack on a Raspberry Pi 4 is a sophisticated exercise in balancing resource constraints with powerful data processing capabilities. By meticulously configuring the JVM heap sizes and resolving the ARM architecture incompatibility of Kibana's Node.js binaries, the Raspberry Pi 4 is transformed from a simple single-board computer into a robust data orchestration hub. The ability to ingest data from MicroPython-based devices like the Pico W allows for the creation of a comprehensive IoT monitoring ecosystem. Whether through the precision of bare metal installation or the flexibility of Docker, the ELK Stack provides an unmatched framework for turning distributed sensor data into real-time, actionable intelligence, effectively bridging the gap between raw hardware signals and high-level analytical dashboards.

Sources

  1. ELKPI4 GitHub
  2. ELK-Stack Tutorial
  3. The Intranet of Stuff - ELK Stack
  4. Elastic Discuss - Raspberry Pi 4
  5. Dev.to - Installing and Configuring ELK Stack

Related Posts