Skip to main content
Version: 5.4

Docker Compose example for Redundancy failover with Traefik

Docker Compose example for Redundancy failover with Nginx

The following example shows how Traefik can be configured in Docker Compose. No other configuration files are required. The necessary configurations are passed as command parameters or defined via labels.

The files used as a project can be found on the page HTTP(s) failover concepts for REST, OPC UA Server & WebManagement in the OPC Router.

services:
traefik:
image: traefik:v3.0
restart: always
networks:
- opcrouter-net
# Configurations as command parameters
command:
---api.dashboard=true”
---api.insecure=true”
---entrypoints.web.address=:80”
---providers.docker=true”
---providers.docker.exposedbydefault=false”
---ping”
ports:
- “5080:80”
- “5081:8080” # Traefik Dashboard (optional)
volumes:
- “/var/run/docker.sock:/var/run/docker.sock:ro”

opcrouter-primary:
image: inrayhub.azurecr.io/opcrouter-runtime:5.3.6001.68
restart: always
networks:
- opcrouter-net
ports:
- “5085:8080”
environment:
- OR_I_ACCEPT_EULA=true
- INITIAL_USERNAME=admin
- INITIAL_PASSWORD=SuperSecret123
- OR_REDUNDANCY_MODE=1
- OR_REDUNDANCY_LOCAL_MANAGEMENT_ADDRESS=http://opcrouter-primary:8080
- OR_REDUNDANCY_SHARED_KEY=LUyLxk4kZdvYW9kM6ZSBWbBatdj9RGow9Bp
- OR_IMPORT_SOURCE=/inray/REST_Primary.rpe
volumes:
# Make project available in container
- ./REST_Primary.rpe:/inray/REST_Primary.rpe
# Configurations via labels
labels:
- “traefik.enable=true”
# Responds to the prefix /api
- “traefik.http.routers.api-router.rule=PathPrefix(`/api`)”
- “traefik.http.routers.api-router.entrypoints=web”
- “traefik.http.routers.api-router.service=opcrouter-service”
- “traefik.http.routers.api-router.middlewares=api-rewrite”
# Replaces /api/ with /services/MyRestServer/api/
- “traefik.http.middlewares.api-rewrite.replacepathregex.regex=^/api/(.*)”
- “traefik.http.middlewares.api-rewrite.replacepathregex.replacement=/services/MyRestServer/api/$$1”
# Load balancing configuration
- “traefik.http.services.opcrouter-service.loadbalancer.server.port=8080”
# Check availability by sending requests to the specified path
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.path=/health/runtime/ready”
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.interval=5s”
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.timeout=2s”

opcrouter-secondary:
image: inrayhub.azurecr.io/opcrouter-runtime:5.3.6001.68
restart: always
networks:
- opcrouter-net
ports:
- “5086:8080”
environment:
- OR_I_ACCEPT_EULA=true
- INITIAL_USERNAME=admin
- INITIAL_PASSWORD=SuperSecret123
- OR_REDUNDANCY_MODE=2
- OR_REDUNDANCY_SHARED_KEY=LUyLxk4kZdvYW9kM6ZSBWbBatdj9RGow9Bp
- OR_REDUNDANCY_ADDRESS=http://opcrouter-primary:8080
- OR_REDUNDANCY_LOCAL_MANAGEMENT_ADDRESS=http://opcrouter-secondary:8080
- OR_REDUNDANCY_PRIMARY_TIMEOUT=30
- OR_REDUNDANCY_SECONDARY_HEARTBEAT_INTERVAL=10
- OR_IMPORT_SOURCE=/inray/REST_Secondary.rpe
volumes:
# Make project available in container
- ./REST_Secondary.rpe:/inray/REST_Secondary.rpe
# Configurations via labels
labels:
- “traefik.enable=true”
# Responds to the prefix /api
- “traefik.http.routers.api-router.rule=PathPrefix(`/api`)”
- “traefik.http.routers.api-router.entrypoints=web”
- “traefik.http.routers.api-router.service=opcrouter-service”
- “traefik.http.routers.api-router.middlewares=api-rewrite”
# Replaces /api/ with /services/MyRestServer/api/
- “traefik.http.middlewares.api-rewrite.replacepathregex.regex=^/api/(.*)”
- “traefik.http.middlewares.api-rewrite.replacepathregex.replacement=/services/MyRestServer/api/$$1”
# Load balancing configuration
- “traefik.http.services.opcrouter-service.loadbalancer.server.port=8080”
# Check availability by sending requests to the specified path
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.path=/health/runtime/ready”
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.interval=5s”
- “traefik.http.services.opcrouter-service.loadbalancer.healthcheck.timeout=2s”


networks:
opcrouter-net: