services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: ${DB_NAME:-trackeep} POSTGRES_USER: ${DB_USER:-trackeep} POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} ports: - "${DB_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgres/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-trackeep} -d ${DB_NAME:-trackeep}"] interval: 10s timeout: 5s retries: 5 start_period: 30s dragonfly: image: ghcr.io/dragonflydb/dragonfly:latest container_name: dragonfly ports: - "${DRAGONFLY_PORT:-6379}:6379" volumes: - dragonfly_data:/data command: dragonfly --requirepass=${DRAGONFLY_PASSWORD} --proactor_threads=2 environment: - DRAGONFLY_PASSWORD=${DRAGONFLY_PASSWORD} restart: unless-stopped healthcheck: test: ["CMD-SHELL", "redis-cli -a ${DRAGONFLY_PASSWORD} ping"] interval: 10s timeout: 5s retries: 5 start_period: 30s trackeep-backend: build: context: ./backend dockerfile: Dockerfile ports: - "${BACKEND_PORT:-8080}:${BACKEND_PORT:-8080}" env_file: - .env environment: - APP_VERSION=${APP_VERSION:-1.0.0} - BACKEND_PORT=${BACKEND_PORT:-8080} - FRONTEND_PORT=${FRONTEND_PORT:-8080} - DRAGONFLY_ADDR=${DRAGONFLY_ADDR:-dragonfly:6379} - DRAGONFLY_PASSWORD=${DRAGONFLY_PASSWORD} volumes: - ./data:/data - ./uploads:/app/uploads - /var/run/docker.sock:/var/run/docker.sock # Docker socket for updates restart: unless-stopped depends_on: postgres: condition: service_healthy dragonfly: condition: service_healthy healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:${BACKEND_PORT:-8080}/health || wget --no-verbose --tries=1 --spider http://localhost:${BACKEND_PORT:-8080}/live"] interval: 30s timeout: 10s retries: 3 start_period: 40s trackeep-frontend: build: context: . dockerfile: ./frontend/Dockerfile args: - VITE_DEMO_MODE=${VITE_DEMO_MODE:-false} - VITE_API_URL=${VITE_API_URL:-http://localhost:8080} ports: - "${FRONTEND_PORT:-3000}:${FRONTEND_PORT:-3000}" environment: - VITE_APP_VERSION=${APP_VERSION:-1.0.0} - VITE_DEMO_MODE=${VITE_DEMO_MODE:-false} - VITE_API_URL=${VITE_API_URL:-http://localhost:8080} - FRONTEND_PORT=${FRONTEND_PORT:-3000} volumes: - /var/run/docker.sock:/var/run/docker.sock # Docker socket for updates depends_on: trackeep-backend: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pgrep nginx > /dev/null || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: postgres_data: dragonfly_data: