# QA Studio - Self-Contained Development Environment # This docker-compose file provides all services needed to run QA Studio locally # No external cloud services required! services: # PostgreSQL Database postgres: image: postgres:16-alpine container_name: qastudio-postgres restart: unless-stopped environment: POSTGRES_DB: qastudio POSTGRES_USER: qastudio POSTGRES_PASSWORD: ${DB_PASSWORD:-qastudio_dev_password} volumes: - postgres-data:/var/lib/postgresql/data ports: - '5432:5432' healthcheck: test: ['CMD-SHELL', 'pg_isready -U qastudio'] interval: 10s timeout: 5s retries: 5 # Redis for caching and session storage redis: image: redis:7-alpine container_name: qastudio-redis restart: unless-stopped command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-qastudio_redis_pass} volumes: - redis-data:/data ports: - '6379:6379' healthcheck: test: ['CMD', 'redis-cli', '--pass', '${REDIS_PASSWORD:-qastudio_redis_pass}', 'ping'] interval: 10s timeout: 5s retries: 5 # MinIO for object storage (S3-compatible) # Use this for storing test attachments (screenshots, videos, logs) minio: image: minio/minio:latest container_name: qastudio-minio restart: unless-stopped environment: MINIO_ROOT_USER: ${MINIO_USER:-qastudio} MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD:-qastudio_minio_pass} volumes: - minio-data:/data ports: - '9000:9000' # API - '9001:9001' # Console UI command: server /data --console-address ":9001" healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] interval: 30s timeout: 20s retries: 3 # Create MinIO bucket on startup minio-init: image: minio/mc:latest container_name: qastudio-minio-init depends_on: - minio entrypoint: > /bin/sh -c " sleep 5; /usr/bin/mc alias set myminio http://minio:9000 ${MINIO_USER:-qastudio} ${MINIO_PASSWORD:-qastudio_minio_pass}; /usr/bin/mc mb myminio/qastudio --ignore-existing; /usr/bin/mc anonymous set download myminio/qastudio; exit 0; " # MailHog for email testing # Captures all outbound emails and provides a web UI mailhog: image: mailhog/mailhog:latest container_name: qastudio-mailhog restart: unless-stopped ports: - '1025:1025' # SMTP server - '8025:8025' # Web UI logging: driver: 'none' # Disable logs to reduce noise # QA Studio Web Application web: build: context: . dockerfile: Dockerfile target: development container_name: qastudio-web restart: unless-stopped environment: # Database DATABASE_URL: postgresql://qastudio:${DB_PASSWORD:-qastudio_dev_password}@postgres:5432/qastudio # Redis REDIS_URL: redis://:${REDIS_PASSWORD:-qastudio_redis_pass}@redis:6379 # MinIO (S3-compatible storage) STORAGE_TYPE: minio S3_ENDPOINT: http://minio:9000 S3_ACCESS_KEY: ${MINIO_USER:-qastudio} S3_SECRET_KEY: ${MINIO_PASSWORD:-qastudio_minio_pass} S3_BUCKET: qastudio S3_REGION: us-east-1 # Email (MailHog) SMTP_HOST: mailhog SMTP_PORT: 1025 SMTP_SECURE: 'false' SMTP_FROM: noreply@qastudio.local # App Config ORIGIN: http://localhost:3000 NODE_ENV: development # Deployment Mode # Defaults to 'true' for Docker deployments (self-hosted mode) # - All features unlocked (AI analysis, advanced reports, integrations) # - Unlimited users and projects # - No Stripe/payment infrastructure required # Set to 'false' if running as hosted SaaS with payment processing # See SELF_HOSTED.md for details SELF_HOSTED: ${SELF_HOSTED:-true} # Session Secret (change in production!) SESSION_SECRET: ${SESSION_SECRET:-dev_secret_change_me_in_production} volumes: # Mount source code for hot reload (cached for better performance on Mac/Windows) - .:/app:cached - /app/node_modules - /app/.svelte-kit ports: - '3000:3000' depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy mailhog: condition: service_started command: sh -c "npx prisma migrate deploy && npm run dev -- --host" volumes: postgres-data: driver: local redis-data: driver: local minio-data: driver: local networks: default: name: qastudio-network