version: "3.9" services: db: image: postgres:15-alpine restart: unless-stopped environment: POSTGRES_DB: taptrack_hub POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres volumes: - db_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 10 redis: image: redis:7-alpine restart: unless-stopped volumes: - redis_data:/data backend: build: ./backend restart: unless-stopped environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/taptrack_hub REDIS_URL: redis://redis:6379/0 SECRET_KEY: changeme-in-production-use-openssl-rand-hex-32 ENVIRONMENT: development SEMAPHORE_API_KEY: "" SMTP_HOST: "" SMTP_PORT: "587" SMTP_USER: "" SMTP_PASSWORD: "" SMTP_FROM: "noreply@taptrack.io" HUB_BASE_URL: "http://localhost:8080" volumes: - ./backend:/app - backend_data:/app/data depends_on: db: condition: service_healthy redis: condition: service_started celery: build: ./backend command: celery -A app.worker worker --loglevel=info --concurrency=2 restart: unless-stopped environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/taptrack_hub REDIS_URL: redis://redis:6379/0 SECRET_KEY: changeme-in-production-use-openssl-rand-hex-32 ENVIRONMENT: development SEMAPHORE_API_KEY: "" SMTP_HOST: "" SMTP_PORT: "587" SMTP_USER: "" SMTP_PASSWORD: "" SMTP_FROM: "noreply@taptrack.io" HUB_BASE_URL: "http://localhost:8080" volumes: - ./backend:/app - backend_data:/app/data depends_on: - db - redis celery-beat: build: ./backend command: celery -A app.worker beat --loglevel=info restart: unless-stopped environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/taptrack_hub REDIS_URL: redis://redis:6379/0 SECRET_KEY: changeme-in-production-use-openssl-rand-hex-32 ENVIRONMENT: development SEMAPHORE_API_KEY: "" SMTP_HOST: "" SMTP_PORT: "587" SMTP_USER: "" SMTP_PASSWORD: "" SMTP_FROM: "noreply@taptrack.io" HUB_BASE_URL: "http://localhost:8080" volumes: - ./backend:/app - backend_data:/app/data depends_on: - db - redis frontend: build: ./frontend restart: unless-stopped depends_on: - backend nginx: image: nginx:alpine restart: unless-stopped ports: - "8080:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - backend - frontend volumes: db_data: redis_data: backend_data: