160 lines
8.5 KiB
Markdown
160 lines
8.5 KiB
Markdown
---
|
|
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](https://www.etesync.app/) |
|
|
| **GitHub** | [etesync/etesync-server](https://github.com/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é)
|
|
|
|
```yaml
|
|
# 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)
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
1. **Premier lancement** : créer un compte admin via `python manage.py createsuperuser` ou depuis l'UI.
|
|
2. **Configurer l'URL publique** : `ETESYNC_SITE_URL` doit pointer sur `https://etesync.example.com` (les apps s'en servent pour les liens d'invitation).
|
|
3. **Créer un utilisateur** : soit via l'UI Web, soit via le `createsuperuser` Django.
|
|
4. **Côté client Android** : installer **DAVx5** (payant, ~5 €) + **EteSync pour DAVx5** (gratuit). Entrer l'URL `https://etesync.example.com`, son user/password.
|
|
5. **Côté iOS** : installer l'app **EteSync** (App Store), même config.
|
|
6. **Côté Web** : `https://etesync.example.com` → login, créer des calendriers, contacts.
|
|
7. **CalDAV bridge** (optionnel, lecture seule) : `ETESYNC_DAV_ENABLED=true` + proxy DAV.
|
|
8. **Backups** : `pg_dump` quotidien, **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-server` sur 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](https://www.etesync.app/)
|
|
- [Documentation](https://www.etesync.app/docs/)
|
|
- [Dépôt GitHub](https://github.com/etesync)
|
|
- [Blog Tom Joshi](https://tjoshi.ca/)
|
|
- [Client Android DAVx5](https://www.davx5.com/)
|
|
- [App iOS App Store](https://apps.apple.com/app/etesync/id1446904545)
|
|
- [Reddit r/etesync](https://www.reddit.com/r/etesync/)
|
|
- [selfh.st Calendar](https://selfh.st/apps/?tag=calendar)
|
|
- [Modèle crypto (whitepaper)](https://www.etesync.app/docs/crypto/)
|
|
|
|
## 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
|