services: timescaledb: image: timescale/timescaledb:latest-pg16 restart: unless-stopped 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 app: build: context: . dockerfile: Dockerfile args: VITE_APP_HOSTNAME: ${VITE_APP_HOSTNAME:-} 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:-} ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-http://localhost:3000,http://localhost:3001} NODE_ENV: production depends_on: timescaledb: condition: service_healthy redis: condition: service_healthy mosquitto: condition: service_started ports: - "3000:3000" 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 NUM_WORKERS: '1' volumes: - srtm_data:/data/srtm deploy: resources: limits: cpus: '1.5' memory: '5g' depends_on: timescaledb: condition: service_healthy redis: condition: service_healthy website: build: context: . dockerfile: Dockerfile.website args: VITE_APP_HOSTNAME: ${VITE_APP_HOSTNAME:-} restart: unless-stopped ports: - "3001:80" depends_on: - app cloudflared: image: cloudflare/cloudflared:latest restart: unless-stopped command: tunnel run profiles: [tunnel] environment: TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN} depends_on: - app - website - mosquitto volumes: timescaledb_data: mosquitto_data: mosquitto_log: redis_data: srtm_data: