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.
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.