services: db: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-rehearsalhub} POSTGRES_USER: ${POSTGRES_USER:-rh_user} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default_secure_password} volumes: - pg_data_dev:/var/lib/postgresql/data networks: - rh_net healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-rh_user} -d ${POSTGRES_DB:-rehearsalhub} || exit 1"] interval: 10s timeout: 5s retries: 20 start_period: 20s redis: image: redis:7-alpine networks: - rh_net api: build: context: ./api target: development volumes: - ./api/src:/app/src environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-rh_user}:${POSTGRES_PASSWORD:-default_secure_password}@db:5432/${POSTGRES_DB:-rehearsalhub} NEXTCLOUD_URL: ${NEXTCLOUD_URL:-https://cloud.example.com} NEXTCLOUD_USER: ${NEXTCLOUD_USER:-rh_service} NEXTCLOUD_PASS: ${NEXTCLOUD_PASS:-default_password} REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-replace_me_with_32_byte_hex_default} INTERNAL_SECRET: ${INTERNAL_SECRET:-replace_me_with_32_byte_hex_default} DOMAIN: ${DOMAIN:-localhost} PYTHONPATH: /app/src ports: - "8000:8000" networks: - rh_net depends_on: db: condition: service_healthy web: build: context: ./web target: development volumes: - ./web:/app - /app/node_modules environment: API_URL: http://api:8000 ports: - "3000:3000" networks: - rh_net depends_on: - api networks: rh_net: driver: bridge volumes: pg_data_dev: