Messagerie sécurisée française avec chiffrement de bout en bout.
- Chiffrement E2E — Protocole Signal via
libsignal-protocol-typescript - Messagerie temps réel — Socket.io
- Appels audio/vidéo — LiveKit
- Serveurs & salons — Système de serveurs avec canaux, rôles et permissions
- Bots — Intégration de bots personnalisés
- 12 langues — FR, EN, DE, ES, IT, PT, NL, PL, SV, DA, NO, JA
- Thème clair/sombre
- Panel admin
| Catégorie | Technologies |
|---|---|
| Framework | Next.js 16 (App Router, standalone) |
| UI | HeroUI v3, Radix UI, shadcn/ui |
| Style | Tailwind CSS v4 |
| Temps réel | Socket.io, LiveKit |
| Sécurité | Signal Protocol, DOMPurify |
| i18n | Système custom (12 langues) |
Ce frontend s'intègre dans une architecture microservices :
Frontend (:4000) → Gateway (:3000) → Microservices
├── users (:3001)
├── messages (:3002)
├── friends (:3003)
├── calls (:3004)
├── servers (:3005)
├── bots (:3006)
└── media (:3007)
Base de données : MySQL 8 — Cache : Redis 7
- Bun ≥ 1.2
bun installbun run devL'app est accessible sur http://localhost:4000.
bun run build
bun run startdocker compose up frontendsrc/
├── app/ # Routes (App Router)
│ ├── (auth)/ # Login, signup, reset password
│ ├── (static)/ # Pages statiques
│ ├── app/ # Dashboard principal
│ ├── admin/ # Panel admin
│ ├── channels/ # Navigation serveurs/salons
│ ├── invite/ # Système d'invitations
│ └── ...
├── components/ # Composants React
│ ├── ui/ # shadcn/ui (50+ composants)
│ ├── chat/ # Interface de chat
│ ├── landing/ # Page d'accueil
│ └── ...
├── hooks/ # Custom hooks
├── i18n/ # Traductions (12 langues)
└── lib/ # Utilitaires
Voir CONTRIBUTING.md.
Rapport généré le : 2026-05-11
- Vue d'ensemble
- Architecture globale
- Frontend Web
- Gateway
- Service Users
- Service Messages
- Service Friends
- Service Calls
- Service Servers
- Service Bots
- Service Media
- Server Node (auto-hébergé)
- Application Mobile
- Application Desktop
- Infrastructure & Déploiement
- Sécurité
- Communication inter-services
- Variables d'environnement critiques
- Points techniques notables
AlfyChat est une plateforme de messagerie sécurisée avec chiffrement de bout en bout, conçue selon une architecture microservices. Le projet supporte trois clients natifs (web, mobile, desktop) et permet aux utilisateurs d'auto-héberger leurs propres serveurs communautaires.
| Élément | Détail |
|---|---|
| Nombre de sous-projets | 12 |
| Services backend | 8 (Gateway + 7 microservices) |
| Port principal | 3000 (Gateway) |
| Base de données principale | MySQL 8.0 |
| Cache | Redis 7 |
| Protocole temps réel | Socket.io 4 + WebRTC (LiveKit) |
| Chiffrement | Signal Protocol (E2EE) |
| Langues supportées | 12 (FR, EN, DE, ES, IT, PT, NL, PL, SV, DA, NO, JA) |
| Runtime | Bun 1.2 + Node.js |
┌──────────────────────────────────────────────────────────────┐
│ COUCHE CLIENT │
├──────────────────────────────────────────────────────────────┤
│ Web (Next.js :4000) Mobile (Expo RN) Desktop (Electron) │
└──────────────┬─────────────────┬────────────────────────────┘
│ │
HTTP + WebSocket HTTP + WebSocket
│ │
┌──────────────▼─────────────────▼────────────────────────────┐
│ GATEWAY :3000 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Express Router │ Socket.io Server │ Rate Limiter │ │
│ │ Circuit Breaker │ Service Registry │ Monitoring │ │
│ └─────────────────────────────────────────────────────┘ │
└──┬──────┬──────┬──────┬──────┬──────┬──────┬───────────────┘
│ │ │ │ │ │ │
3001 3002 3003 3004 3005 3006 3007
│ │ │ │ │ │ │
┌──▼──┐ ┌─▼──┐ ┌─▼──┐ ┌─▼──┐ ┌─▼──┐ ┌─▼──┐ ┌─▼──┐
│Users│ │Msg │ │Frnd│ │Call│ │Srv │ │Bots│ │Med │
└──┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘
└───────┴──────┴──────┴──────┴──────┴──────┴────┐
│
┌───────────────────────────────────────────────────▼──────────┐
│ MySQL 8.0 :3306 + Redis 7 :6379 │
└──────────────────────────────────────────────────────────────┘
AUTO-HÉBERGEMENT
┌──────────────────────────────────────┐
│ Server Node :4100 │
│ SQLite / PostgreSQL / MySQL local │
│ Socket.io client → Gateway │
└──────────────────────────────────────┘
Client → Gateway → Microservice → Base de données
↓
Socket.io → Broadcast → Autres clients connectés
Interface utilisateur principale accessible via navigateur.
| Élément | Version |
|---|---|
| Framework | Next.js 16.2.3 (App Router) |
| UI | HeroUI v3 + Radix UI + shadcn/ui |
| Styling | Tailwind CSS v4 |
| Runtime | Bun 1.2.0 |
| Temps réel | Socket.io-client 4.7.4 |
| Appels | LiveKit-client 2.18.0 |
| Chiffrement | libsignal-protocol-typescript |
| Rendu Markdown | react-markdown 10.1.0 |
| Sécurité XSS | DOMPurify 3.3.3 |
| Graphiques | Recharts 3.8.0 |
| Animations | Motion 12.38.0 |
4000 (dev) — se connecte au Gateway sur :3000
src/app/
├── (auth)/ → Login, inscription, reset mot de passe
│ ├── login/
│ ├── register/
│ └── forgot-password/
├── (static)/ → Pages institutionnelles
│ ├── about/
│ ├── legal/
│ ├── faq/
│ └── jobs/
├── app/ → Dashboard principal
├── channels/ → Navigation serveurs & canaux
├── admin/ → Panneau d'administration
├── developers/ → Documentation développeur
├── invite/ → Système d'invitation
├── hosting/ → Info hébergement
├── subscription/ → Abonnements
├── verify-email/ → Vérification email
└── api/ → Routes API internes Next.js
| Composant | Description |
|---|---|
chat-area.tsx |
Zone de messagerie DM |
server-chat-area.tsx |
Zone de messagerie serveur |
group-chat-area.tsx |
Zone de messagerie groupe |
message-item.tsx |
Rendu d'un message (avec déchiffrement) |
call-panel.tsx |
Interface appel vocal/vidéo |
settings-dialog.tsx |
Paramètres utilisateur (97 KB — très complet) |
role-manager.tsx |
Gestion des rôles serveur |
channel-manager.tsx |
Administration des canaux |
emoji-picker.tsx |
Sélecteur d'emoji |
friends-panel.tsx |
Gestion des amis |
12 langues : fr, en, de, es, it, pt, nl, pl, sv, da, no, ja
NEXT_PUBLIC_API_URL=http://localhost:3000
NEXT_PUBLIC_WS_URL=ws://localhost:3000bun run dev # Démarrage dev sur :4000
bun run build # Build production (output: standalone)
bun run start # Démarrage productionPoint d'entrée unique pour tous les clients. Gère le routage HTTP, les WebSockets, la sécurité, le monitoring et la tolérance aux pannes.
| Élément | Version |
|---|---|
| Framework | Express 4.21.2 |
| WebSocket | Socket.io 4.8.1 |
| Adapter Socket.io | @socket.io/redis-adapter 8.3.0 |
| Rate limiting | rate-limiter-flexible 10.0.1 |
| Circuit breaker | opossum 9.0.0 |
| Logs | pino 10.3.1 + winston |
| Cache | ioredis 5.4.0 |
3000
- Proxy HTTP — Route les requêtes vers chaque microservice
- Serveur WebSocket — Diffuse les événements temps réel
- Rate limiting — 3 niveaux : anonyme / utilisateur / admin
- Registre de services — Découverte dynamique des microservices
- Circuit breaker — Isole les services défaillants
- Load balancing — Distribution des requêtes
- Monitoring — Métriques, health checks, détection d'anomalies
- Sécurité — Validation JWT, ban IP, CORS
| Niveau | Limite |
|---|---|
| Anonyme | Configurable via RATE_LIMIT_ANON |
| Utilisateur authentifié | Configurable via RATE_LIMIT_USER |
| Admin | Configurable via RATE_LIMIT_ADMIN |
| Endpoints auth (login/register) | 10 tentatives / 15 min |
PORT=3000
FRONTEND_URL=http://localhost:4000
JWT_SECRET=...
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=...
INTERNAL_SECRET=...
USERS_SERVICE_URL=http://localhost:3001
MESSAGES_SERVICE_URL=http://localhost:3002
FRIENDS_SERVICE_URL=http://localhost:3003
CALLS_SERVICE_URL=http://localhost:3004
SERVERS_SERVICE_URL=http://localhost:3005
BOTS_SERVICE_URL=http://localhost:3006
MEDIA_SERVICE_URL=http://localhost:3007Authentification, gestion des profils, 2FA, RGPD, tickets support, changelogs.
Express 4, MySQL 8, Redis, JWT, bcryptjs, otplib (TOTP), nodemailer, express-validator, helmet
3001
POST /auth/register Inscription
POST /auth/login Connexion
POST /auth/2fa/login Vérification 2FA
POST /auth/refresh Renouvellement token
POST /auth/logout Déconnexion
GET /auth/verify Validation token
GET /auth/verify-email Activation compte (lien email)
POST /auth/resend-verification Renvoi email vérification
GET /users Profils utilisateurs
POST /users/preferences Préférences (thème, langue, notifs)
GET /rgpd Export données RGPD
POST /rgpd/delete Suppression compte
GET /admin/* Routes admin
GET /helpdesk/* Système de tickets
users
id, username, email, password_hash, avatar_url, banner_url,
bio, role, status, custom_status, email_verified,
public_key, identity_key, created_at, updated_at
user_preferences
user_id, theme, language, encryption_level,
notification_settings (JSON), privacy_settings (JSON)
sessions
id, user_id, refresh_token, expires_at, created_at
rgpd_consents
user_id, consent_type, granted_at
rgpd_deletion_requests
user_id, requested_at, scheduled_deletion_at, status
custom_badges
id, user_id, name, icon, color, created_atPORT=3001
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
JWT_SECRET
GATEWAY_URL
TURNSTILE_SECRET_KEY # Cloudflare CAPTCHA
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS
INTERNAL_SECRET
SERVICE_ID, SERVICE_LOCATION, SERVICE_ENDPOINT, SERVICE_DOMAINStockage et récupération des messages, gestion des conversations, archivage hybride, notifications.
3002
POST /messages Envoyer un message
GET /messages/:conversationId Historique d'une conversation
DELETE /messages/:messageId Supprimer un message
GET /conversations Lister les conversations
POST /conversations Créer une conversation
GET /archive/:conversationId Messages archivés
POST /archive/cleanup Nettoyage des archives
GET /notifications Notifications utilisateur
- Quota : 20 000 messages / 30 jours par conversation
- Délai TTL : Messages actifs conservés dans Redis (TTL 4s pour cache)
- Archivage serveur : Messages chiffrés en base après quota
- Fallback P2P : Si quota serveur dépassé, les clients échangent directement
- Maintenance quotidienne : Tâche planifiée de nettoyage toutes les 24h
messages
id, conversation_id, sender_id, content (chiffré), type,
attachment_url, created_at, deleted_at
conversations
id, type (dm|group), created_at
message_attachments
id, message_id, url, filename, size, mime_type
notifications
id, user_id, type, data (JSON), read, created_at
dm_archive_metadata
conversation_id, last_archived_at, total_archived_countPORT=3002
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
JWT_SECRET
ARCHIVE_DB_ENCRYPTION_KEY # Chiffrement des archives
INTERNAL_SECRETGestion des amitiés, demandes d'ami, blocage d'utilisateurs.
3003
GET / Liste d'amis
POST /request Envoyer une demande d'ami
GET /requests Demandes en attente reçues
POST /requests/:id/accept Accepter une demande
POST /requests/:id/decline Refuser une demande
DELETE /:friendId Supprimer un ami
GET /blocked Utilisateurs bloqués
POST /block/:userId Bloquer un utilisateur
DELETE /block/:userId Débloquer un utilisateur
friends
user_id, friend_id, status (pending|accepted), created_at
blocked_users
user_id, blocked_user_id, created_atPORT=3003
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
JWT_SECRET
USERS_SERVICE_URL # Pour récupérer les profils utilisateurs
INTERNAL_SECRETGestion des appels vocaux et vidéo, coordination WebRTC via LiveKit.
3004
POST /calls Initier un appel (voice|video)
GET /calls/:callId Détails d'un appel
POST /calls/:callId/join Rejoindre un appel
POST /calls/:callId/leave Quitter un appel
POST /calls/:callId/end Terminer un appel
GET /calls/:callId/token Obtenir un token LiveKit
calls
id, type (voice|video), initiator_id, conversation_id,
channel_id, status (active|ended), started_at, ended_at
call_participants
call_id, user_id, joined_at, left_atPORT=3004
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
DB_POOL_SIZE=5
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET
INTERNAL_SECRETCréation et gestion des serveurs communautaires, canaux, rôles, permissions et modération.
3005
POST /servers Créer un serveur
GET /servers Lister les serveurs de l'utilisateur
GET /servers/:id Détails d'un serveur
PUT /servers/:id Modifier un serveur
DELETE /servers/:id Supprimer un serveur
POST /servers/:id/channels Créer un canal
GET /servers/:id/channels Lister les canaux
POST /servers/:id/roles Créer un rôle
GET /servers/:id/members Lister les membres
POST /servers/:id/invites Générer un lien d'invitation
POST /servers/:id/bans Bannir un membre
DELETE /servers/:id/bans/:userId Débannir
servers
id, name, description, icon_url, owner_id, created_at
channels
id, server_id, name, type (text|voice|category),
parent_id, position, created_at
server_members
server_id, user_id, joined_at
roles
id, server_id, name, color, permissions (bitfield), position
member_roles
server_id, user_id, role_id
channel_permission_overwrites
channel_id, role_id, allow (bitfield), deny (bitfield)
invites
code, server_id, creator_id, uses, max_uses, expires_at
bans
server_id, user_id, reason, banned_by, created_atPORT=3005
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
REDIS_HOST, REDIS_PORT
JWT_SECRET
INTERNAL_SECRETCréation, gestion et répertoire public des bots.
3006
POST /bots Créer un bot
GET /bots Lister ses bots
GET /bots/:id Détails d'un bot
PUT /bots/:id Modifier un bot
DELETE /bots/:id Supprimer un bot
GET /bots/search Recherche publique de bots
POST /bots/:id/invite Obtenir un lien d'invitation
POST /bots/:id/permissions Configurer les permissions
POST /bots/:id/token Régénérer le token
bots
id, owner_id, name, description, avatar_url, token,
prefix, status (online|offline|maintenance),
verified (pending|approved|rejected), tags (JSON),
website, support_server, privacy_policy_url, created_at
bot_permissions
bot_id, server_id, permissions (bitfield)
bot_statistics
bot_id, invite_count, server_count, updated_atPORT=3006
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME
REDIS_HOST, REDIS_PORT
JWT_SECRET
INTERNAL_SECRETUpload, traitement (redimensionnement Sharp) et diffusion des fichiers médias.
3007
POST /media/upload Upload d'un fichier (avatar, banner, attachment, icon, wallpaper)
GET /media/:type/:filename Servir un média
DELETE /media/:filename Supprimer un média
GET /uploads/* Fichiers statiques sécurisés
/uploads/
├── avatars/ Avatars utilisateurs
├── banners/ Bannières utilisateurs/serveurs
├── attachments/ Pièces jointes de messages
├── icons/ Icônes de serveurs
└── wallpapers/ Fonds d'écran personnalisés
| Mesure | Détail |
|---|---|
| Formats acceptés | JPEG, PNG, GIF, WebP |
| Validation magic bytes | Vérifie le contenu réel du fichier (pas l'extension) |
| Content-Disposition | attachment — force le téléchargement, empêche XSS |
| X-Content-Type-Options | nosniff |
| Cache-Control | Configurable par type |
| Dotfiles | Refusés |
| Directory listing | Désactivé |
PORT=3007
JWT_SECRET
GATEWAY_URL
INTERNAL_SECRET
UPLOAD_PATH=/app/uploads # En production Docker
MAX_FILE_SIZE=... # Taille max configurableApplication autonome permettant aux utilisateurs d'héberger leur propre serveur communautaire localement.
4100 (par défaut, personnalisable)
| Élément | Version |
|---|---|
| Framework | Express 4.18.2 |
| ORM | Prisma 6.5.0 |
| Bases de données | SQLite (défaut) / PostgreSQL / MySQL |
| CLI | Commander 12.0.0 |
| WebSocket client | socket.io-client 4.7.4 |
| Auth | JWT + bcrypt 5.1.1 |
| Cache | ioredis (optionnel) |
alfychat-server start \
--server-id <id> # ID serveur depuis AlfyChat
--token <token> # Token d'authentification du nœud
--name <name> # Nom du serveur
--port <port> # Port local (défaut: 4100)
--gateway <url> # URL du gateway (défaut: https://gateway.alfychat.app)
--data-dir <dir> # Répertoire des données (défaut: ./alfychat-data)ServerSelf Métadonnées du serveur
ServerSelfConfig Configuration (canal par défaut, membres max, token)
ServerSelfInvite Codes d'invitation avec limites d'usage
Channel Canaux (hiérarchique avec parent_id)
ChannelPermissionOverwrite Permissions par canal
Role Rôles avec bitfield de permissions
MemberRole Assignation rôle ↔ membre
Message Messages des canauxalfychat-data/
├── server.db Base SQLite (par défaut)
├── uploads/
│ ├── avatars/
│ ├── banners/
│ └── attachments/
└── .env Configuration locale
SERVER_ID=...
NODE_TOKEN=...
GATEWAY_URL=https://gateway.alfychat.app
PORT=4100
DATA_DIR=./alfychat-data
DB_TYPE=sqlite # sqlite | postgres | mysql
DATABASE_URL=file:./server.db
JWT_SECRET=...
REDIS_ENABLED=false # Optionnel pour le scalingApplication native iOS et Android encapsulant l'interface web.
| Élément | Version |
|---|---|
| Framework | Expo 52.0.0 |
| Runtime | React Native |
| WebView | react-native-webview 13.12.5 |
| Status Bar | expo-status-bar 2.0.1 |
| Splash Screen | expo-splash-screen 0.29.18 |
L'application est un wrapper WebView qui charge l'interface web AlfyChat. Cette approche permet de maintenir un seul codebase frontend tout en offrant une distribution native (App Store / Play Store).
| Fonctionnalité | Implémentation |
|---|---|
| Deep linking | Routes vers /login, /register, /channels |
| Bouton retour Android | Gestion du geste natif |
| Whitelist d'URLs | Seul alfychat.app est autorisé |
| État de chargement | Indicateur pendant le chargement de la WebView |
expo start # Serveur de développement
expo run:android # Build et lancement Android
expo run:ios # Build et lancement iOS
eas build # Build cloud via EASSe connecte à https://alfychat.app (production)
Application de bureau cross-platform Windows / macOS / Linux.
| Élément | Version |
|---|---|
| Framework | Electron 33.0.0 |
| Build | electron-builder 25.1.8 |
| Stockage local | electron-store 10.0.0 |
Identique au mobile — wrapper qui charge https://alfychat.app dans une BrowserWindow Electron.
- Taille : 1280×800 (minimum : 900×600)
- Barre de menu : masquée (
menuBarVisible: false) - Sandbox : activé (
preload.jssandboxé) - Navigation externe bloquée (whitelist
alfychat.app)
| Plateforme | Format |
|---|---|
| Windows | NSIS installer + EXE portable |
| macOS | DMG + ZIP |
| Linux | AppImage + DEB |
npm start # Lancement dev
npm run dev # Mode développement (NODE_ENV=development)
npm run build:win # Build Windows
npm run build:mac # Build macOS
npm run build:linux # Build Linux
npm run build:all # Build toutes plateformes{
"appId": "app.alfychat.desktop",
"productName": "AlfyChat",
"icon": "assets/icon.png"
}Le fichier docker-compose.yml à la racine orchestre l'ensemble des services :
Services:
mysql → Port 3306 (persistance: mysql_data)
redis → Port 6379 (persistance: redis_data)
gateway → Port 3000
users → Port 3001
messages → Port 3002
friends → Port 3003
calls → Port 3004
servers → Port 3005
bots → Port 3006
media → Port 3007 (volume: media_uploads)
server-node → Port 4100 (volume: server_node_data)
frontend → Port 4000mysql_data → Données MySQL
redis_data → Cache Redis
media_uploads → Fichiers uploadés (avatars, bannières, pièces jointes)
server_node_data → Données du nœud auto-hébergé
1. MySQL + Redis (dépendances de tous les services)
2. Users, Messages, Friends, Calls, Servers, Bots, Media (microservices)
3. Gateway (une fois les microservices disponibles)
4. Frontend (une fois le Gateway disponible)
| Mécanisme | Implémentation |
|---|---|
| Tokens JWT | HS256, secret partagé JWT_SECRET |
| Hash mot de passe | bcryptjs / argon2 |
| 2FA | TOTP via otplib (RFC 6238) |
| CAPTCHA | Cloudflare Turnstile |
| Vérification email | Token UUID signé |
- Protocole : Signal Protocol (libsignal)
- Niveau : Client-side (bout en bout)
- Clés : Clé publique stockée en base, clé privée jamais transmise
- Archives : Chiffrées côté serveur avec
ARCHIVE_DB_ENCRYPTION_KEY
| Mesure | Outil |
|---|---|
| Headers sécurisés | Helmet 7 |
| CORS | Configuré par service |
| Rate limiting général | rate-limiter-flexible |
| Bruteforce auth | 10 tentatives / 15 min |
| Ban IP | Géré par le Gateway |
| Inter-services | Header X-Internal-Secret |
| Vérification | Détail |
|---|---|
| Magic bytes | Contenu réel vérifié (pas l'extension) |
| Types autorisés | JPEG, PNG, GIF, WebP |
| Content-Disposition | attachment (empêche l'exécution) |
| X-Content-Type-Options | nosniff |
| Directory listing | Désactivé |
| Dotfiles | Refusés |
Client → Gateway (HTTP / WebSocket)
Gateway → Microservices (HTTP proxy)
Services → Services (HTTP avec X-Internal-Secret)
Server-node → Gateway (WebSocket client, fédération)
X-Internal-Secret: <INTERNAL_SECRET>Utilisé pour distinguer les appels inter-services des appels clients. Chaque microservice rejette les requêtes sans ce header sur les routes internes.
| Événement | Sens | Description |
|---|---|---|
message:new |
Server → Client | Nouveau message reçu |
message:typing |
Bidirectionnel | Indicateur de frappe |
friend:request |
Server → Client | Demande d'ami reçue |
friend:accepted |
Server → Client | Demande acceptée |
call:incoming |
Server → Client | Appel entrant |
user:status |
Server → Client | Changement de statut |
server:update |
Server → Client | Mise à jour d'un serveur |
Variables communes à tous les services :
# Base de données
DB_HOST=localhost
DB_PORT=3306
DB_USER=alfychat
DB_PASSWORD=...
DB_NAME=alfychat
# Cache
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=...
# Sécurité — NE JAMAIS EXPOSER
JWT_SECRET=... # Minimum 32 caractères aléatoires
INTERNAL_SECRET=... # Minimum 32 caractères aléatoires
ARCHIVE_DB_ENCRYPTION_KEY=... # Clé 32 octets (AES-256)
# Email
SMTP_HOST=...
SMTP_PORT=587
SMTP_USER=...
SMTP_PASS=...
# Cloudflare
TURNSTILE_SECRET_KEY=...- Microservices avec base de données MySQL partagée (schéma non isolé par service) — choix pragmatique mais implique un couplage entre services
- Redis sert à la fois de cache (TTL messages), d'adaptateur Socket.io (scaling horizontal du Gateway) et de stockage de rate limiting
- Circuit breaker (opossum) sur le Gateway protège contre les cascades de pannes
- Le Gateway peut être répliqué horizontalement grâce à l'adaptateur Redis Socket.io
- Chaque microservice peut être mis à l'échelle indépendamment (sauf couplage DB)
- Le Server-node offre une décentralisation partielle (fédération)
- Implémentation Signal Protocol côté client uniquement
- Le serveur est opaque : il transporte des messages chiffrés sans les lire
- Les clés d'identité et de session sont gérées par
libsignal-protocol-typescript
- Mobile (Expo) et Desktop (Electron) sont des wrappers WebView — un seul codebase frontend à maintenir
- Avantage : déploiement et mises à jour centralisés
- Inconvénient : performances et fonctionnalités natives limitées
- 12 langues gérées côté frontend
- Fichiers de traduction dans
src/i18n/(format TypeScript)
- Le Server-node permet une vraie décentralisation des communautés
- Support SQLite pour une installation simple, PostgreSQL/MySQL pour la production
- Connexion au Gateway central pour la fédération (découverte, signalisation)