diff --git a/stacks/cloud-platform/docker-compose.yml b/stacks/cloud-platform/docker-compose.yml new file mode 100644 index 0000000..cadd9c5 --- /dev/null +++ b/stacks/cloud-platform/docker-compose.yml @@ -0,0 +1,190 @@ +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