version: "3.8" services: # PostgreSQL with TimescaleDB postgres: image: timescale/timescaledb:latest-pg16 container_name: cloudplatform-postgres environment: POSTGRES_DB: cloudplatform POSTGRES_USER: cloudplatform POSTGRES_PASSWORD: ${CP_PG_PASSWORD} PGDATA: /var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data ports: - 5432:5432 healthcheck: test: - CMD-SHELL - pg_isready -U cloudplatform interval: 10s timeout: 5s retries: 5 networks: - cloudplatform-network # Redis redis: image: redis:7-alpine container_name: cloudplatform-redis command: redis-server --requirepass ${CP_REDIS_PASSWORD} --maxmemory 512mb --maxmemory-policy allkeys-lru ports: - 6379:6379 volumes: - redis_data:/data healthcheck: test: - CMD - redis-cli - --raw - incr - ping interval: 10s timeout: 5s retries: 5 networks: - cloudplatform-network # RabbitMQ (Message Queue for Celery) rabbitmq: image: rabbitmq:3.13-management-alpine container_name: cloudplatform-rabbitmq environment: RABBITMQ_DEFAULT_USER: cloudplatform RABBITMQ_DEFAULT_PASS: ${CP_RABBITMQ_PASSWORD} ports: - 5672:5672 - 15672:15672 # Management UI volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: - CMD - rabbitmq-diagnostics - ping interval: 30s timeout: 10s retries: 5 networks: - cloudplatform-network # Backend API api: build: context: ./backend dockerfile: Dockerfile container_name: cloudplatform-api command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload volumes: - ./backend:/app ports: - 8000:8000 environment: - ENVIRONMENT=development - DEBUG=true - LOG_LEVEL=debug - DATABASE_URL=postgresql+asyncpg://cloudplatform:${CP_PG_PASSWORD}@postgres:5432/cloudplatform - REDIS_URL=redis://:${CP_REDIS_PASSWORD}@redis:6379/0 - CELERY_BROKER_URL=amqp://cloudplatform:${CP_RABBITMQ_PASSWORD}@rabbitmq:5672// - CELERY_RESULT_BACKEND=redis://:${CP_REDIS_PASSWORD}@redis:6379/1 - JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-min-32-chars - CORS_ORIGINS=http://localhost:3000,http://localhost:5173,http://192.168.31.100:3000,http://192.168.31.100:3000 depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy networks: - cloudplatform-network # Celery Worker celery-worker: build: context: ./backend dockerfile: Dockerfile container_name: cloudplatform-celery-worker command: celery -A app.tasks.celery_app worker --loglevel=info --concurrency=2 volumes: - ./backend:/app environment: - ENVIRONMENT=development - DATABASE_URL=postgresql+asyncpg://cloudplatform:${CP_PG_PASSWORD}@postgres:5432/cloudplatform - REDIS_URL=redis://:${CP_REDIS_PASSWORD}@redis:6379/0 - CELERY_BROKER_URL=amqp://cloudplatform:${CP_RABBITMQ_PASSWORD}@rabbitmq:5672// - CELERY_RESULT_BACKEND=redis://:${CP_REDIS_PASSWORD}@redis:6379/1 - JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-min-32-chars depends_on: - postgres - redis - rabbitmq networks: - cloudplatform-network # Celery Beat (Periodic Tasks) celery-beat: build: context: ./backend dockerfile: Dockerfile container_name: cloudplatform-celery-beat command: celery -A app.tasks.celery_app beat --loglevel=info volumes: - ./backend:/app environment: - ENVIRONMENT=development - DATABASE_URL=postgresql+asyncpg://cloudplatform:${CP_PG_PASSWORD}@postgres:5432/cloudplatform - REDIS_URL=redis://:${CP_REDIS_PASSWORD}@redis:6379/0 - CELERY_BROKER_URL=amqp://cloudplatform:${CP_RABBITMQ_PASSWORD}@rabbitmq:5672// - CELERY_RESULT_BACKEND=redis://:${CP_REDIS_PASSWORD}@redis:6379/1 - JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-min-32-chars depends_on: - postgres - redis - rabbitmq networks: - cloudplatform-network # Flower (Celery monitoring) flower: build: context: ./backend dockerfile: Dockerfile container_name: cloudplatform-flower command: celery -A app.tasks.celery_app flower --port=5555 ports: - 5555:5555 environment: - ENVIRONMENT=development - DATABASE_URL=postgresql+asyncpg://cloudplatform:${CP_PG_PASSWORD}@postgres:5432/cloudplatform - REDIS_URL=redis://:${CP_REDIS_PASSWORD}@redis:6379/0 - CELERY_BROKER_URL=amqp://cloudplatform:${CP_RABBITMQ_PASSWORD}@rabbitmq:5672// - CELERY_RESULT_BACKEND=redis://:${CP_REDIS_PASSWORD}@redis:6379/1 - JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-min-32-chars depends_on: - rabbitmq - redis networks: - cloudplatform-network # Frontend (React) frontend: build: context: ./frontend dockerfile: Dockerfile.dev container_name: cloudplatform-frontend volumes: - ./frontend:/app - /app/node_modules ports: - 3000:3000 environment: - VITE_API_URL=http://192.168.31.100:8000/api/v1 depends_on: - api networks: - cloudplatform-network volumes: postgres_data: driver: local redis_data: driver: local rabbitmq_data: driver: local networks: cloudplatform-network: driver: bridge