Files
wiki/Catalogue-Self-Hosted/apps/app-etesync.md
T
2026-06-09 18:40:21 +02:00

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

  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-nextcloudE2E 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

Pages Liées