README_DE.md
August 11, 2026 · View on GitHub
đ Andere Sprachen: äžæ · English · æ„æŹèȘ · íê”ìŽ Â· Français · Đ ŃŃŃĐșĐžĐč · Español
Eine WeChat-Ă€hnliche Ende-zu-Ende-verschlĂŒsselte Instant-Messaging-App mit zustandslosem ECDH + XSalsa20-Poly1305 Pro-Nachricht-VerschlĂŒsselung, Echtzeit-Videoanrufen, Cloudflare R2 Dateispeicher, Mehrsprachigkeit und iOS PWA-Bereitstellung.
đž Screenshots (zum Erweitern klicken)
Funktionen
| Funktion | Beschreibung |
|---|---|
| đ Ende-zu-Ende-VerschlĂŒsselung | Zustandsloses ECDH + XSalsa20-Poly1305 â EinmalschlĂŒssel pro Nachricht, Forward Secrecy, Signal-Ă€hnliche Sicherheitsnummernverifizierung |
| đïž Zero-Knowledge-Server | Server speichert nur Chiffretext; private SchlĂŒssel verlassen niemals das GerĂ€t |
| đč Video- & Audioanrufe | LiveKit-SFU fĂŒr 1:1-Anrufe und Konferenzen (bis zu 100 Teilnehmer), Alle stummschalten und Vortragsmodus |
| đïž Stimmverzerrer | Echtzeit-Stimmeffekte fĂŒr Sprachnachrichten, 1:1-Anrufe und Gruppenanrufe â 3 Modi (0.8x tief / 1.0x normal / 1.2x hoch), basierend auf Web Audio API |
| đ± Sitzungspersistenz | 30-minĂŒtige Access Tokens mit automatisch verlĂ€ngerten 90-Tage-GerĂ€te-Refresh-Sitzungen; Netzwerk-, IP-, VPN- und Proxywechsel werden ohne Passworteingabe wiederhergestellt |
| đš ZuverlĂ€ssige Nachrichtensynchronisierung | Bidirektionaler Heartbeat, Erkennung halboffener Verbindungen, persistenter Postausgang, idempotente Nachrichten-IDs und Cursor-Nachsynchronisierung ĂŒber Serversequenzen |
| đŽ Offline-Zugriff | Kontogetrennter Cache fĂŒr Kontakte, Gruppen, bis zu 2.000 Nachrichten je Unterhaltung, Momente, Timeline und Medien; Offline-Sendungen werden automatisch wiederholt |
| đ Unicode-Freundessuche | IME-Kompositionsschutz, NFC-Normalisierung und UTF-8-Abfragekodierung ermöglichen die zuverlĂ€ssige Suche chinesischer Benutzernamen und Spitznamen |
| đ„ Gruppenchat | Bis zu 2000 Mitglieder, umschaltbare Modi âVerschlĂŒsselt" / âUnverschlĂŒsselt" (nur Besitzer, Umschalten löscht den Chatverlauf). VerschlĂŒsselter Modus verwendet das Signal-Sender-Key-Protokoll (XSalsa20-Poly1305 symmetrische VerschlĂŒsselung + ECDH-SchlĂŒsselverteilung) â nur Gruppenmitglieder können Nachrichten entschlĂŒsseln; Bots sind im verschlĂŒsselten Modus deaktiviert. Nicht-stören-Modus, Mitgliederverwaltung |
| đ« Freundesystem | Freundschaftsanfragen erfordern Genehmigung mit bis zu 512 Zeichen Nachricht; Spitznamen; Multi-Tag-Gruppierung |
| â±ïž Automatisches Löschen | 5 Stufen (nie / 1 Tag / 3 Tage / 1 Woche / 1 Monat), von beiden Seiten in DMs einstellbar, nur Besitzer in Gruppen |
| đ Push-Benachrichtigungen | Web Push (VAPID) + FCM + OneSignal + ntfy + APNS FĂŒnf-Kanal â Benachrichtigungen auch offline (iOS nativ + chinesische Android-GerĂ€te ohne Google-Dienste) |
| đ Mehrsprachig | Chinesisch, Englisch, Japanisch, Koreanisch, Französisch, Deutsch, Russisch, Spanisch â Autoerkennung + manueller Wechsel |
| đ± iOS â Ohne Unternehmenszertifikat | PWA ĂŒber Safari âZum Home-Bildschirm hinzufĂŒgen", funktioniert dauerhaft ohne Apple-Signierung |
| đ± Android Native App | VerfĂŒgbar bei Google Play, mit FCM-Push-UnterstĂŒtzung |
| đ± iOS Native App | VerfĂŒgbar im App Store, mit APNS-Push-UnterstĂŒtzung |
| đ„ïž Windows Desktop-Client | Native Windows-Desktopanwendung, hier herunterladen |
| đ Mac Desktop-Client | Native Mac-Desktopanwendung, hier herunterladen |
| đŹ Rich-Messaging | Text, Bilder, Video, Dokumentdateien, Sprachnachrichten, 200+ Emojis, Telegram-Stickerpakete, LesebestĂ€tigungen, Tippanzeigen |
| đ€ Datei-Upload | Bis zu 500 MB pro Datei, Cloudflare R2 oder lokaler Speicher, mit Fortschrittsanimation |
| đ Momente | WeChat-Ă€hnlicher sozialer Feed: Text + bis zu 9 Fotos oder 1 Video (†10 Min.), Likes, Kommentare, Tag-basierte Sichtbarkeit |
| đ€ Benutzerprofil | Kontaktprofilseite mit bidirektionalen Momente-Datenschutzkontrollen |
| đ° Timeline | Xiaohongshu-Ă€hnlicher öffentlicher Feed â zweispaltiges Masonry-Layout, anonyme BeitrĂ€ge, Likes & Kommentare |
| đ·ïž Freund-Tags | Mehrere Tags pro Freund vergeben (12-Farben-Palette), Kontakte nach Tag filtern |
| đïž R2 Objektspeicher | Cloudflare R2 fĂŒr Bild-/Sprachdateien â optionale öffentliche CDN-URL |
| đ Zwei-Faktor-Authentifizierung (2FA) | Google Authenticatorâkompatibles TOTP, 8 Wiederherstellungscodes, erzwungen bei Anmeldung |
| đ· QR-Code scannen & teilen | QR-Codes scannen zum HinzufĂŒgen von Freunden oder Beitreten von Gruppen mit konfigurierbarem Ablaufdatum |
| đïž Selbst-Hosting | Docker Compose, Zeabur One-Click oder Frontend auf Vercel |
| đ Proxy-Einstellungen | SOCKS5 / HTTP / HTTPS Proxy-UnterstĂŒtzung â konfigurierbar auf Login- und Einstellungsseiten mit Serveradresse, Port, Benutzername und Passwort fĂŒr eingeschrĂ€nkte Netzwerkumgebungen |
| đĄïž Inhaltsmoderation | Benutzermeldungen (6 Kategorien) + Benutzer blockieren (sofortige Ausblendung von BeitrĂ€gen/Nachrichten) + Nutzungsbedingungen (EULA) |
| đ§ Admin-Panel | Eingebettetes Web-Admin-Dashboard (/admin, Pfad konfigurierbar), passwortgeschĂŒtzt, Meldungen prĂŒfen, Inhalte löschen, Benutzer sperren â 8 Sprachen |
Neu in v2.3.9
- Alte einseitige FreundschaftseintrĂ€ge fĂŒhrten zur Meldung âBereits befreundetâ, obwohl der Kontakt unsichtbar blieb und kein Chat möglich war. Beim erneuten HinzufĂŒgen werden nun beide Richtungen automatisch repariert und die Kontaktliste sofort aktualisiert.
Neu in v2.3.8
- Die nicht reagierende ZurĂŒck-SchaltflĂ€che nach dem Start der QR-Kamera wurde behoben; beim SchlieĂen wird die Kamera nun sofort gestoppt und freigegeben.
- Doppelte Freundschaftsanfragen an bestehende Freunde beschĂ€digen die Freundschaft nicht mehr; Suchergebnisse zeigen jetzt âBereits befreundetâ an.
- Ausgehende Privatnachrichten werden direkt nach der Ende-zu-Ende-VerschlĂŒsselung als Chiffretext im optimistischen Nachrichtenobjekt gespeichert; beim Warten auf die ServerbestĂ€tigung landet kein Klartext im Offline-Cache.
- Sprachnachrichten stoppen automatisch nach 120 Sekunden; die Ausgabe mit Stimmeffekt hat dasselbe Limit.
- Bei Aufnahmen und Anrufen bleibt der Bildschirm wach; beim Verlassen werden AufnahmegerÀte und Timer zuverlÀssig freigegeben.
- Android schĂŒtzt SchlĂŒssel und Chat-Caches zusĂ€tzlich mit Android Keystore und AES-256-GCM; der Web-Client verwendet weiterhin Browser-Speicher.
Sitzungswiederherstellung und NachrichtenzuverlÀssigkeit
PaperPhonePlus behandelt lokalen Kontostatus, Echtzeitverbindung und Nachrichtensynchronisierung getrennt. Ein offener WebSocket gilt erst nach auth_ok als einsatzbereit. Bidirektionale ping/pong-Heartbeats erkennen halboffene Verbindungen nach VPN-/IP-Wechseln, WLAN-/MobilfunkĂŒbergĂ€ngen oder App-Unterbrechungen.
- Access Tokens gelten 30 Minuten. GerÀte-Refresh-Tokens gelten 90 Tage und werden bei aktiver Nutzung verlÀngert, sodass die Erneuerung ohne Passworteingabe erfolgt.
- Bereits mit einer Ă€lteren Version angemeldete GerĂ€te werden automatisch aktualisiert, solange ihr vorhandenes Token gĂŒltig ist. Ist es bereits abgelaufen, ist eine einmalige erneute Anmeldung erforderlich.
- Jede ausgehende Nachricht besitzt eine stabile
client_msg_id. Nachrichten ohne Server-ACK bleiben im persistenten lokalen Postausgang und werden mit derselben ID erneut gesendet; eine Eindeutigkeitsbedingung verhindert doppelte EintrÀge. - Jede gespeicherte Nachricht besitzt eine monoton steigende
server_seq. Nach Anmeldung, Wiederverbindung und RĂŒckkehr in den Vordergrund synchronisiert der Client per Cursor fehlende Nachrichten nach. - Explizite Abmeldung und GerĂ€tewiderruf machen die dauerhafte Serversitzung ungĂŒltig. Gewöhnliche Transportfehler und IP-Wechsel erhalten sie.
Important
Bei einem Upgrade zuerst den Server und danach die Clients bereitstellen. Der Server fĂŒhrt die ZuverlĂ€ssigkeitsmigration automatisch aus und verweigert den Start, wenn kritische Spalten fehlen. Vor Produktions-Upgrades MySQL sichern.
Technologie-Stack
Backend (server/)
Rust (Axum 0.8) â Hochleistungs-Async-Web-Framework
sqlx + MySQL 8.0 â Benutzer-/Nachrichtenpersistenz
deadpool-redis + Redis 7 â Online-PrĂ€senz + knotenĂŒbergreifendes Routing
aws-sdk-s3 â Cloudflare R2 Dateispeicher (S3-kompatible API)
argon2 + jsonwebtoken Authentifizierung
Frontend (client/)
React 19 + TypeScript + Vite 6
Zustand Zustandsverwaltung
libsodium-wrappers-sumo (WebAssembly â Curve25519 / XSalsa20-Poly1305)
WebRTC API â Video-/Sprachanrufe
Web Audio API â Echtzeit-Stimmverzerrer (ScriptProcessorNode Audio-Kette)
PWA: manifest.json + Service Worker
Kryptographische Schicht
Zustandsloses ECDH + XSalsa20-Poly1305 â Einmal-SchlĂŒsselpaar pro Nachricht
Vierstufige SchlĂŒsselpersistenz: Speicher â localStorage â sessionStorage â IndexedDB
Alle privaten SchlĂŒssel nur auf dem GerĂ€t gespeichert â niemals an den Server gesendet
đ Detaillierte Bereitstellungsanleitung (äžæ) | Deployment Guide (English) â VollstĂ€ndige Schritt-fĂŒr-Schritt-Anleitung fĂŒr Zeabur + Vercel Hybrid-Bereitstellung, Docker Compose + Nginx lokale Bereitstellung und Client-Server-Adresskonfiguration.
Option 0: Zeabur One-Click Cloud-Bereitstellung
Zeabur-NetzwerkeinschrĂ€nkung: Die Vorlage stellt LiveKit ĂŒber WebSocket/API 7880 und ICE/TCP 7881 bereit. Zeabur unterstĂŒtzt derzeit keine öffentlichen UDP-Dienstports; 1:1-Anrufe und Konferenzen verwenden daher TCP-Fallback. FĂŒr produktive Anrufe empfiehlt sich LiveKit Cloud oder eine VM mit UDP-UnterstĂŒtzung.
Serverseitige Nginx-Konfiguration
Verwenden Sie die Zwei-Domain-Produktionskonfiguration deploy/nginx/paperphone-plus.conf. Ersetzen Sie api.example.com und meeting.example.com, beziehen Sie TLS-Zertifikate, kopieren Sie die Datei nach /etc/nginx/sites-available/paperphone-plus, aktivieren Sie sie und fĂŒhren Sie sudo nginx -t && sudo systemctl reload nginx aus. Setzen Sie im Backend LIVEKIT_URL=wss://meeting.example.com. Nginx proxyt nur API und WebSocket; TCP 7881 und UDP 7882 mĂŒssen direkt in Host- und Cloud-Firewall geöffnet werden.
Tip
Erweitert: Zeabur + Vercel Hybrid-Bereitstellung Nach der Bereitstellung auf Zeabur können Sie den client-Dienst manuell löschen und das Frontend stattdessen auf Vercel bereitstellen (siehe Option 2 unten). So werden Server/MySQL/Redis auf Zeabur gehostet, wĂ€hrend das Frontend durch Vercels globales CDN beschleunigt wird. Das Frontend benötigt keine Umgebungsvariablen auf Vercel â Benutzer geben einfach die Backend-Serveradresse auf der Anmeldeseite ein.
Option 1: Docker Compose (Empfohlen)
git clone <repo-url> && cd paperphone-plus
cp server/.env.example server/.env
# Bearbeiten: DB_PASS / JWT_SECRET / LIVEKIT_URL usw.
docker compose up -d
open http://localhost
Option 2: Frontend auf Vercel
# 1. Dieses Repository forken
# 2. In Vercel importieren: Root Directory = client/, Build = npm run build, Output = dist/
# Keine Umgebungsvariablen erforderlich
# 3. Backend ĂŒber Docker oder Zeabur bereitstellen
# 4. Vercel-Frontend öffnen, Backend-Serveradresse auf der Anmeldeseite eingeben
# z.B. https://your-server.zeabur.app
Option 3: Lokale Entwicklung
# Backend (Rust)
cd server && cp .env.example .env && cargo run --release
# Frontend (React)
cd client && npm install && npm run dev
Stimmverzerrer
Sprachnachrichten, 1:1-Anrufe und Gruppenanrufe unterstĂŒtzen Echtzeit-Stimmverzerrung mit 3 wĂ€hlbaren Modi:
| Modus | Geschwindigkeit | Effekt |
|---|---|---|
| đą Langsam | 0.8x | Tiefere, dunklere Stimme â ideal fĂŒr AnonymitĂ€t |
| đ Normal | 1.0x | Originalstimme, keine Verarbeitung |
| đ Schnell | 1.2x | Höhere Stimme â lustig und verspielt |
Funktionsweise: Verwendet die Web Audio API zum Aufbau einer Audio-Verarbeitungskette (AudioContext â MediaStreamSource â ScriptProcessorNode â MediaStreamDestination), die Tonhöhe/Geschwindigkeit des Mikrofoneingangs in Echtzeit anpasst.
- Sprachnachrichten: Stimmmodus wÀhrend der Aufnahme wÀhlen. Die exportierte
.webm-Datei enthĂ€lt bereits den Stimmeffekt â EmpfĂ€nger können die Originalstimme nicht wiederherstellen, was echtes anonymes Messaging ermöglicht - 1:1 / Gruppenanrufe: Tippen Sie wĂ€hrend eines Anrufs auf die Stimmverzerrer-Taste, um durch die Modi zu wechseln. Die verarbeitete Audiospur ersetzt das Original ĂŒber
LiveKit LocalAudioTrack.replaceTrack()
Keine serverseitige Konfiguration erforderlich. Der Stimmverzerrer lÀuft vollstÀndig clientseitig.
Umgebungsvariablen
| Variable | Beschreibung | Standard |
|---|---|---|
PORT | Server-Port | 3000 |
JWT_SECRET | JWT-SignierungsschlĂŒssel (in Produktion Ă€ndern) | dev_secret |
DB_HOST / DB_PASS / DB_NAME | MySQL-Verbindung | â |
REDIS_HOST / REDIS_PASS | Redis-Verbindung | â |
R2_ACCOUNT_ID | Cloudflare Account-ID | â |
R2_ACCESS_KEY_ID | R2 API Token Access Key | â |
R2_SECRET_ACCESS_KEY | R2 API Token Secret Key | â |
R2_BUCKET | R2 Bucket-Name | â |
R2_PUBLIC_URL | Ăffentliche R2-Basis-URL (optional) | â |
LIVEKIT_URL | Ăffentliche LiveKit-WebSocket-Adresse fĂŒr alle Anrufe | â |
LIVEKIT_API_KEY | Gemeinsamer API-SchlĂŒssel fĂŒr Server und LiveKit | â |
LIVEKIT_API_SECRET | Gemeinsames API-Secret fĂŒr Server und LiveKit | â |
VAPID_PUBLIC_KEY | Web Push VAPID Public Key (optional) | â |
VAPID_PRIVATE_KEY | Web Push VAPID Private Key (optional) | â |
VAPID_SUBJECT | VAPID Kontakt-E-Mail (optional) | mailto:admin@paperphoneplus.app |
FCM_PROJECT_ID | Firebase Projekt-ID (optional, Capacitor Android) | â |
FCM_CLIENT_EMAIL | Firebase-Dienstkonto-E-Mail (optional) | â |
FCM_PRIVATE_KEY | Firebase-Dienstkonto Private Key (optional, unterstĂŒtzt sowohl \n-Escape als auch echte ZeilenumbrĂŒche; siehe unten) | â |
FCM_RELAY_SECRET | FCM Push-Relay-Geheimnis (optional, auf Relay-Host setzen) | â |
FCM_RELAY_URL | FCM Push-Relay-URL (optional, selbstgehostete Server zeigen auf Relay-Host) | â |
FCM_RELAY_KEY | FCM Push-Relay-Auth-SchlĂŒssel (optional, muss mit FCM_RELAY_SECRET des Relay-Hosts ĂŒbereinstimmen) | â |
ONESIGNAL_APP_ID | OneSignal App ID (optional) | â |
ONESIGNAL_REST_KEY | OneSignal REST API Key (optional) | â |
ONESIGNAL_RELAY_SECRET | OneSignal Push-Relay-Geheimnis (optional, auf Relay-Host setzen) | â |
ONESIGNAL_RELAY_URL | OneSignal Push-Relay-URL (optional, selbstgehostete Server zeigen auf Relay-Host) | â |
ONESIGNAL_RELAY_KEY | OneSignal Push-Relay-Auth-SchlĂŒssel (optional, muss mit ONESIGNAL_RELAY_SECRET des Relay-Hosts ĂŒbereinstimmen) | â |
NTFY_BASE_URL | ntfy Server-URL (optional, nutzt standardmĂ€Ăig öffentlichen ntfy.sh-Dienst) | https://ntfy.sh |
NTFY_TOKEN | ntfy Auth-Token (optional, fĂŒr selbstgehostete Server) | â |
APNS_TEAM_ID | Apple Developer Team ID (optional, iOS native Push) | â |
APNS_KEY_ID | APNS Auth Key ID (optional) | â |
APNS_PRIVATE_KEY | APNS .p8 Private Key Inhalt (optional, unterstĂŒtzt \n-Escape) | â |
APNS_BUNDLE_ID | iOS App Bundle Identifier (optional) | â |
APNS_SANDBOX | APNS Sandbox-Modus (optional, true fĂŒr Entwicklung/TestFlight) | false |
APNS_RELAY_SECRET | Push-Relay-Geheimnis (optional, auf Relay-Host setzen) | â |
APNS_RELAY_URL | Push-Relay-URL (optional, selbstgehostete Server zeigen auf Relay-Host) | â |
APNS_RELAY_KEY | Push-Relay-Auth-SchlĂŒssel (optional, muss mit APNS_RELAY_SECRET des Relay-Hosts ĂŒbereinstimmen) | â |
TELEGRAM_BOT_TOKEN | Telegram Bot Token (optional) | â |
STICKER_PACKS | Benutzerdefinierte Stickerpakete (optional, Name:Label) | 12 integrierte Standards |
ADMIN_PATH | Admin-Panel URL-Pfad | /admin |
ADMIN_PASSWORD | Admin-Panel Passwort (in Produktion Àndern) | admin123 |
FCM Private Key Zeilenumbruch-Behandlung
Das private_key-Feld in der Firebase-Dienstkonto-JSON-Datei enthĂ€lt einen RSA-PrivatschlĂŒssel im PEM-Format, der echte ZeilenumbrĂŒche (\n, ASCII 0x0A) zwischen jeder 64-Zeichen-Zeile erfordert. Viele Bereitstellungsplattformen (Zeabur, Vercel, Railway, Docker) speichern Umgebungsvariablen jedoch als einzeilige Strings und konvertieren \n in die wörtliche Zwei-Zeichen-Sequenz \ + n.
Dies ist die hĂ€ufigste Ursache fĂŒr FCM-Push-Benachrichtigungsfehler â der PEM-Parser schlĂ€gt stillschweigend fehl und es werden keine Push-Benachrichtigungen gesendet, ohne Fehlerprotokolle.
Der Server behandelt dies automatisch: fcm.rs normalisiert wörtliche \n-Sequenzen zurĂŒck zu echten ZeilenumbrĂŒchen vor dem Parsing. Beide Formate funktionieren:
-
Einzeilig (empfohlen fĂŒr Cloud-Plattformen): Den rohen
private_key-Wert aus der JSON-Datei mit\n-Escapes einfĂŒgen:FCM_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nMIIEvQ...\n-----END PRIVATE KEY-----\n -
Mehrzeilig (fĂŒr .env-Dateien): Den vollstĂ€ndigen PEM-Inhalt in AnfĂŒhrungszeichen mit echten ZeilenumbrĂŒchen einschlieĂen:
FCM_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- MIIEvQ... -----END PRIVATE KEY-----"
| Plattform | Empfohlenes Format | Hinweise |
|---|---|---|
| Zeabur | Einzeilig (\n escaped) | JSON-Wert direkt im Variables-Panel einfĂŒgen |
| Docker / docker-compose | Beides | YAML | fĂŒr mehrzeilig; einzeilig in .env |
| Vercel / Railway | Einzeilig (\n escaped) | Eingabefelder unterstĂŒtzen typischerweise keine echten ZeilenumbrĂŒche |
| Linux .env-Datei | Mehrzeilig (in AnfĂŒhrungszeichen) | Sicherstellen, dass AnfĂŒhrungszeichen korrekt geschlossen sind |
Fehlerbehebung: Wenn FCM-Variablen gesetzt sind, aber Android-Push nicht funktioniert, Serverprotokolle prĂŒfen:
[FCM] No access token availableâ Private Key Format-Fehler (Zeilenumbruch-Problem)[FCM] â Push sent to user xxxâ FCM-Versand funktioniert, Problem ist clientseitig- Keine FCM-Protokolle â
FCM_PROJECT_IDnicht gesetzt oder kein Token in derfcm_tokens-Tabelle
ntfy Push (Chinesische Android-GerÀte ohne Google-Dienste)
FĂŒr Android-GerĂ€te ohne Google Mobile Services (Huawei, Xiaomi, OPPO, vivo usw.) unterstĂŒtzt PaperPhonePlus Push-Benachrichtigungen ĂŒber ntfy.
Standard-Setup (Null-Konfiguration): Nutzt den öffentlichen ntfy.sh-Dienst. Keine zusÀtzliche Konfiguration erforderlich.
Optionale Konfiguration (fĂŒr selbstgehostete ntfy-Server):
NTFY_BASE_URL=https://your-ntfy-server.com
NTFY_TOKEN=your_optional_auth_token
Benutzer-Setup:
- ntfy App installieren (Google Play / F-Droid / Direktdownload)
- PaperPhonePlus-Einstellungen öffnen und die ântfy Push"-Karte finden
- Den angezeigten Topic-Namen kopieren und in der ntfy App abonnieren
- Auf âPush registrieren" tippen, um die Registrierung abzuschlieĂen
Sicherheitshinweis: ntfy-Benachrichtigungen enthalten Benachrichtigungstitel und Zusammenfassungen im Klartext (nicht den eigentlichen Nachrichteninhalt). FĂŒr höhere Sicherheit einen selbstgehosteten ntfy-Server verwenden.
APNS Push (Native iOS App)
APNS (Apple Push Notification Service) sendet Push-Benachrichtigungen an native iOS-Apps, die mit Capacitor erstellt wurden. Es gibt zwei Konfigurationsmöglichkeiten:
Option A: Direkte Konfiguration (Server des App-Entwicklers)
- Bei Apple Developer anmelden â Certificates, Identifiers & Profiles â Keys
- + klicken, um einen neuen Key zu erstellen â Apple Push Notifications service (APNs) aktivieren â Register
.p8-Datei herunterladen (â ïž kann nur einmal heruntergeladen werden!) und die Key ID notieren- Team ID von der Apple Developer Mitgliedschaftsseite notieren (10-stellig alphanumerisch)
- In
server/.enveinfĂŒgen:
APNS_TEAM_ID=AB12CD34EF
APNS_KEY_ID=LH4Z9YN3P7
APNS_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGTAgEA...(.p8-Dateiinhalt)...\n-----END PRIVATE KEY-----"
APNS_BUNDLE_ID=com.yourcompany.paperphoneplus
APNS_SANDBOX=false
APNS_SANDBOX: AuftruefĂŒr Entwicklung/TestFlight-Builds,falsefĂŒr App Store-Produktion setzen.
Option B: Ăber Push Relay (Selbstgehostete Server)
Wenn Sie die iOS-App eines anderen verwenden (z.B. aus dem App Store heruntergeladen), haben Sie keine Apple-Zugangsdaten des Entwicklers und können keine APNS-Pushes direkt senden. Verwenden Sie stattdessen den Push Relay.
Funktionsweise:
ââââââââââââââââââââââââ âââââââââââââââââââââââââââ âââââââââââ
â Selbstgehosteter â HTTP â Server des Entwicklers â APNS â Apple â
â Server âââââââââ (hat .p8 Key + Relay) âââââââââ âââ đ± â
â (keine Apple-Creds) â â â âââââââââââ
â APNS_RELAY_URL=... â â APNS_TEAM_ID=... â
â APNS_RELAY_KEY=... â â APNS_RELAY_SECRET=... â
ââââââââââââââââââââââââ âââââââââââââââââââââââââââ
Schritt 1: App-Entwickler aktiviert den Relay-Endpunkt
Auf dem Server des App-Entwicklers (der bereits APNS-Zugangsdaten hat) ein Relay-Geheimnis setzen:
# Server des App-Entwicklers .env (hat bereits APNS_TEAM_ID usw.)
APNS_RELAY_SECRET=ein_langer_zufĂ€lliger_gemeinsamer_SchlĂŒssel
Dies aktiviert automatisch den Push-Relay-Endpunkt unter POST /api/push-relay/apns.
Schritt 2: Selbstgehosteter Benutzer konfiguriert den Relay
Selbstgehostete Server benötigen nur zwei Variablen â keine Apple-Zugangsdaten erforderlich:
# Selbstgehosteter Server .env
APNS_RELAY_URL=https://app-developer-server.com
APNS_RELAY_KEY=gemeinsamer_SchlĂŒssel_aus_Schritt_1
Ablauf:
- Selbstgehosteter Server empfĂ€ngt eine Offline-Nachricht â fragt lokale
apns_tokens-Tabelle nach iOS-GerÀte-Tokens des Benutzers ab - Sendet GerÀte-Tokens + Push-Titel/Inhalt per HTTP POST an den Relay
- Relay validiert den SchlĂŒssel und sendet dann mit eigenen APNS-Zugangsdaten an Apple
- Relay gibt eine Liste abgelaufener Tokens zurĂŒck; der selbstgehostete Server bereinigt automatisch seine lokale Datenbank
PrioritĂ€t: Lokale APNS-Zugangsdaten â Push Relay â Ăberspringen (still). Wenn beide konfiguriert sind, hat die lokale Direktverbindung Vorrang.
Sicherheitshinweis: Der Relay ĂŒbertrĂ€gt nur Push-Benachrichtigungstitel und Zusammenfassungen (z.B. âJemand hat Ihnen eine Nachricht gesendet"), nicht den eigentlichen Nachrichteninhalt. GerĂ€te-Tokens können nicht zum Lesen von Benutzerdaten verwendet werden.
Push Relay (Alle KanÀle)
FĂŒr selbstgehostete Server-Betreiber, die die veröffentlichte App eines anderen verwenden (z.B. aus dem App Store/Google Play), haben Sie keine Push-Zugangsdaten des Entwicklers (Apple .p8 Key / Firebase-Dienstkonto / OneSignal API Key).
Das Push-Relay-System bietet Relay-FĂ€higkeit fĂŒr APNS, FCM und OneSignal KanĂ€le:
App-Entwickler aktiviert Relay-Endpunkte auf seinem Server:
# Server des App-Entwicklers .env
APNS_RELAY_SECRET=ein_langer_zufÀlliger_String
FCM_RELAY_SECRET=ein_langer_zufÀlliger_String
ONESIGNAL_RELAY_SECRET=ein_langer_zufÀlliger_String
Selbstgehostete Benutzer benötigen nur Relay-URL und SchlĂŒssel â keine Push-Service-Zugangsdaten erforderlich:
# Selbstgehosteter Server .env
# APNS (iOS native Push)
APNS_RELAY_URL=https://app-developer-server.com
APNS_RELAY_KEY=gemeinsamer_SchlĂŒssel
# FCM (Android native Push)
FCM_RELAY_URL=https://app-developer-server.com
FCM_RELAY_KEY=gemeinsamer_SchlĂŒssel
# OneSignal (Median.co-verpackte Apps)
ONESIGNAL_RELAY_URL=https://app-developer-server.com
ONESIGNAL_RELAY_KEY=gemeinsamer_SchlĂŒssel
PrioritĂ€t: Lokale Zugangsdaten â Push Relay â Ăberspringen (still). Wenn beide konfiguriert sind, hat die lokale Direktverbindung Vorrang.
Offizieller Push Relay
Selbstgehostete Server-Betreiber können den offiziellen Push Relay verwenden, um iOS/Android Push-Benachrichtigungen ohne Konfiguration von Push-Zugangsdaten zu aktivieren:
# 2026-05-18
APNS_RELAY_URL=https://619.chat
APNS_RELAY_KEY=EzmpqftbsENaRUO6BTABxLV96q7RuEDyokXJr1DWdDjL54cLg7yXVUQqydCQvxrX
FCM_RELAY_URL=https://619.chat
FCM_RELAY_KEY=EzmpqftbsENaRUO6BTABxLV96q7RuEDyokXJr1DWdDjL54cLg7yXVUQqydCQvxrX
ONESIGNAL_RELAY_URL=https://619.chat
ONESIGNAL_RELAY_KEY=EzmpqftbsENaRUO6BTABxLV96q7RuEDyokXJr1DWdDjL54cLg7yXVUQqydCQvxrX
Diese Zeilen zur .env-Datei Ihres selbstgehosteten Servers hinzufĂŒgen.
Lizenz
Dieses Projekt ist unter der GNU Affero General Public License v3.0 (AGPL-3.0) lizenziert.