Runs the LAGER418 workshop inventory (NestJS API + Nuxt SPA + Postgres) as a single Home Assistant add-on, behind ingress.
Settings → Add-ons → Add-on Store → ⋮ → Repositories → add:
https://github.com/layer418/lager418-addon
Then install LAGER418 from the store and open it from the sidebar.
repository.yaml store listing
lager418/ the add-on
config.yaml manifest (version here == published image tag)
build.yaml base image per arch + pinned API/WEB versions
Dockerfile assembles the two artifact images onto the HA base
rootfs/ s6 services: postgres → api → web
No application source lives here. Both app repos already publish
ghcr.io/layer418/lager418-{api,web}:v<tag> from their bump prod CI on a v*
tag; this Dockerfile just COPY --froms /app out of those images.
- Tag
lager418-apiandlager418-web→ their prod CI pushesghcr.io/layer418/lager418-{api,web}:v<version>. - Bump
API_VERSION/WEB_VERSIONinlager418/build.yamlandversion:inlager418/config.yaml, add a CHANGELOG entry. - Tag this repo
v<version>→ CI builds both arches and pushesghcr.io/layer418/lager418-{arch}:<version>.
version: in config.yaml must equal the pushed image tag — that is the
entire update mechanism Supervisor uses.
Day-to-day work happens in the app repos (docker compose up / nuxt dev)
against Keycloak + MinIO — AUTH_MODE and STORAGE_DRIVER default to that,
so the add-on's ingress/local-disk paths never get in the way.
To test the add-on itself, copy lager418/ into /addons/ on a real HA box
(SSH or Samba add-on) — it shows up under "Local add-ons" and Supervisor
builds it on the device:
ha addons rebuild local_lager418
ha addons logs local_lager418 -f