mediagit-storage 0.2.0

Unified async storage backend trait and implementations
Documentation
version: '3.8'

# MediaGit Storage Backend Testing Infrastructure
# Provides local emulators for S3, Azure, GCS, and MinIO testing

services:
  # ============================================================================
  # LocalStack - AWS S3 Emulator
  # ============================================================================
  localstack:
    image: localstack/localstack:latest
    container_name: mediagit-localstack
    ports:
      - "4566:4566"  # LocalStack edge port (all services)
      - "4571:4571"  # LocalStack legacy S3 port
    environment:
      - SERVICES=s3
      - DEBUG=1
      - AWS_DEFAULT_REGION=us-east-1
      - AWS_ACCESS_KEY_ID=test
      - AWS_SECRET_ACCESS_KEY=test
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4566/_localstack/health"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - mediagit-test

  # ============================================================================
  # Azurite - Azure Blob Storage Emulator
  # ============================================================================
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite:latest
    container_name: mediagit-azurite
    ports:
      - "10000:10000"  # Blob service
      - "10001:10001"  # Queue service
      - "10002:10002"  # Table service
    environment:
      - AZURITE_ACCOUNTS=devstoreaccount1:Eby8vdM09T1+hIvGdd4nJ3TrzLlTAj5KhKb8LQ+d9Cg5pBGG7XXqE6aBb+Ke3Y9T/mW8JW/lWz9FzWXhKW3dYg==
    command: "azurite-blob --blobHost 0.0.0.0 --blobPort 10000 --loose --skipApiVersionCheck"
    volumes:
      - "./azurite_data:/data"
    healthcheck:
      test: ["CMD", "nc", "-z", "localhost", "10000"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - mediagit-test

  # ============================================================================
  # Azurite Init - Container initialization
  # ============================================================================
  azurite-init:
    image: mcr.microsoft.com/azure-cli:latest
    container_name: mediagit-azurite-init
    depends_on:
      azurite:
        condition: service_started
    entrypoint: >
      /bin/bash -c "
      sleep 5;
      az storage container create --name test-container --connection-string 'DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM09T1+hIvGdd4nJ3TrzLlTAj5KhKb8LQ+d9Cg5pBGG7XXqE6aBb+Ke3Y9T/mW8JW/lWz9FzWXhKW3dYg==;BlobEndpoint=http://azurite:10000/devstoreaccount1;' || true;
      exit 0;
      "
    networks:
      - mediagit-test

  # ============================================================================
  # GCS Emulator - Google Cloud Storage Emulator
  # ============================================================================
  gcs-emulator:
    image: fsouza/fake-gcs-server:latest
    container_name: mediagit-gcs-emulator
    ports:
      - "4443:4443"
    command:
      - "-scheme"
      - "http"
      - "-port"
      - "4443"
      - "-external-url"
      - "http://localhost:4443"
      - "-public-host"
      - "localhost:4443"
    volumes:
      - "./gcs_data:/data"
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:4443/storage/v1/b"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - mediagit-test

  # ============================================================================
  # MinIO - S3-Compatible Object Storage
  # ============================================================================
  minio:
    image: minio/minio:latest
    container_name: mediagit-minio
    ports:
      - "9000:9000"  # API port
      - "9001:9001"  # Console port
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
      MINIO_DOMAIN: localhost
      MINIO_REGION_NAME: us-east-1
    command: server /data --console-address ":9001"
    volumes:
      - "./minio_data:/data"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - mediagit-test

  # ============================================================================
  # MinIO Client - For bucket initialization
  # ============================================================================
  minio-init:
    image: minio/mc:latest
    container_name: mediagit-minio-init
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: >
      /bin/sh -c "
      /usr/bin/mc alias set myminio http://minio:9000 minioadmin minioadmin;
      /usr/bin/mc mb myminio/test-bucket --ignore-existing;
      /usr/bin/mc mb myminio/mediagit --ignore-existing;
      exit 0;
      "
    networks:
      - mediagit-test

networks:
  mediagit-test:
    driver: bridge

volumes:
  localstack_data:
  azurite_data:
  gcs_data:
  minio_data: