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: ./mqtt-client 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: ./api 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 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: