feat(rvs): Caddy optional per COMPOSE_PROFILES — oder eigener Reverse-Proxy

Neu in rvs/.env: COMPOSE_PROFILES=caddy (wie bisher, Caddy macht TLS) oder
leer (ohne Caddy). Der RVS bietet dafuer immer einen unverschluesselten Port
an (RVS_HTTP_BIND:RVS_HTTP_PORT, Default 127.0.0.1:3000), auf den ein
vorhandener nginx/Traefik zeigt — statt nginx → Caddy → RVS mit doppeltem TLS.
Caddys HTTPS-Port ist jetzt CADDY_HTTPS_PORT (Default 444 wie bisher).

README: beide Modi, nginx-Vorlage mit WebSocket-Headern und IPv6, Hinweis
dass Caddy fuer die Zertifikats-Erneuerung Port 80 von aussen braucht.
Bestehende Installationen mit Caddy muessen COMPOSE_PROFILES=caddy eintragen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 12:22:11 +01:00
co-authored by Claude Opus 5.5
parent 35436bff3c
commit 88036bcad3
3 changed files with 99 additions and 28 deletions
+60 -9
View File
@@ -825,17 +825,31 @@ Wer sich mit dem gleichen Token verbindet, landet im gleichen Room.
```bash
cd rvs
cp .env.example .env # PUBLIC_URL eintragen (Domain die auf den Server zeigt)
cp .env.example .env # Modus waehlen (COMPOSE_PROFILES) + Werte eintragen
docker compose up -d
```
**Zwei Modi** — in der `rvs/.env` per `COMPOSE_PROFILES`:
| Modus | `.env` | Wer macht TLS | Apps/Satelliten verbinden auf |
|---|---|---|---|
| **mit Caddy** | `COMPOSE_PROFILES=caddy` + `PUBLIC_URL` | Caddy im Stack (Let's Encrypt) | `PUBLIC_URL:CADDY_HTTPS_PORT` |
| **ohne Caddy** | `COMPOSE_PROFILES=` (leer) | dein Reverse-Proxy (nginx, Traefik …) | Name + Port deines Proxys (meist 443) |
**Stack:**
- `caddy` (TLS-Terminator + Let's Encrypt, lauscht auf 80+443)
- `rvs` (WebSocket Relay + OAuth-Callback HTTP, nur intern auf Port 3000)
- `rvs` (WebSocket Relay + OAuth-Callback HTTP). Unverschluesselter Port
`RVS_HTTP_BIND:RVS_HTTP_PORT` (Default `127.0.0.1:3000`) — fuer den Reverse-Proxy.
- `caddy` (nur Modus Caddy: TLS + Let's Encrypt auf 80 + `CADDY_HTTPS_PORT`)
Caddy holt automatisch ein Zertifikat fuer `PUBLIC_URL` via HTTP-01-Challenge.
ACME-State persistent in `./data/caddy/` (gitignored) — kein Rate-Limit-Drama
bei Container-Restart. WebSocket-Upgrades reicht Caddy transparent durch.
Dafuer muss **Port 80 von aussen auf diesen Rechner** gehen — sonst schlaegt die
Erneuerung still fehl und das Zertifikat laeuft nach 90 Tagen ab (Apps und
Satelliten verbinden dann nicht mehr). ACME-State persistent in `./data/caddy/`
(gitignored). WebSocket-Upgrades reicht Caddy transparent durch.
> **Bestehende Installation aktualisieren:** Caddy startet nur noch mit
> `COMPOSE_PROFILES=caddy` in der `rvs/.env`. Wer Caddy weiter nutzt, traegt das
> dort ein (sonst laeuft nach `git pull` + `up -d` kein TLS mehr).
**Features:**
- WebSocket Relay (alle Message-Types: chat, audio, file, config, xtts, update, etc.)
@@ -853,10 +867,47 @@ cp ARIA-v0.0.3.0.apk ~/ARIA-AGENT/rvs/updates/
**Multi-Instanz:** Mehrere ARIA-VMs koennen denselben RVS nutzen — jede mit eigenem Token.
**Ohne Caddy / eigener TLS-Terminator:** Wenn Du schon einen Reverse-Proxy
(nginx/Traefik) davor hast, kommentier den `caddy`-Service in der
`rvs/docker-compose.yml` aus und gib `rvs` wieder einen `ports`-Block
(z.B. `["3000:3000"]`). Dein Reverse-Proxy macht dann TLS und reicht weiter.
**Ohne Caddy — eigener Reverse-Proxy:** in der `rvs/.env`
```bash
COMPOSE_PROFILES=
RVS_HTTP_BIND=0.0.0.0 # Proxy auf anderem Rechner; gleicher Rechner: 127.0.0.1
RVS_HTTP_PORT=3000
```
Steht der Proxy auf einem anderen Rechner, den Port per Firewall **nur fuer den
Proxy** freigeben — dahinter ist alles Klartext. Umstellen von Caddy:
`docker compose rm -sf caddy && docker compose up -d`.
nginx-Beispiel (WebSocket braucht HTTP/1.1 + Upgrade-Header und lange Timeouts):
```nginx
server {
listen 443 ssl;
listen [::]:443 ssl; # Handys nehmen bevorzugt IPv6 — mit AAAA-Eintrag Pflicht
server_name rvs.example.de;
ssl_certificate /etc/letsencrypt/live/rvs.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/rvs.example.de/privkey.pem;
location / {
proxy_pass http://192.168.1.10:3000; # RVS_HTTP_BIND-IP : RVS_HTTP_PORT
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 3600s; # WebSocket bleibt lange offen
proxy_send_timeout 3600s;
proxy_buffering off;
client_max_body_size 0; # APK-Download, Uploads
}
}
```
Apps, Satelliten, KI-Boxen, Host-Agenten und die Bridge (`RVS_HOST`/`RVS_PORT`
in deren `.env`) dann auf den Namen und Port des Proxys umstellen.
---
+19 -4
View File
@@ -3,12 +3,27 @@
# Kopieren nach .env und Werte eintragen.
# ════════════════════════════════════════════════════════
# ── Wer macht TLS? ──────────────────────────────────────
# caddy = Caddy hier im Stack holt das Zertifikat selbst (Let's Encrypt)
# (leer) = OHNE Caddy: ein vorhandener Reverse-Proxy (nginx, Traefik ...)
# macht TLS und zeigt auf den RVS-Port unten
COMPOSE_PROFILES=caddy
# ── Modus caddy ─────────────────────────────────────────
# Oeffentlich erreichbarer DNS-Name dieses Servers. Caddy holt darauf ein
# Let's Encrypt-Zertifikat (HTTP-01 Challenge ueber Port 80) und routet
# WebSocket + HTTP weiter an den RVS-Container.
#
# WICHTIG:
# - Die Domain muss per DNS-A-Record/AAAA auf diese Maschine zeigen
# - Port 80 + 443 muessen vom Internet aus erreichbar sein
# - Kein anderer Reverse-Proxy davor (sonst Cert-Konflikt)
# - Port 80 muss von aussen HIERHER gehen (sonst laeuft das Zertifikat
# nach 90 Tagen still ab — Fritzbox: Freigabe auf 80 pruefen!)
PUBLIC_URL=rvs.example.de
# Port, auf dem Caddy HTTPS anbietet (Apps/Satelliten: dieser Port)
CADDY_HTTPS_PORT=444
# ── Modus ohne Caddy ────────────────────────────────────
# Unverschluesselter RVS-Port, auf den der Reverse-Proxy zeigt.
# 127.0.0.1 = nur von diesem Rechner. Steht der Proxy woanders:
# 0.0.0.0 bzw. die interne IP — und den Port per Firewall NUR fuer
# den Proxy freigeben (Klartext!).
RVS_HTTP_BIND=127.0.0.1
RVS_HTTP_PORT=3000
+20 -15
View File
@@ -1,27 +1,31 @@
# ════════════════════════════════════════════════════════
# ARIA RVS Stack — WebSocket Relay + OAuth Callback HTTP
# Caddy davor terminiert TLS via Let's Encrypt (HTTP-01
# Challenge ueber Port 80). OAuth-Provider wie Spotify
# verlangen HTTPS fuer non-localhost Redirect-URIs.
# Apps/Satelliten/Boxen brauchen TLS (wss://), OAuth-Provider
# wie Spotify HTTPS. Wer TLS macht, waehlt die .env:
#
# A) COMPOSE_PROFILES=caddy — Caddy hier im Stack holt das
# Zertifikat selbst (Let's Encrypt, HTTP-01 ueber Port 80).
# Voraussetzung: Port 80 + CADDY_HTTPS_PORT von aussen auf
# diese Maschine, PUBLIC_URL zeigt per DNS hierher.
#
# B) COMPOSE_PROFILES= — OHNE Caddy. Ein vorhandener
# Reverse-Proxy (nginx, Traefik, ...) macht TLS und zeigt auf
# den unverschluesselten RVS-Port (RVS_HTTP_BIND:RVS_HTTP_PORT).
# nginx-Beispiel: README → RVS → "Ohne Caddy".
# ════════════════════════════════════════════════════════
#
# Voraussetzungen:
# - Port 80 + 443 frei (kein anderer Reverse-Proxy davor)
# - Domain (PUBLIC_URL) zeigt per DNS auf diese Maschine
# - .env mit PUBLIC_URL gesetzt
#
# Start: docker compose up -d
# Wenn Du einen eigenen TLS-Terminator nutzt (z.B. nginx,
# externer Caddy): caddy-service auskommentieren und
# rvs-Container den ports-Block geben (3000 → public Port).
services:
rvs:
build: .
restart: always
# KEIN ports-Block — Caddy ist davor, RVS nur intern
# via aria-rvs-net erreichbar. Wenn Du Caddy nicht nutzt,
# diesen ports-Block reaktivieren: ports: ["${RVS_PORT:-443}:3000"]
# Unverschluesselter RVS-Port fuer einen externen Reverse-Proxy (Modus B).
# Default nur 127.0.0.1 — steht der Proxy auf einem ANDEREN Rechner,
# RVS_HTTP_BIND=0.0.0.0 (oder die interne IP) setzen und den Port per
# Firewall nur fuer den Proxy freigeben: hier laeuft alles im Klartext.
ports:
- "${RVS_HTTP_BIND:-127.0.0.1}:${RVS_HTTP_PORT:-3000}:3000"
volumes:
- ./updates:/updates # APK-Dateien fuer Auto-Update
environment:
@@ -39,10 +43,11 @@ services:
# damit Restart nicht jedes Mal ein neues Cert holt (Rate-Limit!).
caddy:
image: caddy:latest
profiles: ["caddy"] # nur mit COMPOSE_PROFILES=caddy
restart: always
ports:
- "80:80"
- "444:443"
- "${CADDY_HTTPS_PORT:-444}:443"
command: caddy reverse-proxy --from ${PUBLIC_URL} --to rvs:3000
volumes:
- ./data/caddy/data:/data # Zertifikate (PERSISTENT)