version: '3.8' services: postgres: image: timescale/timescaledb:latest-pg15 container_name: connectivityos-postgres environment: POSTGRES_DB: connectivityos POSTGRES_USER: cos POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-cos} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U cos -d connectivityos"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: connectivityos-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 rabbitmq: image: rabbitmq:3-management-alpine container_name: connectivityos-rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-guest} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-guest} volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_running"] interval: 10s timeout: 5s retries: 5 keycloak: image: quay.io/keycloak/keycloak:24.0 container_name: connectivityos-keycloak command: start-dev ports: - "8080:8080" environment: KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_ADMIN:-admin} KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD:-admin} volumes: - keycloak_data:/opt/keycloak/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health/ready"] interval: 10s timeout: 5s retries: 10 api: build: context: ../api dockerfile: Dockerfile container_name: connectivityos-api ports: - "8000:8000" environment: DATABASE_URL: postgresql+asyncpg://cos:${POSTGRES_PASSWORD:-cos}@postgres:5432/connectivityos REDIS_URL: redis://redis:6379/0 RABBITMQ_URL: amqp://${RABBITMQ_USER:-guest}:${RABBITMQ_PASSWORD:-guest}@rabbitmq:5672/ KEYCLOAK_URL: http://keycloak:8080 KEYCLOAK_REALM: connectivityos KEYCLOAK_CLIENT_ID: connectivityos-api KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET:-secret} SECRET_KEY: ${SECRET_KEY:-change-me-in-production} DEBUG: "true" LOG_LEVEL: DEBUG JSON_LOGS: "false" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy keycloak: condition: service_healthy volumes: - ../api/app:/app/app:ro worker: build: context: ../api dockerfile: Dockerfile container_name: connectivityos-worker command: celery -A app.workers.celery_app worker -l info environment: DATABASE_URL: postgresql+asyncpg://cos:${POSTGRES_PASSWORD:-cos}@postgres:5432/connectivityos REDIS_URL: redis://redis:6379/0 RABBITMQ_URL: amqp://${RABBITMQ_USER:-guest}:${RABBITMQ_PASSWORD:-guest}@rabbitmq:5672/ SECRET_KEY: ${SECRET_KEY:-change-me-in-production} depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy frontend: build: context: ../frontend dockerfile: Dockerfile container_name: connectivityos-frontend ports: - "3000:3000" environment: VITE_API_URL: http://localhost:8000 depends_on: - api volumes: postgres_data: redis_data: rabbitmq_data: keycloak_data: