Files
mqtt-ingester/docker-compose.yml
T
2026-08-30 11:30:09 +02:00

123 lines
3.5 KiB
YAML

services:
timescaledb:
image: timescale/timescaledb:2.17.2-pg16
container_name: mqtt-timescaledb
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-ingester}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
POSTGRES_DB: ${POSTGRES_DB:-telemetry}
ports:
- "127.0.0.1:${POSTGRES_PORT:-5432}:5432"
volumes:
- timescale-data:/var/lib/postgresql/data
- ./db/init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-ingester} -d ${POSTGRES_DB:-telemetry}"]
interval: 10s
timeout: 5s
retries: 5
mqtt-client:
build:
context: .
dockerfile: mqtt-client/Dockerfile
container_name: mqtt-client
restart: unless-stopped
depends_on:
timescaledb:
condition: service_healthy
environment:
MQTT_BROKER_HOST: ${MQTT_BROKER_HOST}
MQTT_BROKER_PORT: ${MQTT_BROKER_PORT:-8883}
MQTT_TOPIC: ${MQTT_TOPIC:-sensors/#}
MQTT_CLIENT_ID: ${MQTT_CLIENT_ID:-mqtt-ingester}
MQTT_CA_CERT: /certs/ca.crt
MQTT_CLIENT_CERT: /certs/client.crt
MQTT_CLIENT_KEY: /certs/client.key
MQTT_USERNAME: ${MQTT_USERNAME:-}
MQTT_PASSWORD: ${MQTT_PASSWORD:-}
MQTT_PSK_IDENTITY: ${MQTT_PSK_IDENTITY:-}
MQTT_PSK_HEX: ${MQTT_PSK_HEX:-}
DB_HOST: timescaledb
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB:-telemetry}
DB_USER: ${POSTGRES_USER:-ingester}
DB_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
DB_BATCH_SIZE: ${DB_BATCH_SIZE:-500}
DB_FLUSH_SECONDS: ${DB_FLUSH_SECONDS:-1.0}
LOG_LEVEL: ${LOG_LEVEL:-INFO}
LOG_TO_FILE: ${LOG_TO_FILE:-true}
LOG_FILE_PATH: /var/log/mqtt-client/mqtt-client.log
LOKI_URL: ${LOKI_URL:-}
LOKI_USER: ${LOKI_USER:-}
LOKI_PASSWORD: ${LOKI_PASSWORD:-}
LOKI_FLUSH_SECONDS: ${LOKI_FLUSH_SECONDS:-5}
LOKI_TIMEOUT_SECONDS: ${LOKI_TIMEOUT_SECONDS:-5}
volumes:
- ./certs:/certs:ro
- mqtt-logs:/var/log/mqtt-client
api:
build:
context: .
dockerfile: api/Dockerfile
container_name: mqtt-api
restart: unless-stopped
depends_on:
timescaledb:
condition: service_healthy
environment:
DB_HOST: timescaledb
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB:-telemetry}
DB_USER: ${POSTGRES_USER:-ingester}
DB_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
DB_POOL_MIN_SIZE: ${DB_POOL_MIN_SIZE:-2}
DB_POOL_MAX_SIZE: ${DB_POOL_MAX_SIZE:-10}
API_HOST: 0.0.0.0
API_PORT: 8443
API_CA_CERT: /certs/ca.crt
API_SERVER_CERT: /certs/server.crt
API_SERVER_KEY: /certs/server.key
ports:
- "${API_PORT:-8443}:8443"
volumes:
- ./certs:/certs:ro
webui:
build:
context: .
dockerfile: webui/Dockerfile
container_name: mqtt-webui
restart: unless-stopped
depends_on:
timescaledb:
condition: service_healthy
environment:
DB_HOST: timescaledb
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB:-telemetry}
DB_USER: ${POSTGRES_USER:-ingester}
DB_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}
ports:
- "127.0.0.1:${WEBUI_PORT:-8080}:8080"
loki:
image: grafana/loki:3.4.2
container_name: mqtt-loki
restart: unless-stopped
profiles: ["telemetry"]
command: -config.file=/etc/loki/local-config.yaml
ports:
- "127.0.0.1:3100:3100"
volumes:
- loki-data:/loki
volumes:
timescale-data:
mqtt-logs:
loki-data: