name: hauser-dev services: home-assistant: image: ghcr.io/home-assistant/home-assistant:2026.7.4@sha256:5a531753cea96444200158fc2b0ac7ccd739291ec50414877b396de6e0bb29b3 restart: unless-stopped environment: TZ: Europe/Berlin ports: - "${HAUSER_DEV_HOST_ADDRESS:?Run scripts/dev-pilot.sh instead of invoking Compose directly}:${HAUSER_DEV_HA_PORT:-18123}:8123" volumes: - home_assistant_config:/config - ./dev/home-assistant/configuration.yaml:/config/configuration.yaml:ro healthcheck: test: - CMD - python - -c - "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8123/manifest.json', timeout=3)" interval: 10s timeout: 5s start_period: 60s retries: 12 hauser: image: hauser:dev-pilot pull_policy: never build: context: . dockerfile: Dockerfile args: HAUSER_VERSION: dev-pilot # Named volumes carry the right ownership already — no root preparation # needed, and cap_drop: ALL would not allow it (see compose.yaml). user: node init: true restart: unless-stopped read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true ports: - "${HAUSER_DEV_APP_BIND_ADDRESS:-127.0.0.1}:${HAUSER_DEV_APP_PORT:-14173}:4173" environment: HMI_ALLOWED_ORIGINS: "http://localhost:${HAUSER_DEV_APP_PORT:-14173},http://127.0.0.1:${HAUSER_DEV_APP_PORT:-14173},http://${HAUSER_DEV_HOST_ADDRESS}:${HAUSER_DEV_APP_PORT:-14173}" HMI_AI_CUSTOMIZING_ENABLED: "0" HMI_ROOM_IMAGE_AUTH_MODE: direct HMI_HOUSEHOLD_CONFIG_PATH: /config/household.json HMI_HOUSEHOLD_CONFIG_MODE: active HMI_CONFIG_PATH: /data/config.json HMI_FAMILY_DATA_PATH: /data/family-data.json HMI_SONG_LIBRARY_DIR: /data/songs HMI_REQUIRED_WRITABLE_DIRS: /config,/data,/assets volumes: - hauser_config:/config - hauser_data:/data - hauser_assets:/assets tmpfs: - /tmp:rw,nosuid,nodev,noexec,size=64m healthcheck: test: ["CMD", "node", "container/healthcheck.mjs"] interval: 10s timeout: 3s start_period: 10s retries: 3 stop_grace_period: 15s depends_on: home-assistant: condition: service_healthy volumes: home_assistant_config: hauser_config: hauser_data: hauser_assets: