diff --git a/README.md b/README.md index b2071b9..9b8f8d4 100644 --- a/README.md +++ b/README.md @@ -598,16 +598,27 @@ tar -czf aria-backup-$(date +%Y%m%d).tar.gz aria-data/ ## RVS — Rendezvous-Server -Laeuft im Rechenzentrum. WebSocket Relay + Auto-Update Server. +Laeuft im Rechenzentrum. WebSocket Relay + OAuth-Callback HTTP-Server. 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) docker compose up -d ``` +**Stack:** +- `caddy` (TLS-Terminator + Let's Encrypt, lauscht auf 80+443) +- `rvs` (WebSocket Relay + OAuth-Callback HTTP, nur intern auf Port 3000) + +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. + **Features:** - WebSocket Relay (alle Message-Types: chat, audio, file, config, xtts, update, etc.) +- OAuth-Callback HTTP: `GET /oauth/callback/{service}?code=...` → broadcastet als + `oauth_callback`-WS-Message + zeigt dem Browser eine "OAuth erfolgreich"-Seite - Auto-Update: APK-Verteilung an Apps ueber WebSocket - Heartbeat + tote Verbindungen aufraeumen @@ -620,6 +631,11 @@ 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. + --- ## Gamebox-Stack — F5-TTS + Whisper (GPU-Services) diff --git a/rvs/.env.example b/rvs/.env.example new file mode 100644 index 0000000..a86bc45 --- /dev/null +++ b/rvs/.env.example @@ -0,0 +1,14 @@ +# ════════════════════════════════════════════════════════ +# ARIA RVS — Server-seitige Config +# Kopieren nach .env und Werte eintragen. +# ════════════════════════════════════════════════════════ + +# 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) +PUBLIC_URL=rvs.example.de diff --git a/rvs/.gitignore b/rvs/.gitignore new file mode 100644 index 0000000..f208c52 --- /dev/null +++ b/rvs/.gitignore @@ -0,0 +1,8 @@ +# Docker-Compose Konfiguration mit echtem Domain-Namen +.env + +# Caddy persistent state (Zertifikate, ACME-Account) +data/ + +# APK-Verzeichnis bleibt — wird ueber release.sh befuellt + commited als latest.apk +# (siehe Hauptverzeichnis README) diff --git a/rvs/docker-compose.yml b/rvs/docker-compose.yml index 3001959..1c83e45 100644 --- a/rvs/docker-compose.yml +++ b/rvs/docker-compose.yml @@ -1,10 +1,53 @@ +# ════════════════════════════════════════════════════════ +# 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. +# ════════════════════════════════════════════════════════ +# +# 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: . - ports: - - "${RVS_PORT:-443}:3000" 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"] volumes: - ./updates:/updates # APK-Dateien fuer Auto-Update environment: - MAX_SESSIONS=10 + networks: + - aria-rvs-net + + # TLS-Terminator + Let's Encrypt. Holt automatisch ein Zertifikat + # fuer ${PUBLIC_URL} (HTTP-01 Challenge ueber Port 80). WebSocket- + # Upgrades und HTTP-Routes (OAuth-Callback) werden im reverse-proxy + # Modus automatisch durchgereicht. ACME-Cache liegt in ./data/caddy/ + # damit Restart nicht jedes Mal ein neues Cert holt (Rate-Limit!). + caddy: + image: caddy:latest + restart: always + ports: + - "80:80" + - "443:443" + command: caddy reverse-proxy --from ${PUBLIC_URL} --to rvs:3000 + volumes: + - ./data/caddy/data:/data # Zertifikate (PERSISTENT) + - ./data/caddy/config:/config # Caddy-Config-Cache + depends_on: + - rvs + networks: + - aria-rvs-net + +networks: + aria-rvs-net: