version: "3.9" services: postgres: image: postgres:16 environment: POSTGRES_DB: feedbackhub POSTGRES_USER: ${POSTGRES_USER:-feedback} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-feedback} -d feedbackhub"] interval: 5s timeout: 3s retries: 5 redis: image: redis:7-alpine command: redis-server --requirepass ${REDIS_PASSWORD:-changeme} --appendonly yes volumes: - redisdata:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-changeme}", "ping"] interval: 5s timeout: 3s retries: 5 minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin} volumes: - miniodata:/data ports: - "9000:9000" - "9001:9001" healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 3s retries: 5 backend: build: ./backend command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-feedback}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/feedbackhub REDIS_URL: redis://:${REDIS_PASSWORD:-changeme}@redis:6379/0 MINIO_ENDPOINT: minio:9000 MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} MINIO_BUCKET: feedback-media SECRET_KEY: ${SECRET_KEY:-dev-secret-change-in-prod} JWT_ALGORITHM: HS256 volumes: - ./backend:/app - media_processing:/tmp/media ports: - "8000:8000" depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy worker: build: ./backend command: python -m app.workers.runner environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-feedback}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/feedbackhub REDIS_URL: redis://:${REDIS_PASSWORD:-changeme}@redis:6379/0 MINIO_ENDPOINT: minio:9000 MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} MINIO_BUCKET: feedback-media SECRET_KEY: ${SECRET_KEY:-dev-secret-change-in-prod} volumes: - ./backend:/app - media_processing:/tmp/media depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy frontend: build: ./frontend command: npm run dev environment: NEXT_PUBLIC_API_URL: http://localhost:8000 NEXT_PUBLIC_WS_URL: ws://localhost:8000 volumes: - ./frontend/src:/app/src - ./frontend/public:/app/public ports: - "3000:3000" depends_on: - backend volumes: pgdata: redisdata: miniodata: media_processing: