From 2e486e2a66f57c3d10982d8e922e129e99cb664b Mon Sep 17 00:00:00 2001 From: you Date: Fri, 20 Mar 2026 06:06:15 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Docker=20packaging=20=E2=80=94=20single?= =?UTF-8?q?=20container=20with=20Mosquitto=20+=20Node?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile: Alpine + Node 22 + Mosquitto + supervisord - Auto-copies config.example.json if no config.json mounted - Named volume for data persistence (SQLite + Mosquitto) - Ports: 3000 (web), 1883 (MQTT) - .dockerignore excludes data, config, git, benchmarks - README updated with Docker quickstart --- .dockerignore | 14 ++++++++++++++ Dockerfile | 32 ++++++++++++++++++++++++++++++++ README.md | 39 ++++++++++++++++++++++++++++++++++++++- docker/entrypoint.sh | 9 +++++++++ docker/mosquitto.conf | 10 ++++++++++ docker/supervisord.conf | 26 ++++++++++++++++++++++++++ 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker/entrypoint.sh create mode 100644 docker/mosquitto.conf create mode 100644 docker/supervisord.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a795c580 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +# Docker +.git +node_modules +data +config.json +*.db +*.db-shm +*.db-wal +*.bak +benchmark*.sh +benchmark*.js +PERFORMANCE.md +docs/ +.gitignore diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..dc2f3d31 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM node:22-alpine + +RUN apk add --no-cache mosquitto mosquitto-clients supervisor + +WORKDIR /app + +# Install Node dependencies +COPY package.json package-lock.json ./ +RUN npm ci --production + +# Copy application +COPY server.js db.js packet-store.js config.example.json ./ +COPY public/ ./public/ + +# Supervisor config +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY docker/mosquitto.conf /etc/mosquitto/mosquitto.conf + +# Create data directory for SQLite + Mosquitto persistence +RUN mkdir -p /app/data /var/lib/mosquitto && \ + chown -R node:node /app/data && \ + chown -R mosquitto:mosquitto /var/lib/mosquitto + +# Default config: copy example if no config mounted +COPY docker/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +EXPOSE 3000 1883 + +VOLUME ["/app/data"] + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md index d0554fc7..6bf77f04 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,44 @@ See [PERFORMANCE.md](PERFORMANCE.md) for the full benchmark. ## Quick Start -### Prerequisites +### Docker (Recommended) + +The easiest way to run MeshCore Analyzer. Includes Mosquitto MQTT broker — everything in one container. + +```bash +docker build -t meshcore-analyzer . +docker run -d \ + --name meshcore-analyzer \ + -p 3000:3000 \ + -p 1883:1883 \ + -v meshcore-data:/app/data \ + meshcore-analyzer +``` + +Open `http://localhost:3000`. Point your MeshCore gateway's MQTT to `:1883`. + +**Custom config:** +```bash +# Copy and edit the example config +cp config.example.json config.json +# Edit config.json with your channel keys, regions, etc. + +docker run -d \ + --name meshcore-analyzer \ + -p 3000:3000 \ + -p 1883:1883 \ + -v meshcore-data:/app/data \ + -v $(pwd)/config.json:/app/config.json \ + meshcore-analyzer +``` + +**Persist your database** across container rebuilds by using a named volume (`meshcore-data`) or bind mount (`-v ./data:/app/data`). + +### Manual Install + +### Manual Install + +#### Prerequisites - **Node.js** 18+ (tested with 22.x) - **MQTT broker** (Mosquitto recommended) — optional, can inject packets via API diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 00000000..cab751e2 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Copy example config if no config.json exists +if [ ! -f /app/config.json ]; then + echo "[entrypoint] No config.json found, copying from config.example.json" + cp /app/config.example.json /app/config.json +fi + +exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf diff --git a/docker/mosquitto.conf b/docker/mosquitto.conf new file mode 100644 index 00000000..86f27401 --- /dev/null +++ b/docker/mosquitto.conf @@ -0,0 +1,10 @@ +# Mosquitto config for MeshCore Analyzer +listener 1883 0.0.0.0 +allow_anonymous true +persistence true +persistence_location /var/lib/mosquitto/ + +# Logging +log_dest stdout +log_type warning +log_type error diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 00000000..06ac4746 --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,26 @@ +[supervisord] +nodaemon=true +user=root +logfile=/dev/stdout +logfile_maxbytes=0 +pidfile=/var/run/supervisord.pid + +[program:mosquitto] +command=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:meshcore-analyzer] +command=node /app/server.js +directory=/app +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=NODE_ENV="production"