services: postgresql: image: postgres:16 env_file: - env.d/development/postgresql ports: - "15432:5432" redis: image: redis:5 mailcatcher: image: sj26/mailcatcher:latest ports: - "1081:1080" garage: user: ${DOCKER_USER:-1000} image: dxflrs/garage:v2.4.1 command: /garage server --single-node --default-bucket env_file: - env.d/development/garage environment: - GARAGE_DEFAULT_ACCESS_KEY=meet-access-key - GARAGE_DEFAULT_SECRET_KEY=meet-secret-access-key - GARAGE_DEFAULT_BUCKET=meet-media-storage ports: - '127.0.0.1:9000:9000' healthcheck: test: [ "CMD", "/garage", "health" ] interval: 1s timeout: 20s retries: 300 volumes: - ./docker/files/etc/garage/garage.toml:/etc/garage.toml:ro - ./data/media:/var/lib/garage # Garage denies cross-origin requests by default: allow the frontend to upload files garage-cors: image: amazon/aws-cli:2.37.1 environment: - AWS_ACCESS_KEY_ID=meet-access-key - AWS_SECRET_ACCESS_KEY=meet-secret-access-key - AWS_DEFAULT_REGION=local depends_on: garage: condition: service_healthy restart: true command: - s3api - put-bucket-cors - --endpoint-url=http://garage:9000 - --bucket=meet-media-storage - '--cors-configuration={"CORSRules": [{"AllowedOrigins": ["http://localhost:3000"], "AllowedMethods": ["GET", "HEAD", "PUT"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag"]}]}' app-dev: build: context: . target: backend-development args: DOCKER_USER: ${DOCKER_USER:-1000} user: ${DOCKER_USER:-1000} image: meet:backend-development environment: - PYLINTHOME=/app/.pylint.d - DJANGO_CONFIGURATION=Development env_file: - env.d/development/common - env.d/development/postgresql ports: - "8071:8000" volumes: - ./src/backend:/app - ./data/static:/data/static - /app/.venv depends_on: - postgresql - mailcatcher - redis - garage-cors extra_hosts: - "127.0.0.1.nip.io:host-gateway" networks: - resource-server - default celery-dev: user: ${DOCKER_USER:-1000} image: meet:backend-development command: ["celery", "-A", "meet.celery_app", "worker", "-l", "DEBUG", "--pool=solo"] environment: - DJANGO_CONFIGURATION=Development env_file: - env.d/development/common - env.d/development/postgresql volumes: - ./src/backend:/app - ./data/static:/data/static - /app/.venv depends_on: - app-dev app: build: context: . target: backend-production args: DOCKER_USER: ${DOCKER_USER:-1000} user: ${DOCKER_USER:-1000} image: meet:backend-production environment: - DJANGO_CONFIGURATION=Demo env_file: - env.d/development/common - env.d/development/postgresql depends_on: - postgresql - redis - livekit - garage celery: user: ${DOCKER_USER:-1000} image: meet:backend-production command: ["celery", "-A", "meet.celery_app", "worker", "-l", "INFO", "--pool=solo"] environment: - DJANGO_CONFIGURATION=Demo env_file: - env.d/development/common - env.d/development/postgresql depends_on: - app nginx: image: nginx:1.25 ports: - "8083:8083" volumes: - ./docker/files/etc/nginx/conf.d:/etc/nginx/conf.d:ro depends_on: - keycloak - app-dev networks: - resource-server - default frontend: user: "${DOCKER_USER:-1000}" build: context: . dockerfile: ./src/frontend/Dockerfile target: frontend-production args: VITE_API_BASE_URL: "http://localhost:8071" VITE_MEDIA_BASE_URL: "http://localhost:8083" VITE_APP_TITLE: "LaSuite Meet" image: meet:frontend-development ports: - "3000:8080" dockerize: image: jwilder/dockerize platform: linux/x86_64 crowdin: image: crowdin/cli:4.0.0 volumes: - ".:/app" env_file: - env.d/development/crowdin user: "${DOCKER_USER:-1000}" working_dir: /app node: image: node:22-alpine user: "${DOCKER_USER:-1000}" environment: HOME: /tmp volumes: - ".:/app" kc_postgresql: image: postgres:14.3 ports: - "5433:5432" env_file: - env.d/development/kc_postgresql keycloak: image: quay.io/keycloak/keycloak:20.0.1 volumes: - ./docker/auth/realm.json:/opt/keycloak/data/import/realm.json command: - start-dev - --features=preview - --import-realm - --proxy=edge - --hostname-url=http://localhost:8083 - --hostname-admin-url=http://localhost:8083/ - --hostname-strict=false - --hostname-strict-https=false environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin KC_DB: postgres KC_DB_URL_HOST: kc_postgresql KC_DB_URL_DATABASE: keycloak KC_DB_PASSWORD: pass KC_DB_USERNAME: meet KC_DB_SCHEMA: public PROXY_ADDRESS_FORWARDING: 'true' ports: - "8080:8080" depends_on: - kc_postgresql livekit: image: livekit/livekit-server:v1.13.6 entrypoint: /livekit-server --dev --bind 0.0.0.0 --config ./config.yaml ports: - "7880:7880" - "7881:7881" - "7882:7882/udp" - "3478:3478/udp" - "30000-30100:30000-30100/udp" volumes: - ./docker/livekit/config/livekit-server.yaml:/config.yaml depends_on: - redis - livekit-egress livekit-egress: image: livekit/egress:v1.11.0 environment: EGRESS_CONFIG_FILE: ./livekit-egress.yaml volumes: - ./docker/livekit/config/livekit-egress.yaml:/livekit-egress.yaml - ./docker/livekit/out:/out depends_on: - redis metadata-collector-dev: build: context: ./src/agents target: development user: ${DOCKER_USER:-1000} command: ["python", "metadata_collector.py", "dev"] env_file: - env.d/development/metadata_collector volumes: - ./src/agents:/app - /app/.venv depends_on: - livekit - garage develop: watch: - action: rebuild path: ./src/agents multi-user-transcriber-dev: build: context: ./src/agents target: development user: ${DOCKER_USER:-1000} command: ["python", "multi_user_transcriber.py", "dev"] env_file: - env.d/development/multi_user_transcriber volumes: - ./src/agents:/app - /app/.venv redis-summary: image: redis:5 ports: - "6379:6379" app-summary-dev: build: context: src/summary target: development args: DOCKER_USER: ${DOCKER_USER:-1000} user: ${DOCKER_USER:-1000} env_file: - env.d/development/summary ports: - "8001:8000" volumes: - ./src/summary:/app depends_on: - redis-summary celery-summary-transcribe: container_name: celery-summary-transcribe build: context: ./src/summary dockerfile: Dockerfile target: production command: celery -A summary.core.celery_worker worker --pool=solo --loglevel=debug -Q transcribe-queue-v2 env_file: - env.d/development/summary volumes: - ./src/summary:/app depends_on: - redis-summary - app-summary-dev - garage develop: watch: - action: rebuild path: ./src/summary celery-summary-summarize: container_name: celery-summary-summarize build: context: ./src/summary dockerfile: Dockerfile target: production command: celery -A summary.core.celery_worker worker --pool=solo --loglevel=debug -Q summarize-queue-v2 env_file: - env.d/development/summary volumes: - ./src/summary:/app depends_on: - redis-summary - app-summary-dev - garage develop: watch: - action: rebuild path: ./src/summary networks: default: resource-server: