feat(ring): bridge runs automatically (no manual command)

User: the Ring bridge should start on its own, not via a manual command. Made
ring-mqtt part of the always-on stack (dropped the `addons` compose profile) —
it starts with `docker compose up -d`, idle until you log in. The setup guide no
longer shows a start command; it just links to the bridge UI for the Ring login
(+ 2FA) and reflects the real bridge status. README updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat/phase-1-bootstrap
HomeOS Bootstrap 2026-07-18 10:52:41 +02:00
parent 97dc49e577
commit ab8713bcb3
5 changed files with 19 additions and 37 deletions

View File

@ -52,21 +52,14 @@ On-demand integrations, managed under **Add-ons** in the sidebar.
### Ring (cloud, opt-in)
Ring has no local API, so HomeOS bridges it via [ring-mqtt](https://github.com/tsightler/ring-mqtt),
which runs as an **opt-in** container (it never starts on a Ring-less setup):
Ring has no local API, so HomeOS bridges it via [ring-mqtt](https://github.com/tsightler/ring-mqtt).
The bridge is part of the stack, so it **starts automatically** with `docker compose up -d` — no
manual step. Then:
```bash
bash docker/mosquitto/gen-passwd.sh # seeds the least-privileged `ring` broker account
docker compose --profile addons up -d ring-mqtt # start the bridge
```
Then:
1. Open **http://<host>:${RING_UI_PORT:-55123}** (ring-mqtt's own web UI) and sign in with your
Ring account (email + password + 2FA). It mints and stores the refresh token — HomeOS never
handles Ring's OAuth itself.
2. In HomeOS → **Add-ons → Ring → Install**, then **Connect account**.
3. Ring devices (doorbell, cameras, sensors) appear automatically under **Devices**, tagged **Cloud**.
1. In HomeOS → **Add-ons → Ring → Install → Einrichten**, click **Open bridge UI**
(**http://<host>:${RING_UI_PORT:-55123}**) and sign in with your Ring account (email + password
+ 2FA). The bridge mints and stores the refresh token — HomeOS never handles Ring's OAuth.
2. Ring devices (doorbell, cameras, sensors) appear automatically under **Devices**, tagged **Cloud**.
## Install as an app (PWA)

View File

@ -86,15 +86,13 @@ services:
- "${MQTT_HOST_PORT:-1883}:1883"
restart: unless-stopped
# Ring bridge — installable add-on, opt-in so a Ring-less setup never runs it:
# docker compose --profile addons up -d ring-mqtt
# Ring has no local API (handoff §12): the initial account login + 2FA is done in ring-mqtt's
# own web UI (http://<host>:${RING_UI_PORT:-55123}), which mints the refresh token; the bridge
# then connects to our broker as the least-privileged `ring` user and publishes device state
# under ring/# for HomeOS to ingest. We do not build a custom Ring client.
# Ring bridge — part of the stack so it starts automatically (no manual command). Idle and
# cheap until you log in. Ring has no local API (handoff §12): the account login + 2FA is done
# in ring-mqtt's own web UI (http://<host>:${RING_UI_PORT:-55123}), which mints the refresh
# token; the bridge then connects to our broker as the least-privileged `ring` user and
# publishes device state under ring/# for HomeOS to ingest. We do not build a custom Ring client.
ring-mqtt:
image: tsightler/ring-mqtt
profiles: ["addons"]
depends_on:
- mosquitto
environment:

View File

@ -24,10 +24,9 @@ return [
'body' => 'Ring bietet keine lokale Schnittstelle. Die Anmeldung inkl. 2FA passiert in der eigenen Weboberfläche der ring-mqtt-Bridge — HomeOS speichert keine Ring-Zugangsdaten.',
'setup' => 'Einrichten',
'setup_title' => 'Ring einrichten',
'setup_intro' => 'Ring wird über die separate ring-mqtt-Bridge angebunden. So richtest du sie ein:',
'step1' => 'Bridge starten (einmalig, am Server):',
'step2' => 'Bridge-Oberfläche öffnen und mit deinem Ring-Konto anmelden (inkl. 2FA). Die Bridge speichert das Token.',
'step3' => 'Fertig — deine Ring-Geräte erscheinen automatisch unter „Geräte" (Badge „Cloud").',
'setup_intro' => 'Die ring-mqtt-Bridge läuft automatisch als Teil von HomeOS — kein manueller Start nötig. So verbindest du dein Ring-Konto:',
'step1' => 'Bridge-Oberfläche öffnen (Button unten) und mit deinem Ring-Konto anmelden — inklusive 2FA. Die Bridge speichert das Token.',
'step2' => 'Fertig — deine Ring-Geräte erscheinen automatisch unter „Geräte" (Badge „Cloud").',
'open_bridge' => 'Bridge-Oberfläche öffnen',
'status_title' => 'Bridge-Status',
'status_hint_disconnected' => 'Noch keine Verbindung von der Bridge empfangen. Starte die Bridge und melde dich an.',

View File

@ -24,10 +24,9 @@ return [
'body' => 'Ring has no local API. The login incl. 2FA happens in the ring-mqtt bridge\'s own web UI — HomeOS never stores Ring credentials.',
'setup' => 'Set up',
'setup_title' => 'Set up Ring',
'setup_intro' => 'Ring connects through the separate ring-mqtt bridge. Set it up like this:',
'step1' => 'Start the bridge (once, on the server):',
'step2' => 'Open the bridge UI and sign in with your Ring account (incl. 2FA). The bridge stores the token.',
'step3' => 'Done — your Ring devices appear automatically under “Devices” (with a “Cloud” badge).',
'setup_intro' => 'The ring-mqtt bridge runs automatically as part of HomeOS — no manual start. Connect your Ring account like this:',
'step1' => 'Open the bridge UI (button below) and sign in with your Ring account — including 2FA. The bridge stores the token.',
'step2' => 'Done — your Ring devices appear automatically under “Devices” (with a “Cloud” badge).',
'open_bridge' => 'Open bridge UI',
'status_title' => 'Bridge status',
'status_hint_disconnected' => 'No connection received from the bridge yet. Start the bridge and sign in.',

View File

@ -5,19 +5,12 @@
<ol class="flex flex-col gap-3">
<li class="flex gap-3">
<span class="grid place-items-center w-6 h-6 rounded-full bg-inset text-ink-2 font-mono text-[12px] shrink-0">1</span>
<div class="min-w-0 flex-1">
<p class="text-[12.5px] text-ink-2">{{ __('addons.ring.step1') }}</p>
<code class="mt-1 block rounded-lg bg-base border border-line-soft px-3 py-2 text-[12px] font-mono text-ink overflow-x-auto">docker compose --profile addons up -d ring-mqtt</code>
</div>
<p class="text-[12.5px] text-ink-2 pt-0.5">{{ __('addons.ring.step1') }}</p>
</li>
<li class="flex gap-3">
<span class="grid place-items-center w-6 h-6 rounded-full bg-inset text-ink-2 font-mono text-[12px] shrink-0">2</span>
<p class="text-[12.5px] text-ink-2 pt-0.5">{{ __('addons.ring.step2') }}</p>
</li>
<li class="flex gap-3">
<span class="grid place-items-center w-6 h-6 rounded-full bg-inset text-ink-2 font-mono text-[12px] shrink-0">3</span>
<p class="text-[12.5px] text-ink-2 pt-0.5">{{ __('addons.ring.step3') }}</p>
</li>
</ol>
<a href="{{ $bridgeUrl }}" target="_blank" rel="noopener noreferrer"