Files
ukmesh/docker-compose.yml
T
BenandClaude Opus 4.6 b9a231ef36 Dedup relay copies per observer and increase DB connection limit
Drop duplicate MQTT packets when the same packet hash arrives at the
same observer with the same hop count within 120s. Increase TimescaleDB
max_connections to 300 to prevent connection exhaustion on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:26:09 +00:00

592 lines
19 KiB
YAML

services:
timescaledb:
image: timescale/timescaledb:latest-pg16
restart: unless-stopped
command: ["postgres", "-c", "max_connections=300"]
environment:
POSTGRES_DB: ${POSTGRES_DB:-meshcore}
POSTGRES_USER: ${POSTGRES_USER:-meshcore}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD required}
volumes:
- timescaledb_data:/var/lib/postgresql/data
- ./backend/src/db/schema.sql:/docker-entrypoint-initdb.d/001_schema.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-meshcore} -d ${POSTGRES_DB:-meshcore}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
mosquitto:
image: eclipse-mosquitto:2
restart: unless-stopped
volumes:
- ./mosquitto:/mosquitto/config
- mosquitto_data:/mosquitto/data
- mosquitto_log:/mosquitto/log
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
backend:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
MQTT_BROKER_URL: ${MQTT_BROKER_URL:-ws://mosquitto:9001}
MQTT_USERNAME: ${MQTT_USERNAME:-backend}
MQTT_PASSWORD: ${MQTT_PASSWORD}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
OPENTOPODATA_API: ${OPENTOPODATA_API:-https://api.opentopodata.org}
PORT: ${PORT:-3000}
MESHCORE_CHANNEL_SECRETS: ${MESHCORE_CHANNEL_SECRETS:-}
OWNER_DATABASE_URL: ${OWNER_DATABASE_URL:-postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${OWNER_POSTGRES_DB:-meshcore_owner_auth}}
OWNER_MQTT_USERNAME_MAP: ${OWNER_MQTT_USERNAME_MAP:-}
OWNER_COOKIE_SECRET: ${OWNER_COOKIE_SECRET:-}
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-http://localhost:3001,http://localhost:3002},https://test.ukmesh.com
COVERAGE_MODEL_VERSION: ${COVERAGE_MODEL_VERSION:-5}
NODE_ENV: production
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
mosquitto:
condition: service_started
ports:
- "3000:3000"
path-learning-worker:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-learning.js"]
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
health-worker:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/health.js"]
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-01:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v01"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "200000"
PATH_SIM_MAX_CANDIDATES: "24"
PATH_SIM_HOP_MILES: "75"
PATH_SIM_WEAK_PATHLOSS_DB: "135"
PATH_SIM_MODEL_BUCKET_HOURS: "6"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-02:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v02"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "180000"
PATH_SIM_MAX_CANDIDATES: "20"
PATH_SIM_HOP_MILES: "70"
PATH_SIM_WEAK_PATHLOSS_DB: "134"
PATH_SIM_MODEL_BUCKET_HOURS: "6"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-03:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v03"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "220000"
PATH_SIM_MAX_CANDIDATES: "28"
PATH_SIM_HOP_MILES: "80"
PATH_SIM_WEAK_PATHLOSS_DB: "136"
PATH_SIM_MODEL_BUCKET_HOURS: "6"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-04:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v04"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "240000"
PATH_SIM_MAX_CANDIDATES: "24"
PATH_SIM_HOP_MILES: "85"
PATH_SIM_WEAK_PATHLOSS_DB: "135"
PATH_SIM_MODEL_BUCKET_HOURS: "4"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-05:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v05"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "260000"
PATH_SIM_MAX_CANDIDATES: "30"
PATH_SIM_HOP_MILES: "90"
PATH_SIM_WEAK_PATHLOSS_DB: "136"
PATH_SIM_MODEL_BUCKET_HOURS: "8"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-06:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v06"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "160000"
PATH_SIM_MAX_CANDIDATES: "18"
PATH_SIM_HOP_MILES: "65"
PATH_SIM_WEAK_PATHLOSS_DB: "133"
PATH_SIM_MODEL_BUCKET_HOURS: "6"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-07:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v07"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "280000"
PATH_SIM_MAX_CANDIDATES: "32"
PATH_SIM_HOP_MILES: "95"
PATH_SIM_WEAK_PATHLOSS_DB: "137"
PATH_SIM_MODEL_BUCKET_HOURS: "4"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-08:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v08"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "300000"
PATH_SIM_MAX_CANDIDATES: "36"
PATH_SIM_HOP_MILES: "100"
PATH_SIM_WEAK_PATHLOSS_DB: "138"
PATH_SIM_MODEL_BUCKET_HOURS: "8"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-09:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v09"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "210000"
PATH_SIM_MAX_CANDIDATES: "26"
PATH_SIM_HOP_MILES: "75"
PATH_SIM_WEAK_PATHLOSS_DB: "134"
PATH_SIM_MODEL_BUCKET_HOURS: "3"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
path-sim-worker-10:
build:
context: .
dockerfile: Dockerfile.backend
restart: unless-stopped
command: ["node", "dist/workers/path-sim.js"]
cpus: "0.5"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET required}
NODE_ENV: production
UV_THREADPOOL_SIZE: "1"
PATH_SIM_VARIANT_ID: "v10"
PATH_SIM_INTERVAL_MS: ${PATH_SIM_INTERVAL_MS:-21600000}
PATH_SIM_NETWORK: ${PATH_SIM_NETWORK:-all}
PATH_SIM_WINDOW_DAYS: "60"
PATH_SIM_ENABLE_EARLY_STOP: "false"
PATH_SIM_MAX_STATES: "230000"
PATH_SIM_MAX_CANDIDATES: "22"
PATH_SIM_HOP_MILES: "82"
PATH_SIM_WEAK_PATHLOSS_DB: "135"
PATH_SIM_MODEL_BUCKET_HOURS: "12"
PATH_SIM_PERM_BUCKET_CAP: ${PATH_SIM_PERM_BUCKET_CAP:-50}
PATH_SIM_LOG_EVERY: ${PATH_SIM_LOG_EVERY:-1}
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
link-backfill-worker:
build:
context: .
dockerfile: Dockerfile.backend
restart: "no"
command: ["node", "dist/workers/link-backfill.js"]
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
MQTT_BROKER_URL: ${MQTT_BROKER_URL:-ws://mosquitto:9001}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
MESHCORE_CHANNEL_SECRETS: ${MESHCORE_CHANNEL_SECRETS:-}
NODE_ENV: production
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
backend:
condition: service_started
app:
build:
context: .
dockerfile: Dockerfile.app
args:
VITE_APP_HOSTNAME: ${VITE_APP_HOSTNAME:-}
restart: unless-stopped
depends_on:
- backend
ports:
- "3001:80"
viewshed-worker:
build:
context: ./viewshed-worker
dockerfile: Dockerfile
restart: unless-stopped
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
SRTM_DIR: /data/srtm
WORKER_MODE: viewshed
NUM_WORKERS: '1'
COVERAGE_MODEL: ${COVERAGE_MODEL:-rf_radial_100m}
COVERAGE_MODEL_VERSION: ${COVERAGE_MODEL_VERSION:-5}
volumes:
- srtm_data:/data/srtm
deploy:
resources:
limits:
cpus: '1.5'
memory: '5g'
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
link-worker:
build:
context: ./viewshed-worker
dockerfile: Dockerfile
restart: unless-stopped
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-meshcore}:${POSTGRES_PASSWORD}@timescaledb:5432/${POSTGRES_DB:-meshcore}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
SRTM_DIR: /data/srtm
WORKER_MODE: link
NUM_WORKERS: '1'
volumes:
- srtm_data:/data/srtm
depends_on:
timescaledb:
condition: service_healthy
redis:
condition: service_healthy
website:
build:
context: .
dockerfile: Dockerfile.website
args:
VITE_APP_HOSTNAME: ${VITE_APP_HOSTNAME:-}
VITE_SITE: teesside
restart: unless-stopped
ports:
- "3002:80"
depends_on:
- backend
app-ukmesh:
build:
context: .
dockerfile: Dockerfile.app
args:
VITE_APP_HOSTNAME: app.ukmesh.com
VITE_NETWORK: ukmesh
VITE_SITE: ukmesh
restart: unless-stopped
depends_on:
- backend
ports:
- "3003:80"
website-ukmesh:
build:
context: .
dockerfile: Dockerfile.website
args:
VITE_APP_HOSTNAME: app.ukmesh.com
VITE_SITE: ukmesh
restart: unless-stopped
ports:
- "3004:80"
depends_on:
- backend
app-dev:
build:
context: .
dockerfile: Dockerfile.app
args:
VITE_APP_HOSTNAME: ${VITE_DEV_APP_HOSTNAME:-}
VITE_NETWORK: test
VITE_SITE: dev
VITE_OBSERVER_ID: ${VITE_DEV_OBSERVER_ID:-}
VITE_SITE_DISPLAY_NAME: ${VITE_DEV_SITE_DISPLAY_NAME:-UK Mesh Test}
VITE_SITE_FOOTER_NAME: ${VITE_DEV_SITE_FOOTER_NAME:-UK Mesh Test}
VITE_SITE_APP_URL: ${VITE_DEV_SITE_APP_URL:-https://test.ukmesh.com}
VITE_SITE_HOME_URL: ${VITE_DEV_SITE_HOME_URL:-https://test.ukmesh.com}
restart: unless-stopped
depends_on:
- backend
ports:
- "3005:80"
website-dev:
build:
context: .
dockerfile: Dockerfile.website
args:
VITE_APP_HOSTNAME: ${VITE_DEV_APP_HOSTNAME:-app-dev.ukmesh.com}
VITE_NETWORK: test
VITE_SITE: dev
VITE_OBSERVER_ID: ${VITE_DEV_OBSERVER_ID:-}
VITE_SITE_DISPLAY_NAME: ${VITE_DEV_SITE_DISPLAY_NAME:-UK Mesh Test}
VITE_SITE_FOOTER_NAME: ${VITE_DEV_SITE_FOOTER_NAME:-UK Mesh Test}
VITE_SITE_APP_URL: ${VITE_DEV_SITE_APP_URL:-https://test.ukmesh.com}
VITE_SITE_HOME_URL: ${VITE_DEV_SITE_HOME_URL:-https://test.ukmesh.com}
restart: unless-stopped
ports:
- "3006:80"
depends_on:
- backend
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
profiles: [tunnel]
environment:
TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
depends_on:
- backend
- app
- website
- app-ukmesh
- website-ukmesh
- app-dev
- website-dev
- mosquitto
volumes:
timescaledb_data:
mosquitto_data:
mosquitto_log:
redis_data:
srtm_data: