8.5 KiB
title: EteSync created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, calendar, contacts, e2ee, chiffrement, python, django, privacite] confidence: high contested: false sources: [https://selfh.st/apps/?tag=calendar]
🔐 EteSync
Le serveur de calendrier et contacts chiffré de bout en bout (E2EE) : ni l'admin du serveur, ni un attaquant ayant accès au serveur ne peuvent lire vos rendez-vous. C'est le signal/element/proton-calendar de l'auto-hébergement, conçu par Tom Joshi.
| Métadonnée | Valeur |
|---|---|
| Site web | etesync.app |
| GitHub | etesync/etesync-server |
| License | AGPL-3.0 (serveur) |
| Langage | Python 3.11+ / Django 5.x |
| Étoiles | 101 ⭐ (toute l'org ettesync) |
| Dernière MAJ | 2026-03 (v0.13.x) |
| Catégorie | cat-calendar |
Description
EteSync est né d'un constat : tous les serveurs CalDAV (app-radicale, app-baikal, app-davical) stockent vos calendriers et contacts en clair sur le serveur. Si un attaquant, un administrateur curieux, ou une réquisition légale accède au serveur, il lit tout. EteSync résout ce problème en appliquant un chiffrement E2E systématique : tout passe par un JMAP-like ou CalDAV adapté, et tout est chiffré côté client avec une clé dérivée du mot de passe de l'utilisateur avant d'atteindre le serveur.
L'architecture repose sur : un serveur Django (REST/JMAP-like, plus CalDAV proxy en option), un modèle crypto (libsodium, AES-GCM, signed ratchet), des clients officiels (Android via DAVx5 + plugin EteSync, iOS via app officielle, Web via l'app web), et une intégration CalDAV (EteSync expose ses calendriers chiffrés en CalDAV en lecture, via le client web ou un proxy). Le serveur ne voit jamais le contenu en clair, seulement des blobs chiffrés + métadonnées (timestamps, tailles).
Points forts : chiffrement E2E authentique (vraiment, pas du marketing), basé sur signal-protocol-like (ratchet), interopérable CalDAV en sortie (donc les clients standards peuvent lire), licence AGPL-3.0 (auditable), client web responsive, apps mobiles natives (Android/iOS), zero-knowledge côté serveur (le serveur peut être compromis, vos données restent illisibles), comptage d'invités pour l'auto-hébergement (compte john@etesync.local si DNS mal configuré).
Points faibles : 101 étoiles = signal de niche (mais c'est un signal de qualité vs de quantité), modèle de menace spécifique : si l'attaquant est sur le client (malware, keylogger), E2EE n'aide pas ; pas de CalDAV complet en écriture (le proxy DAV expose seulement en lecture, l'écriture passe par les apps natives) ; clients tiers limités (DAVx5 + plugin, pas Thunderbird natif) ; clé = mot de passe utilisateur : si l'utilisateur oublie son mot de passe, ses données sont irrécupérables (c'est le prix de l'E2E) ; bus factor faible (Tom Joshi, quelques contributeurs).
📜 Historique : EteSync a eu une offre Cloud (etesync.com) qui a été reprise par Proton (Proton Calendar). Le projet open source reste la version self-hosted, active mais avec un bus factor à surveiller.
Installation
Via Docker Compose (recommandé)
# docker-compose.yml
services:
etesync:
image: etesync/server:latest
container_name: etesync
restart: unless-stopped
ports:
- "8000:8000"
environment:
ETESYNC_DATA_DIR: /data
ETESYNC_DB: postgres
ETESYNC_DB_HOST: db
ETESYNC_DB_PORT: 5432
ETESYNC_DB_NAME: etesync
ETESYNC_DB_USER: etesync
ETESYNC_DB_PASSWORD: changez-moi
ETESYNC_SITE_URL: https://etesync.example.com
ETESYNC_ALLOWED_HOSTS: etesync.example.com
SECRET_KEY: changez-cette-cle-en-50-chars
volumes:
- ./data:/data
depends_on:
- db
db:
image: postgres:16-alpine
container_name: etesync-db
restart: unless-stopped
environment:
POSTGRES_DB: etesync
POSTGRES_USER: etesync
POSTGRES_PASSWORD: changez-moi
volumes:
- ./pgdata:/var/lib/postgresql/data
Reverse-proxy (Traefik)
# labels Traefik
- "traefik.http.routers.etesync.rule=Host(`etesync.example.com`)"
- "traefik.http.routers.etesync.tls.certresolver=letsencrypt"
- "traefik.http.services.etesync.loadbalancer.server.port=8000"
Installation manuelle
Python 3.11+, Django, PostgreSQL, Redis (optionnel). Cloner le repo, pip install -r requirements.txt, python manage.py migrate, gunicorn etesync_server.wsgi:application. Configuration par variables d'environnement (voir .env.example).
Configuration
- Premier lancement : créer un compte admin via
python manage.py createsuperuserou depuis l'UI. - Configurer l'URL publique :
ETESYNC_SITE_URLdoit pointer surhttps://etesync.example.com(les apps s'en servent pour les liens d'invitation). - Créer un utilisateur : soit via l'UI Web, soit via le
createsuperuserDjango. - Côté client Android : installer DAVx5 (payant, ~5 €) + EteSync pour DAVx5 (gratuit). Entrer l'URL
https://etesync.example.com, son user/password. - Côté iOS : installer l'app EteSync (App Store), même config.
- Côté Web :
https://etesync.example.com→ login, créer des calendriers, contacts. - CalDAV bridge (optionnel, lecture seule) :
ETESYNC_DAV_ENABLED=true+ proxy DAV. - Backups :
pg_dumpquotidien, sans la clé utilisateur (inutile, c'est E2E).
Alternatives
Open Source
- app-radicale — Serveur CalDAV, PAS chiffré (stockage clair)
- app-baikal — Idem, PAS chiffré
- app-davical — Idem, PAS chiffré
- app-sabre-dav — Idem, PAS chiffré
- Proton Calendar — Chiffré E2E mais SaaS (version commerciale d'EteSync en partie)
- Tuta (Tutanota) Calendar — Chiffré E2E, SaaS
- Mailcow — Inclut SOGo avec CalDAV non chiffré (mais on peut chiffrer le disque)
- app-nextcloud — E2E pour fichiers (E2EE) mais pas pour calendriers (chiffrement côté serveur uniquement)
Propriétaires (ce qu'EteSync remplace)
- iCloud Calendar — Chiffré par Apple en transit + at rest, mais Apple a la clé
- Google Calendar — Chiffrement at rest, mais Google peut lire
- Outlook.com Calendar — Idem
- Proton Calendar — E2E authentique, mais SaaS (Proton AG)
- Tutanota Calendar — E2E, mais SaaS (Tuta)
Sécurité
- ✅ E2E authentique : chiffrement côté client avec libsodium, ratchet, AES-GCM
- ✅ Zero-knowledge : admin serveur ne peut rien lire (même s'il a accès à la DB)
- ✅ AGPL-3.0 : auditable, fork = contribution
- ✅ HTTPS obligatoire (apps refusent HTTP)
- ⚠️ Mot de passe = clé de chiffrement : pas de reset possible, mot de passe faible = données compromises
- ✅ Pas de télémétrie (contrairement à Proton Cloud)
- ⚠️ CalDAV proxy = lecture seule : l'écriture E2E passe par les apps natives
- ⚠️ Mises à jour : suivre
etesync/etesync-serversur GitHub, releases peu fréquentes - ✅ Pas de 2FA native sur EteSync-server (compensé par l'E2E : pas besoin de 2FA si crypto OK), mais peut être ajoutée via app-authelia en façade
- ⚠️ Bus factor : surveiller les issues GitHub, le projet est petit
- ⚠️ CVE dépendances (Django, libsodium) : mises à jour régulières
Ressources
- Site officiel
- Documentation
- Dépôt GitHub
- Blog Tom Joshi
- Client Android DAVx5
- App iOS App Store
- Reddit r/etesync
- selfh.st Calendar
- Modèle crypto (whitepaper)
Pages Liées
- cat-calendar — Catégorie Calendar
- app-radicale — Serveur CalDAV non chiffré (alternative non-E2E)
- app-baikal — Idem, non chiffré
- app-davical — Idem, non chiffré
- app-sabre-dav — Idem, non chiffré
- app-cal-com — Scheduler qui se connecte à EteSync (via DAVx5)
- recettes-docker-compose — Templates Docker
- app-traefik — Reverse-proxy HTTPS
- app-authelia — SSO/2FA en façade (optionnel, E2E = déjà solide)
- securisation-home-lab — Bonnes pratiques sécu