# CardSync πŸ”„ **Synology CardDAV β†’ Microsoft 365 Kontakte** β€” Self-hosted, Docker-basiert. Synchronisiert Kontakte von einem Synology CardDAV-Server automatisch in die Microsoft 365 Kontakte deiner Benutzer. Benutzer melden sich einmalig per Microsoft OAuth an, ein Admin konfiguriert den Synology-Server zentral. --- ## Voraussetzungen - Docker & Docker Compose - Synology NAS mit aktiviertem CardDAV-Server (Paket: β€žCardDAV Server" oder β€žContacts") - Microsoft Azure App-Registrierung --- ## Schnellstart ### Azure App-Registrierung erstellen CardSync unterstΓΌtzt zwei Betriebsmodi β€” du kannst sie **kombinieren oder nur einen** nutzen: **Modus A: OAuth-Login (Delegated Permissions)** User melden sich einmalig per Microsoft-Login an. Empfohlen fΓΌr kleine Setups oder zum Testen. **Modus B: Azure AD Gruppen-Import (Application Permissions) β€” empfohlen fΓΌr Firmen** Admin trΓ€gt eine Azure AD Gruppen-ID ein, alle Mitglieder werden automatisch importiert. Kein User-Login nΓΆtig. #### Setup-Schritte: 1. Gehe zu [portal.azure.com](https://portal.azure.com) β†’ **Azure Active Directory** β†’ **App-Registrierungen** 2. **Neue Registrierung** β†’ Name: `CardSync` 3. Kontotypen: nur eigene Organisation 4. Redirect-URI (Web): `https://deine-ip-oder-domain/auth/callback` 5. Unter **Zertifikate & Geheimnisse** ein neues Client-Secret erstellen β†’ notieren **Berechtigungen** unter **API-Berechtigungen** β†’ **Microsoft Graph**: *FΓΌr Modus A (Delegated):* - `Contacts.ReadWrite` (Delegiert) - `offline_access`, `openid`, `profile`, `email` *FΓΌr Modus B (Application β€” Goldstandard):* - `Contacts.ReadWrite` (**Anwendung** β€” wichtig, nicht delegiert!) - `User.Read.All` (Anwendung) - `GroupMember.Read.All` (Anwendung) - Danach **β€žAdministratorzustimmung erteilen"** klicken Beide Modi kΓΆnnen parallel laufen β€” User kΓΆnnen sich entweder selbst anmelden (Modus A), oder werden per Gruppen-Import angelegt (Modus B). ### 2. Repository vorbereiten ```bash git clone cd cardsync cp .env.example .env ``` ### 3. `.env` konfigurieren ```env # Datenbank POSTGRES_PASSWORD=sicher_aendern_123 # Sicherheit (langen zufΓ€lligen String generieren: openssl rand -hex 32) SECRET_KEY=dein_langer_zufaelliger_key # Microsoft Azure MS_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx MS_CLIENT_SECRET=dein-client-secret MS_TENANT_ID=common # oder deine Tenant-ID fΓΌr Single-Tenant # URL unter der die App erreichbar ist (KEIN trailing slash) APP_BASE_URL=http://192.168.1.100 # Admin-E-Mails (kommagetrennt) β€” diese Benutzer bekommen Admin-Zugang ADMIN_EMAILS=admin@firma.de,it@firma.de ``` ### 4. Starten ```bash docker compose up -d ``` Die App ist jetzt unter `https://localhost` erreichbar (HTTP wird automatisch auf HTTPS umgeleitet). > ⚠️ **Beim ersten Start** wird automatisch ein selbstsigniertes Zertifikat erzeugt β€” der Browser zeigt eine Sicherheitswarnung. Einmal akzeptieren und weitermachen. ### 5. (Optional) Eigenes Zertifikat hinterlegen Wenn du ein Wildcard- oder CA-signiertes Zertifikat hast: ```bash # Lege deine Dateien EXAKT mit diesen Namen ab: cp dein-wildcard.crt ./nginx/certs/cert.pem cp dein-wildcard.key ./nginx/certs/key.pem # Frontend neu starten β€” das war's docker compose restart frontend ``` Details und PFX-Konvertierung: siehe `nginx/certs/README.md` --- ## Verwendung ### Admin-Einrichtung 1. Gehe zu `http://deine-ip/auth/login?mode=admin` 2. Melde dich mit einem der Admin-Microsoft-Accounts an 3. Gehe im Admin-Dashboard zu **Synology Config** 4. Trage Server-URL, Benutzername und Passwort ein 5. Teste die Verbindung mit **Verbindung testen** ### Benutzer-Onboarding (Modus A β€” OAuth) 1. Benutzer rufen `http://deine-ip` auf 2. Klick auf **Mit Microsoft anmelden** 3. Microsoft OAuth-Zustimmung (Kontakte-Zugriff) 4. Adressbuch auswΓ€hlen und Sync-Intervall einstellen 5. Optional: **Jetzt synchronisieren** fΓΌr den ersten sofortigen Sync ### Benutzer-Import via Azure AD Gruppe (Modus B β€” empfohlen fΓΌr Firmen) 1. Admin-Dashboard β†’ **Azure AD Gruppe** 2. Object-ID der Azure AD Gruppe eintragen (aus Azure Portal β†’ AD β†’ Gruppen β†’ deine Gruppe β†’ Object ID) 3. Default-Adressbuch und Default-Sync-Intervall fΓΌr neue User wΓ€hlen 4. **Gruppe testen** klicken β†’ sollte die Mitgliederzahl anzeigen 5. **Speichern**, dann **Mitglieder jetzt importieren** 6. Alle Gruppenmitglieder sind nun in CardSync angelegt, Sync lΓ€uft automatisch 7. Mitgliedschaft wird im konfigurierten Intervall (Default: 6h) automatisch aktualisiert ### Admin: Benutzer verwalten - Im Admin-Dashboard unter **Benutzer** alle angemeldeten Benutzer sehen - Pro Benutzer: Adressbuch zuweisen, Intervall konfigurieren, Sync aktivieren/deaktivieren - Manuellen Sync fΓΌr jeden Benutzer triggern - Sync-Logs einsehen --- ## Synology CardDAV-Server einrichten 1. Im Synology Package Center β€ž**CardDAV Server**" installieren 2. Oder im Paket β€ž**Contacts**": CardDAV ist automatisch aktiv 3. Standard-Port: **5006** (HTTP) oder **5007** (HTTPS) 4. Server-URL-Format: `http://192.168.1.10:5006` oder `https://nas.firma.de:5007` --- ## Architektur ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Docker Compose β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Nginx │──▢│ FastAPI │──▢│PostgreSQLβ”‚ β”‚ β”‚ β”‚ :80 β”‚ β”‚ :8000 β”‚ β”‚ :5432 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”‚ Synology β”‚ β”‚ Microsoft β”‚ β”‚ CardDAV β”‚ β”‚ Graph API β”‚ β”‚ (CardDAV β”‚ β”‚ (REST/OAuth) β”‚ β”‚ Protokoll)β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Sync-Richtung:** Nur Synology β†’ MS365 (einseitig) **Matching-Strategie:** - Kontakte werden per UID (vCard UID-Feld) gematcht - Die UID wird beim ersten Sync in den MS365-Notizen hinterlegt - GelΓΆschte Synology-Kontakte werden aus MS365 entfernt --- ## Sicherheitshinweise - In Produktion: HTTPS-Reverse-Proxy (z.B. Traefik, Caddy, nginx mit Let's Encrypt) vorschalten - `SECRET_KEY` und `POSTGRES_PASSWORD` immer Γ€ndern - Das Synology-Passwort wird aktuell im Klartext in der DB gespeichert (fΓΌr Produktion: VerschlΓΌsselung ergΓ€nzen) - Microsoft Tokens werden per JWT-Session verwaltet und automatisch refresht --- ## Logs ```bash docker compose logs -f backend # Backend-Logs mit Sync-AktivitΓ€ten docker compose logs -f frontend # Nginx-Logs ``` --- ## Entwicklung / Updates ```bash docker compose down docker compose up -d --build ```