# # Copyright 2016-present the IoT DC3 original author or authors. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # x-logging: &default-logging driver: json-file options: max-size: ${DC3_LOG_MAX_SIZE:-10M} max-file: "${DC3_LOG_MAX_FILE:-20}" # ============================================================================= # docker-compose-scale.yml - the "app" topology rebuilt for horizontal scaling # ============================================================================= # # Differences vs docker-compose.yml: # * no container_name / hostname pins -> `--scale =N` works # * no per-replica host port publishing -> replicas never fight over ports # * deploy.resources limits -> enforced by Docker Compose v2 # # This stack is intentionally NOT self-contained: PostgreSQL and RabbitMQ are # singleton stateful services and stay in docker-compose-db.yml. Both files live # in dc3/ so they belong to the same compose project and share the dc3net # network (dc3-postgres / dc3-rabbitmq DNS aliases). Start the dependency stack # first, then bring up the app stack with the replica counts you want: # # docker compose -f dc3/docker-compose-db.yml up -d # docker compose -f dc3/docker-compose-scale.yml up -d \ # --scale gateway=2 --scale data=2 # # Scaling semantics (see dc3/doc/DEPLOYMENT.md for details): # * web - keep replicas at 1 (publishes host ports 8080/8443); put your # own LB in front if you need more capacity. # * gateway - the nginx in dc3-web resolves dc3-gateway to every replica and # round-robins between them (restart web after scaling). # * drivers - keep replicas at 1: every replica would open the same SQLite # outbox file on the shared driver_data volume. Scale drivers on # Kubernetes instead (each pod gets its own emptyDir outbox). # listening-virtual must stay at 1 replica regardless (inbound # device sockets are connection-pinned). # * centers - replicas give HA / rolling-update safety. HTTP traffic from the # gateway is load-balanced by Spring Cloud Gateway; center-to-center # gRPC uses static DNS targets (one channel per client), so a # restarted replica is failed over but not request-balanced. # # Docker Swarm users: use docker-compose-swarm.yml instead (full stack, overlay # network, replicas managed with `docker service scale`). # ============================================================================= x-app-runtime-env: &app-runtime-env NODE_ENV: test APM_AGENT_ENABLE: ${APM_AGENT_ENABLE:-false} DC3_SECURITY_KEY: ${DC3_SECURITY_KEY:-dc3.security.key.2026.io.github.pnoker} AUTH_HMAC_SECRET: ${AUTH_HMAC_SECRET:-io.github.pnoker.dc3} POSTGRES_HOST: dc3-postgres POSTGRES_PORT: "5432" POSTGRES_USERNAME: ${POSTGRES_USERNAME:-dc3} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-*********} POSTGRES_DB: ${POSTGRES_DB:-dc3} RABBITMQ_VIRTUAL_HOST: ${RABBITMQ_VIRTUAL_HOST:-dc3} RABBITMQ_HOST: dc3-rabbitmq RABBITMQ_PORT: "${RABBITMQ_CONTAINER_PORT:-5672}" RABBITMQ_USERNAME: ${RABBITMQ_USERNAME:-dc3} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD:-*********} RABBITMQ_SSL_ENABLED: "${RABBITMQ_SSL_ENABLED:-false}" RABBITMQ_SSL_ALGORITHM: "${RABBITMQ_SSL_ALGORITHM:-TLS}" RABBITMQ_SSL_VALIDATE_SERVER_CERTIFICATE: "${RABBITMQ_SSL_VALIDATE_SERVER_CERTIFICATE:-false}" RABBITMQ_SSL_VERIFY_HOSTNAME: "${RABBITMQ_SSL_VERIFY_HOSTNAME:-false}" MQTT_BROKER_HOST: dc3-rabbitmq MQTT_BROKER_PORT: "1883" MQTT_USERNAME: ${MQTT_USERNAME:-dc3} MQTT_PASSWORD: ${MQTT_PASSWORD:-*********} services: web: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-web:${DC3_VERSION:-latest} restart: always depends_on: gateway: condition: service_healthy ports: - "${DC3_BIND_HOST:-127.0.0.1}:${DC3_WEB_HTTP_PORT:-8080}:80" - "${DC3_BIND_HOST:-127.0.0.1}:${DC3_WEB_HTTPS_PORT:-8443}:443" environment: - APP_API_HOST=${APP_API_HOST:-dc3-gateway} - APP_API_PORT=${APP_API_PORT:-8000} volumes: - nginx:/var/log/nginx healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1/ >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 30s deploy: resources: limits: cpus: '0.5' memory: 256M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-web gateway: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-gateway:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: auth: condition: service_healthy manager: condition: service_healthy data: condition: service_healthy agentic: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-gateway/dc3/logs healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1:8000/actuator/health/readiness >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 30s deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.1' memory: 128M logging: *default-logging networks: dc3net: aliases: - dc3-gateway auth: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-center-auth:${DC3_IMAGE_TAG:-2026.6} restart: always environment: <<: *app-runtime-env volumes: - logs:/dc3-center/dc3-center-auth/dc3/logs healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1:8300/auth/actuator/health/readiness >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 40s deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.1' memory: 128M logging: *default-logging networks: dc3net: aliases: - dc3-center-auth manager: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-center-manager:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: auth: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-center/dc3-center-manager/dc3/logs healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1:8400/manager/actuator/health/readiness >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 40s deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.1' memory: 128M logging: *default-logging networks: dc3net: aliases: - dc3-center-manager data: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-center-data:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: auth: condition: service_healthy manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-center/dc3-center-data/dc3/logs healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1:8500/data/actuator/health/readiness >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 40s deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.1' memory: 128M logging: *default-logging networks: dc3net: aliases: - dc3-center-data agentic: image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-center-agentic:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: auth: condition: service_healthy manager: condition: service_healthy data: condition: service_healthy environment: <<: *app-runtime-env AGENTIC_FALLBACK_OPENAI_BASE_URL: ${AGENTIC_FALLBACK_OPENAI_BASE_URL:-https://api.openai.com} AGENTIC_FALLBACK_OPENAI_API_KEY: ${AGENTIC_FALLBACK_OPENAI_API_KEY:-} AGENTIC_FALLBACK_OPENAI_MODEL: ${AGENTIC_FALLBACK_OPENAI_MODEL:-gpt-4o} AGENTIC_FALLBACK_OPENAI_TEMPERATURE: ${AGENTIC_FALLBACK_OPENAI_TEMPERATURE:-0.7} AGENTIC_FALLBACK_OPENAI_MAX_TOKENS: ${AGENTIC_FALLBACK_OPENAI_MAX_TOKENS:-2048} AGENTIC_MEMORY_SCHEMA_INIT: ${AGENTIC_MEMORY_SCHEMA_INIT:-never} AGENTIC_MEMORY_ENABLED: ${AGENTIC_MEMORY_ENABLED:-false} AGENTIC_TOOL_CALLING_ENABLED: ${AGENTIC_TOOL_CALLING_ENABLED:-true} AGENTIC_MEMORY_MAX_MESSAGES: ${AGENTIC_MEMORY_MAX_MESSAGES:-50} AGENTIC_ATTACHMENT_STORAGE_PATH: ${AGENTIC_ATTACHMENT_STORAGE_PATH:-dc3/data/agentic/attachments} volumes: - logs:/dc3-center/dc3-center-agentic/dc3/logs - agentic_data:/dc3-center/dc3-center-agentic/dc3/data healthcheck: test: [ "CMD-SHELL", "curl -fsS http://127.0.0.1:8600/agentic/actuator/health/readiness >/dev/null || exit 1" ] interval: 15s timeout: 5s retries: 10 start_period: 40s deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.1' memory: 128M logging: *default-logging networks: dc3net: aliases: - dc3-center-agentic listening-virtual: # Device ingress (TCP/UDP). Keep replicas at 1: an established device # connection is pinned to one container. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-listening-virtual:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy ports: - "${DC3_BIND_HOST:-127.0.0.1}:${DC3_LISTENING_VIRTUAL_TCP_PORT:-6270}:6270" - "${DC3_BIND_HOST:-127.0.0.1}:${DC3_LISTENING_VIRTUAL_UDP_PORT:-6271}:6271" environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-listening-virtual/dc3/logs - driver_data:/dc3-driver/dc3-driver-listening-virtual/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-listening-virtual modbus-tcp: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-modbus-tcp:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-modbus-tcp/dc3/logs - driver_data:/dc3-driver/dc3-driver-modbus-tcp/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-modbus-tcp modbus-rtu: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-modbus-rtu:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-modbus-rtu/dc3/logs - driver_data:/dc3-driver/dc3-driver-modbus-rtu/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-modbus-rtu mqtt: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-mqtt:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-mqtt/dc3/logs - driver_data:/dc3-driver/dc3-driver-mqtt/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-mqtt opc-da: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-opc-da:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-opc-da/dc3/logs - driver_data:/dc3-driver/dc3-driver-opc-da/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-opc-da opc-ua: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-opc-ua:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-opc-ua/dc3/logs - driver_data:/dc3-driver/dc3-driver-opc-ua/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-opc-ua plcs7: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-plcs7:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-plcs7/dc3/logs - driver_data:/dc3-driver/dc3-driver-plcs7/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-plcs7 virtual: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-virtual:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-virtual/dc3/logs - driver_data:/dc3-driver/dc3-driver-virtual/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-virtual bacnet-ip: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-bacnet-ip:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-bacnet-ip/dc3/logs - driver_data:/dc3-driver/dc3-driver-bacnet-ip/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-bacnet-ip fins: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-fins:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-fins/dc3/logs - driver_data:/dc3-driver/dc3-driver-fins/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-fins melsec: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-melsec:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-melsec/dc3/logs - driver_data:/dc3-driver/dc3-driver-melsec/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-melsec ethernet-ip: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-ethernet-ip:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-ethernet-ip/dc3/logs - driver_data:/dc3-driver/dc3-driver-ethernet-ip/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-ethernet-ip iec104: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-iec104:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-iec104/dc3/logs - driver_data:/dc3-driver/dc3-driver-iec104/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-iec104 sl651: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-sl651:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-sl651/dc3/logs - driver_data:/dc3-driver/dc3-driver-sl651/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-sl651 snmp: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-snmp:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-snmp/dc3/logs - driver_data:/dc3-driver/dc3-driver-snmp/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-snmp dlms: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-dlms:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-dlms/dc3/logs - driver_data:/dc3-driver/dc3-driver-dlms/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-dlms coap: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-coap:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-coap/dc3/logs - driver_data:/dc3-driver/dc3-driver-coap/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-coap lwm2m: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-lwm2m:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-lwm2m/dc3/logs - driver_data:/dc3-driver/dc3-driver-lwm2m/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-lwm2m http: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-http:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-http/dc3/logs - driver_data:/dc3-driver/dc3-driver-http/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-http serial: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-serial:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-serial/dc3/logs - driver_data:/dc3-driver/dc3-driver-serial/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-serial tcp-udp: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-tcp-udp:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-tcp-udp/dc3/logs - driver_data:/dc3-driver/dc3-driver-tcp-udp/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-tcp-udp mysql: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-mysql:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-mysql/dc3/logs - driver_data:/dc3-driver/dc3-driver-mysql/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-mysql postgresql: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-postgresql:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-postgresql/dc3/logs - driver_data:/dc3-driver/dc3-driver-postgresql/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-postgresql oracle: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-oracle:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-oracle/dc3/logs - driver_data:/dc3-driver/dc3-driver-oracle/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-oracle sqlserver: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-sqlserver:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-sqlserver/dc3/logs - driver_data:/dc3-driver/dc3-driver-sqlserver/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-sqlserver ble: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-ble:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-ble/dc3/logs - driver_data:/dc3-driver/dc3-driver-ble/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-ble can: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-can:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-can/dc3/logs - driver_data:/dc3-driver/dc3-driver-can/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-can dlt645: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-dlt645:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-dlt645/dc3/logs - driver_data:/dc3-driver/dc3-driver-dlt645/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-dlt645 dnp3: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-dnp3:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-dnp3/dc3/logs - driver_data:/dc3-driver/dc3-driver-dnp3/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-dnp3 iec61850: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-iec61850:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-iec61850/dc3/logs - driver_data:/dc3-driver/dc3-driver-iec61850/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-iec61850 kafka: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-kafka:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-kafka/dc3/logs - driver_data:/dc3-driver/dc3-driver-kafka/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-kafka knx: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-knx:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-knx/dc3/logs - driver_data:/dc3-driver/dc3-driver-knx/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-knx lorawan: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-lorawan:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-lorawan/dc3/logs - driver_data:/dc3-driver/dc3-driver-lorawan/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-lorawan mbus: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-mbus:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-mbus/dc3/logs - driver_data:/dc3-driver/dc3-driver-mbus/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-mbus redis: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-redis:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-redis/dc3/logs - driver_data:/dc3-driver/dc3-driver-redis/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-redis zigbee: # Protocol adapter. Keep replicas at 1: every replica mounts the same # driver_data volume and would open the same SQLite outbox file. image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-zigbee:${DC3_IMAGE_TAG:-2026.6} restart: always depends_on: manager: condition: service_healthy environment: <<: *app-runtime-env volumes: - logs:/dc3-driver/dc3-driver-zigbee/dc3/logs - driver_data:/dc3-driver/dc3-driver-zigbee/dc3/data deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.05' memory: 64M logging: *default-logging networks: dc3net: aliases: - dc3-driver-zigbee volumes: logs: driver_data: agentic_data: nginx: networks: dc3net: driver: bridge