Šepot — end-to-end encrypted messenger

Initial public release. Anonymous on-device identity (no phone number,
e-mail, or password), Signal-protocol cryptography (X3DH + PQXDH, Double
Ratchet, sealed sender) via libsignal, a metadata-minimizing relay,
group chats, disappearing messages, encrypted local storage, optional
Tor transport, and a UI localized into Czech, English, German, Russian,
and Italian.

Monorepo: Flutter client (app/), Rust relay + wire types (rust/),
protobuf definitions (proto/), self-host deploy (deploy/).

Licensed under AGPL-3.0 with an app-store distribution exception (§7).
This commit is contained in:
Julius Joska
2026-07-11 17:06:39 +02:00
commit 8081d98c67
309 changed files with 44102 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
# 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
```bash
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í
```bash
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:
```bash
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.
```bash
# 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.