Home Assistant Operating System
Single‑Container Docker Image
Run a fully featured HAOS instance in a single Docker container
Keep the same experience you’d get on dedicated hardware or a VM.
🚧 Work In Progress 🚧
- Run HA OS without sacrificing a whole computer to it.
- Avoid VM performance overhead and hypervisor complexity.
- Use host hardware (like USB devices) directly without passthrough.
- Use host networking for service autodiscovery, simpler routing, and lower latency.
- x86_64 and aarch64 images available.
- Rootless containers support (experimental)
- Kubernetes? Sure. Helm chart included.
Simple as one command:
docker run --name haos -ti --privileged -p 8123:8123 qweritos/haos-one
You can pin a specific Home Assistant OS version tag (including prereleases), for example
qweritos/haos-one:17.0.rc2For available HAOS versions, see: https://github.com/home-assistant/operating-system/releases
Replace -p 8123:8123 with --network host if you want host networking (required for autodiscovery features).
Wait for http://localhost:8123 to be available. Now you can create new House or restore from existing backup.
First startup can take a while as it pulls all required images — please be patient.
Install from the OCI registry:
helm install haos-one oci://registry.andrey.wtf/charts/haos-oneOr install from the local chart:
helm install haos-one ./charts/haos-oneValues and configuration options: see charts/haos-one/README.md.
- Create a full backup in your existing install (Settings → System → Backups).
- Download the backup to your host.
- Start this container and restore the backup during onboarding.
- Confirm add-ons and integrations come back after restore.
Making consistent 1:1 clone of your HA instance.
All commands to be executed from host
Get your /usr/share/hassio contents from existing Supervised installation:
cp -r /usr/share/hassio ./old-configthen, push it to new instance:
docker exec -it haos sh -c 'mv /mnt/data/supervisor /mnt/data/supervisor.bak && mkdir -p /mnt/data/supervisor'
docker cp ./old-config/. haos:/mnt/data/supervisor/Finally, restart all Home Assistant containers:
docker exec -it haos systemctl restart docker- Host networking (best for autodiscovery):
docker run --name haos -ti --privileged --network host qweritos/haos-one - to make your data persistent, mount a volume into container's path
/mnt/datadocker run --name haos -ti --privileged -p 8123:8123 -v ./data:/mnt/data qweritos/haos-one - macOS: use a named volume (overlay2 feature gaps with bind mounts):
docker volume create haos-data docker run --name haos -ti --privileged -p 8123:8123 -v haos-data:/mnt/data qweritos/haos-one
| Name | Description | Default |
|---|---|---|
USE_DUMMY_NETWORKMANAGER |
Disable NetworkManager and enable haos-one-compat |
1 |
DISABLE_UDEV |
Disable in-container udev services | 1 |
DEV |
Used for development purposes - mount live haos-one-compat code volume |
0 |
- Drop into HA CLI:
docker attach haos(detach with
Ctrl-p+Ctrl-q) — more details: here - Systemd logs (incl. containers logs):
docker exec -it haos journalctl -xb - Container status:
docker exec -it haos docker ps -a
See docs for details.
- Runs with
--privileged, granting full access between host and container — see more. --network hostexposes services directly on the host network.- Protect
./data/because it contains HA configuration and secrets. - AppArmor may be unavailable depending on your environment.
| OS | Arch | Env | Status | Notes |
|---|---|---|---|---|
| macOS 15.6 (24G84) | x86_64 | Docker Desktop 4.55.0, Docker Engine 29.1.3 (client/server) | ✅ | AppArmor unavailable; use named volume (see Recipes). |
| Ubuntu 25.10 (Questing Quokka) | x86_64 | Docker Engine 29.1.3 (client/server) (rootless & rootfull) |
✅ | — |
| Ubuntu 25.10 (Questing Quokka) | x86_64 | Podman 5.4.2 | ✅ | — |
| Armbian OS 25.02.0 (bullseye) | aarch64 | Docker Engine 28.0.0 (client/server) | ✅ | — |
--network hostlets HA manage host networking and may cause misconfiguration.USE_DUMMY_NETWORKMANAGER=1is enabled by default."Unsupported system - Network Manager issues"warning - fix in progress.Failed to get outbound IP, retrying in 5s: can't get default interface from Supervisor: {"result":"error","message":"Interface default does not exist"in journal (with non-host networking) - fix in progress.Docker Desktop on MacOS becomes inaccessible if run withuse--network=host-e DISABLE_UDEV=1for workaround (flag is enabled by default)
See project page for details.
Apache License 2.0 (see LICENSE).
Not affiliated with Home Assistant.
