Files
PaperPhone/README_FR.md
2026-04-09 16:44:20 +08:00

7.9 KiB
Raw Permalink Blame History

PaperPhone IM

🌐 Autres langues / Other Languages: 中文 · English · 日本語 · 한국어 · Deutsch · Русский · Español

Une application de messagerie instantanée chiffrée de bout en bout, style WeChat, avec chiffrement ECDH sans état + XSalsa20-Poly1305 par message, appels vidéo en temps réel, stockage Cloudflare R2, support multilingue et déploiement iOS PWA.

Node.js MySQL Redis WebRTC

Deploy on Zeabur


📸 Captures d'écran (cliquez pour développer) ui1 ui2 ui3 ui4 ui5 ui6 ui7 ui8 ui9 ui10 ui11 ui12 ui13 ui14

Fonctionnalités

Fonction Description
🔐 Chiffrement E2E ECDH sans état + XSalsa20-Poly1305 — clés éphémères par message, secret de transmission
🗝️ Serveur à connaissance nulle Le serveur ne stocke que le texte chiffré ; les clés privées ne quittent jamais l'appareil
📹 Appels vidéo/audio WebRTC P2P (1:1) + Mesh (groupe), Cloudflare TURN pour traversée NAT
👥 Chat de groupe Jusqu'à 2000 membres, messages en texte brut, mode Ne pas déranger
⏱️ Suppression auto 5 niveaux (jamais/1j/3j/1sem/1mois)
🔔 Notifications push Web Push (VAPID) + OneSignal double canal
🌐 Multilingue 中/EN/日/한/FR/DE/RU/ES — détection auto + sélection manuelle
📱 iOS PWA Safari « Ajouter à l'écran d'accueil », sans certificat Apple
💬 Messagerie riche Texte, images, vidéo, fichiers (PDF/DOCX/XLSX etc. avec icônes de type), audio, 200+ émojis (8 catégories), packs de stickers Telegram, accusés de réception
🌐 Moments Fil social : texte + 9 photos ou 1 vidéo (≤ 10 min), likes (avatars), commentaires, visibilité par tags
👤 Profil utilisateur Page de profil (avatar / pseudo / fil Moments), avec contrôles de confidentialité bidirectionnels « Masquer ses moments » et « Masquer mes moments »
📰 Chronologie Fil public style Xiaohongshu — grille maçonnerie 2 colonnes, images/vidéos + texte (max 50 médias, 2000 car.), publication anonyme, likes & commentaires
🏷️ Tags d'amis Plusieurs tags par ami (12 couleurs), filtrage des contacts
🗂️ Stockage R2 Cloudflare R2 pour images/audio — CDN optionnel
🔑 Auth à deux facteurs (2FA) TOTP compatible Google Authenticator, 8 codes de récupération, vérification obligatoire à la connexion
📷 Scan QR & partage Scannez un QR code pour ajouter un ami ou rejoindre un groupe ; QR de groupe avec durée configurable (1 sem./1 mois/3 mois)
🏗️ Auto-hébergeable Docker Compose en une commande

Stack technique

Backend (server/)
  Node.js 20 + Express + ws
  MySQL 8.0 — utilisateurs, messages chiffrés
  Redis — présence en ligne + routage inter-nœuds
  Cloudflare R2 — stockage fichiers (API S3)
  JWT + bcrypt

Frontend (client/)
  HTML natif + Vanilla JS (ESM, sans bundler)
  libsodium-wrappers (WebAssembly)
  WebRTC API — appels vidéo/audio
  PWA : manifest.json + Service Worker

Cryptographie
  ECDH sans état + XSalsa20-Poly1305 — clés éphémères par message
  Persistance 4 niveaux : mémoire → localStorage → sessionStorage → IndexedDB
  Clés privées uniquement sur l'appareil

Démarrage rapide

Option 0 : Zeabur en un clic

Deploy on Zeabur

Note

Étape manuelle requise après déploiement :

  1. Console Zeabur → server → Variables → copier ZEABUR_WEB_URL
  2. client → Variables → ajouter SERVER_URL = valeur copiée
  3. Redémarrer le client

Option 1 : Docker Compose (recommandé)

git clone <repo-url> && cd paperphone
cp server/.env.example server/.env
# Éditer les variables
docker compose up -d
open http://localhost

Option 2 : Démarrage local

# Backend
cd server && npm install && npm run dev

# Frontend
npx serve client -p 8080

Appels vidéo — Cloudflare TURN

CF_CALLS_APP_ID=your_app_id_here
CF_CALLS_APP_SECRET=your_app_secret_here

Sans configuration : STUN uniquement, appels LAN fonctionnent.


Notifications push

Canal Plateformes Configuration
Web Push Navigateurs + iOS PWA 16.4+ Clés VAPID
OneSignal Apps Median.co App ID + REST Key
npx web-push generate-vapid-keys

iOS — Sans certificat

  1. Déployer avec HTTPS → 2. Ouvrir dans Safari → 3. Partager ⬆️ → 4. « Ajouter à l'écran d'accueil »

Sécurité

Inscription : IK + SPK + 10×OPK générés localement, clés publiques uploadées
Message : ECDH éphémère → X25519 → XSalsa20-Poly1305
Serveur voit : ✅ texte chiffré + métadonnées  ❌ texte clair / clés privées

Variables d'environnement

Variable Description Défaut
PORT Port serveur 3000
JWT_SECRET Clé JWT (changer en prod) dev_secret
DB_HOST/DB_PASS/DB_NAME MySQL
REDIS_HOST/REDIS_PASS Redis
R2_ACCOUNT_ID Cloudflare ID
R2_ACCESS_KEY_ID Clé d'accès R2
R2_SECRET_ACCESS_KEY Clé secrète R2
R2_BUCKET Nom du bucket
R2_PUBLIC_URL URL publique (optionnel)
CF_CALLS_APP_ID Calls App ID (optionnel)
CF_CALLS_APP_SECRET Calls Secret (optionnel)
VAPID_PUBLIC_KEY Clé publique VAPID (optionnel)
VAPID_PRIVATE_KEY Clé privée VAPID (optionnel)
ONESIGNAL_APP_ID OneSignal ID (optionnel)
ONESIGNAL_REST_KEY OneSignal Key (optionnel)
TELEGRAM_BOT_TOKEN Token Bot Telegram (optionnel, proxy stickers)
STICKER_PACKS Packs de stickers personnalisés (optionnel, séparés par virgule nom:label, illimité) 8 packs par défaut

Licence

MIT © PaperPhone Contributors