Initial vault setup
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
---
|
||||
title: sabre/dav
|
||||
created: 2026-06-07
|
||||
updated: 2026-06-07
|
||||
type: app
|
||||
tags: [catalogue, calendar, caldav, carddav, library, php, framework]
|
||||
confidence: high
|
||||
contested: false
|
||||
sources: [https://selfh.st/apps/?tag=calendar]
|
||||
---
|
||||
|
||||
# 📚 sabre/dav
|
||||
|
||||
> **La librairie PHP de référence pour bâtir un serveur CalDAV/CardDAV/WebDAV**. Ce n'est pas un produit fini : c'est le **moteur** sur lequel reposent [[app-baikal]] et [[app-davical]], et qu'utilisent de nombreuses apps calendriers PHP.
|
||||
|
||||
| Métadonnée | Valeur |
|
||||
| :--- | :--- |
|
||||
| **Site web** | [sabre.io](https://sabre.io/) |
|
||||
| **GitHub** | [sabre-io/dav](https://github.com/sabre-io/dav) |
|
||||
| **License** | BSD-3-Clause |
|
||||
| **Langage** | PHP 8.1+ |
|
||||
| **Étoiles** | 369 ⭐ (dépôt principal) — utilisé par des milliers d'applications en aval |
|
||||
| **Dernière MAJ** | 2026-04 (v4.7.x) |
|
||||
| **Catégorie** | [[cat-calendar]] |
|
||||
|
||||
## Description
|
||||
|
||||
**sabre/dav** (prononcer « sabre-D-A-V ») est une **librairie PHP** qui implémente les protocoles **WebDAV (RFC 4918)**, **CalDAV (RFC 4791)** et **CardDAV (RFC 6352)** avec un soin maniaque de la conformité. Créée par **Evert Pot** (aussi à l'origine de **sabre/uri**, **sabre/xml** et de l'entreprise fruux), c'est le **standard de facto** pour monter un serveur CalDAV/CardDAV en PHP.
|
||||
|
||||
Contrairement à [[app-radicale]] ou [[app-baikal]] qui sont des applications *clés en main*, sabre/dav est un **framework** : vous écrivez le code PHP qui assemble les briques (auth, backend de stockage, plugins CalDAV, plugins CardDAV, etc.). En contrepartie, vous obtenez une **intégration native** dans votre propre application (CMS, ERP, plateforme SaaS) et un contrôle total sur l'auth, le stockage, les quotas, la facturation. La librairie est découpée en composants réutilisables (`sabre/dav`, `sabre/event`, `sabre/http`, `sabre/xml`, `sabre/uri`).
|
||||
|
||||
**Points forts** : **conformité RFC** excellente (c'est *la* raison d'exister — passer les tests CalDAV du [CalConnect](https://www.calconnect.org/)), modularité extrême (vous n'embarquez que ce dont vous avez besoin), documentation énorme, support de long terme (LTS), utilisé en production par Nextcloud, Baïkal (avant fork), et des dizaines d'autres, **licence BSD-3** (ultra permissive).
|
||||
|
||||
**Points faibles** : **pas une application** : il faut coder, donc public dev PHP confirmé ; **pas d'UI admin** par défaut ; la doc suppose PHP 8+ et Composer ; pas de support CardDAV par défaut (nécessite `sabre/dav` avec le bon plugin). Pour 95 % des cas, on veut plutôt [[app-baikal]] (qui *utilise* sabre/dav avec une UI).
|
||||
|
||||
## Installation
|
||||
|
||||
sabre/dav est une **librairie**, pas une app. On l'installe via **Composer** dans un projet PHP :
|
||||
|
||||
```bash
|
||||
composer require sabre/dav ^4.7
|
||||
```
|
||||
|
||||
### Serveur minimal en 30 lignes
|
||||
|
||||
```php
|
||||
<?php
|
||||
// public/index.php
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
use Sabre\DAV;
|
||||
use Sabre\CalDAV;
|
||||
use Sabre\CardDAV;
|
||||
|
||||
$nodes = [
|
||||
new CalDAV\CalendarRoot(
|
||||
$principalBackend = new DAVACL\PrincipalBackend\PDO(
|
||||
new PDO('sqlite:data/db.sqlite')
|
||||
)
|
||||
),
|
||||
new CardDAV\AddressBookRoot(
|
||||
$principalBackend
|
||||
),
|
||||
];
|
||||
|
||||
$server = new DAV\Server($nodes);
|
||||
$server->setBaseUri('/');
|
||||
$server->addPlugin(new DAV\Browser\Plugin());
|
||||
$server->addPlugin(new DAVACL\Plugin());
|
||||
$server->addPlugin(new CalDAV\Plugin());
|
||||
$server->addPlugin(new CardDAV\Plugin());
|
||||
$server->exec();
|
||||
```
|
||||
|
||||
### Docker pour un projet utilisant sabre/dav
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml (PHP-FPM + Nginx + SQLite/Postgres)
|
||||
services:
|
||||
dav:
|
||||
build: .
|
||||
container_name: sabredav-app
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./public:/app/public
|
||||
- ./data:/app/data
|
||||
depends_on:
|
||||
- db
|
||||
environment:
|
||||
DATABASE_URL: pdo-pgsql://dav:dav@db:5432/dav
|
||||
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
container_name: sabredav-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: dav
|
||||
POSTGRES_PASSWORD: dav
|
||||
POSTGRES_DB: dav
|
||||
volumes:
|
||||
- ./pgdata:/var/lib/postgresql/data
|
||||
```
|
||||
|
||||
Pas de docker « officiel » : c'est à vous de composer l'image (`FROM php:8.3-fpm` + `composer install` + config Nginx).
|
||||
|
||||
### Schéma de la base
|
||||
|
||||
```bash
|
||||
# Création des tables CalDAV/CardDAV
|
||||
vendor/bin/sabre-cli caldav:principals-create
|
||||
vendor/bin/sabre-cli caldav:calendar-create principal user
|
||||
vendor/bin/sabre-cli carddav:addressbook-create principal user
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
1. **Composer** : `composer require sabre/dav`
|
||||
2. **Backend principal** : `PDO` (SQLite/Postgres/MySQL) ou LDAP.
|
||||
3. **Authentification** : `Auth\Backend\PDO` (htpasswd-like en DB) ou implémentation custom (LDAP, OAuth, JWT).
|
||||
4. **Plugins CalDAV** : `CalDAV\Plugin` (cœur), `CalDAV\ICSExportPlugin` (export), `CalDAV\Schedule\Plugin` (IMIP).
|
||||
5. **Plugins CardDAV** : `CardDAV\Plugin` (cœur), `CardDAV\VCARDExport`.
|
||||
6. **ACL** : `DAVACL\Plugin` (par défaut).
|
||||
7. **Quota / Partage / Notifications** : plugins optionnels, à brancher.
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Open Source
|
||||
- [[app-baikal]] — **Construit sur sabre/dav**, mais avec une UI admin (le plus proche cousin « clé en main »)
|
||||
- [[app-davical]] — Anciennement construit sur sabre/dav, maintenant réécrit en PDO natif
|
||||
- [[app-radicale]] — Équivalent Python, plus simple à déployer
|
||||
- [[app-etesync]] — CalDAV-compatible mais avec chiffrement E2E
|
||||
- **simpleCalDAV** (Python) — Librairie Python plus modeste
|
||||
- **DAVMail** (Java) — Passerelle CalDAV IMAP/SMTP
|
||||
- **node-caldav** (Node.js) — Librairie CalDAV côté client
|
||||
|
||||
### Propriétaires (ce que sabre/dav remplace comme brique)
|
||||
- **iCloud Calendar** — fermé
|
||||
- **Google Calendar API** — pas CalDAV, mais concurrent fonctionnel
|
||||
- **Microsoft Graph Calendar** — idem
|
||||
- **Exchange / EWS** — Microsoft
|
||||
|
||||
## Sécurité
|
||||
|
||||
- ✅ **Conformité RFC stricte** = moins de surface pour les CVE
|
||||
- ✅ **Licence BSD-3** : utilisable dans des projets propriétaires
|
||||
- ✅ **CSRF / XSS** : la couche HTTP (`sabre/http`) gère les en-têtes
|
||||
- ⚠️ **Auth custom** = vous êtes responsable de la robustesse (bcrypt, pas MD5, rate limit)
|
||||
- ✅ **Chiffrement at-rest** = à votre charge (chiffrement de la DB ou filesystem)
|
||||
- ⚠️ **Mises à jour** : suivre `sabre-io/dav` sur GitHub, LTS = releases paires
|
||||
- ✅ **Pas de dépendances exotiques** : Composer + PDO suffisent
|
||||
- ⚠️ **Sécurité du code client** = votre code, votre responsabilité (c'est une lib !)
|
||||
|
||||
## Ressources
|
||||
|
||||
- [Documentation officielle](https://sabre.io/dav/)
|
||||
- [Dépôt GitHub](https://github.com/sabre-io/dav)
|
||||
- [API Reference](https://sabre.io/dav/caldav/)
|
||||
- [Sabre Faking Server (pour tests)](https://github.com/sabre-io/dav/tree/master/tests/Sabre/CalDAV/Backend)
|
||||
- [Site fruux (entreprise)](https://fruux.com/)
|
||||
- [selfh.st Calendar](https://selfh.st/apps/?tag=calendar)
|
||||
- [Evert Pot — blog](https://evertpot.com/)
|
||||
|
||||
## Pages Liées
|
||||
|
||||
- [[cat-calendar]] — Catégorie Calendar
|
||||
- [[app-baikal]] — Application CalDAV **basée** sur sabre/dav
|
||||
- [[app-davical]] — Autre serveur PHP, historiquement basé sur sabre/dav
|
||||
- [[app-radicale]] — Équivalent Python
|
||||
- [[app-etesync]] — Calendrier E2E
|
||||
- [[app-cal-com]] — Scheduler qui consomme CalDAV
|
||||
- [[recettes-docker-compose]] — Templates Docker
|
||||
- [[app-traefik]] — Reverse-proxy HTTPS
|
||||
Reference in New Issue
Block a user