# HomeOS — dev stack (dev = prod parity, R8). All app-family services share one image. # mosquitto / mqtt-listener (Phase 3) and discovery sidecar (Phase 4) are added in their phases. x-app-image: &app-image image: homeos-app:dev build: context: . dockerfile: docker/app/Dockerfile args: HOST_UID: ${HOST_UID:-1000} HOST_GID: ${HOST_GID:-1000} # Laravel reads its own .env from the mounted volume (correct phpdotenv interpolation). # Compose still reads root .env for ${...} substitution in this file (ports, uid, db creds). volumes: - .:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/sites-available/default:ro depends_on: db: condition: service_healthy redis: condition: service_started restart: unless-stopped services: app: <<: *app-image ports: - "${APP_PORT:-80}:80" - "${VITE_PORT:-5173}:5173" horizon: <<: *app-image command: ["php", "artisan", "horizon"] ports: [] scheduler: <<: *app-image command: ["php", "artisan", "schedule:work"] ports: [] reverb: <<: *app-image command: ["php", "artisan", "reverb:start", "--host=0.0.0.0", "--port=8080"] ports: - "${REVERB_HOST_PORT:-6001}:8080" db: image: timescale/timescaledb:latest-pg17 environment: POSTGRES_DB: ${DB_DATABASE:-homeos} POSTGRES_USER: ${DB_USERNAME:-homeos} POSTGRES_PASSWORD: ${DB_PASSWORD:-homeos} volumes: - db-data:/var/lib/postgresql/data ports: - "127.0.0.1:${DB_HOST_PORT:-5432}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-homeos} -d ${DB_DATABASE:-homeos}"] interval: 5s timeout: 5s retries: 10 restart: unless-stopped redis: image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] volumes: - redis-data:/data restart: unless-stopped volumes: db-data: redis-data: