From 88036bcad3d5299906fd745ab9a3c3ac0f4a8632 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 25 Oct 2026 12:22:11 +0100 Subject: [PATCH] =?UTF-8?q?feat(rvs):=20Caddy=20optional=20per=20COMPOSE?= =?UTF-8?q?=5FPROFILES=20=E2=80=94=20oder=20eigener=20Reverse-Proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- README.md | 69 ++++++++++++++++++++++++++++++++++++------ rvs/.env.example | 23 +++++++++++--- rvs/docker-compose.yml | 35 ++++++++++++--------- 3 files changed, 99 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index dfb465b..8ca51e4 100644 --- a/README.md +++ b/README.md @@ -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. --- diff --git a/rvs/.env.example b/rvs/.env.example index a86bc45..17f31a3 100644 --- a/rvs/.env.example +++ b/rvs/.env.example @@ -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 diff --git a/rvs/docker-compose.yml b/rvs/docker-compose.yml index 7c25ce6..55a4374 100644 --- a/rvs/docker-compose.yml +++ b/rvs/docker-compose.yml @@ -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)