Files
sepot/deploy/relay
Julius Joska 4f2cbdbdc4 harden(relay): gate forwarded-IP on trusted proxies, bound queue flush
Rate limiting and the per-IP WebSocket cap trusted X-Forwarded-For and
X-Real-Ip unconditionally. Onion traffic bypasses the reverse proxy, so a
client could set the header itself and slip past every limit. Forwarded
headers are now honoured only from peers inside SEPOT_TRUSTED_PROXIES;
everyone else is keyed by peer address, and onion clients share one bucket.

The queue flush also read the whole backlog into memory at once, and the
certificate authority kept the trust-root private key in the database even
though it is only ever needed offline.
2026-08-13 12:23:07 +02:00
..

sepot-relay — self-hosting

Relay je „hloupý" doručovací server: přijímá a doručuje opaque sealed-sender obálky, drží offline frontu (TTL) a šifrované bloby příloh. Nevidí obsah ani odesílatele, neváže identitu na telefon/e-mail a neloguje IP.

Stack: sepot-relay (Rust/axum) + PostgreSQL + volitelný Tor onion.

Rychlý start

cd deploy/relay
cp .env.example .env
# vyplň POSTGRES_PASSWORD, např.:  openssl rand -base64 24
docker compose build
docker compose up -d

TLS/WSS neterminuje relay sám — postav před něj reverzní proxy (Caddy, Traefik, nginx…) s platným certifikátem, která forwarduje na sepot-relay:8470. Uvnitř sítě jede plain WS (proxy dělá TLS termination). Klient se pak připojuje na wss://<tvoje-doména>.

Ověření

curl -s http://127.0.0.1:8470/v1/health        # {"status":"ok"}
curl -s http://127.0.0.1:8470/v1/server-info    # capabilities + trust_root

Tor onion (volitelné)

Compose obsahuje kontejner tor, který relay vystaví jako onion hidden service. Adresu zjistíš po startu:

docker exec sepot-relay-tor cat /var/lib/tor/sepot/hostname

Tuhle .onion adresu pak nastav v klientu (app/lib/core/constants/app_constants.dart, AppConstants.relayOnion) pro svůj vlastní build.

Konfigurace (.env)

Proměnná Popis
POSTGRES_PASSWORD heslo DB — povinné, nikdy necommituj
SEPOT_APNS_* volitelné, jen pro iOS APNs push (Key ID, Team ID, cesta ke klíči)
FCM service account volitelné, jen pro Android FCM „fast mode" (mimo repo)

Push je volitelný. Bez něj appka funguje přes UnifiedPush (degooglované) nebo si zprávy stáhne po otevření.

Persistentní data a zálohy

Zálohuj dvě volumes, obě obsahují kritické tajné klíče (chmod 600):

  • db-data — kromě dat drží relay_keys = trust root CA sealed senderu. Klienti si ho pinují. Jeho ztráta / regenerace = všichni klienti tvrdě odmítnou komunikovat („Trust root se změnil").
  • tor-keys — onion identita (hs_ed25519_secret_key). Ztráta = nová onion adresa pro všechny.
# DB dump:   docker exec sepot-relay-db pg_dump -U sepot sepot_relay | gzip > db.sql.gz
# Tor klíče: docker run --rm -v sepot-relay_tor-keys:/k -v "$PWD":/o alpine tar czf /o/tor-keys.tgz -C /k .

Privacy — Definition of Done

  • Relay neloguje obsah, odesílatele ani IP (vynuceno v kódu, ověřeno testem).
  • Access log reverzní proxy pro relay endpoint drž vypnutý.
  • Rate limity jsou in-memory token buckety — nikdy se nezapisují na disk.
  • DB nemá IP/PII sloupce; offline fronta má TTL, ACK = hard delete.