Документация

Синхронизация календарей CalDAV

Версия v2.3.1 · Обновлено

Синхронизация календарей CalDAV#

IncidentRelay может предоставлять расписания дежурств (on-call) команд в виде календарей CalDAV, доступных только для чтения. Это удобно для календарных клиентов с прямой поддержкой CalDAV, таких как Apple Calendar, Thunderbird и DAVx5.

Каждая доступная команда предоставляется как отдельный календарь. Пользователи видят только календари тех команд, к которым им разрешён доступ на чтение.

Когда использовать CalDAV#

Используйте CalDAV, когда календарный клиент поддерживает учётные записи CalDAV и вы хотите автоматически обнаруживать все доступные календари команд.

Рекомендуемые клиенты:

КлиентРекомендуемый способ
Apple Calendar на macOSCalDAV
Apple Calendar на iOS/iPadOSCalDAV
ThunderbirdCalDAV
DAVx5 на AndroidCalDAV
OutlookВместо этого подписка ICS
Google CalendarВместо этого подписка ICS

Для Outlook и Google Calendar используйте ICS-ленты календарей.

Требования#

  • IncidentRelay должен быть доступен по HTTPS из календарного клиента.
  • У пользователя должен быть доступ хотя бы к одному календарю команды.
  • Пользователь должен создать персональный API-токен с областью calendar:read.
  • Пользователь должен использовать персональный API-токен в качестве пароля CalDAV.

Не используйте обычный пароль пользователя IncidentRelay для CalDAV.

Создание API-токена для CalDAV#

  • Откройте Profile.
  • Откройте вкладку API tokens.
  • Создайте новый токен.
  • Используйте понятное имя, например caldav-calendar.
  • Выберите область calendar:read.
  • Скопируйте сгенерированный токен.

Токен показывается только один раз. Если он потерян, отзовите его и создайте новый.

URL-адрес CalDAV#

Используйте базовый эндпоинт CalDAV:

https://incidentrelay.example.com/caldav/

Замените incidentrelay.example.com на имя хоста вашего IncidentRelay.

Не используйте прямой путь к календарю команды при настройке учётной записи в Apple Calendar. Apple Calendar должен обнаруживать календари через корневой эндпоинт CalDAV.

Apple Calendar на macOS#

Откройте Calendar → Add Account → Other CalDAV Account → Advanced.

Используйте следующие значения:

Account Type: Advanced
User Name: your IncidentRelay username or email
Password: personal API token with calendar:read
Server Address: incidentrelay.example.com
Server Path: /caldav/
Port: 443
Use SSL: enabled

Важно: поле Server Address должно содержать только имя хоста. Не включайте туда https://.

Правильно:

incidentrelay.example.com

Неправильно:

https://incidentrelay.example.com

Apple Calendar на iOS или iPadOS#

Откройте Settings → Calendar → Accounts → Add Account → Other → Add CalDAV Account.

Используйте:

Server: incidentrelay.example.com
User Name: your IncidentRelay username or email
Password: personal API token with calendar:read
Description: IncidentRelay

Если клиент запрашивает расширенные настройки, используйте:

Server Path: /caldav/
Port: 443
Use SSL: enabled

Thunderbird#

  • Откройте Calendar.
  • Выберите New Calendar.
  • Выберите On the Network.
  • Введите URL-адрес CalDAV:
https://incidentrelay.example.com/caldav/
  • Используйте имя пользователя или email IncidentRelay.
  • Используйте персональный API-токен в качестве пароля.
  • Выберите календари команд, на которые вы хотите подписаться.

DAVx5 на Android#

  • Добавьте новую учётную запись в DAVx5.
  • Выберите вход по URL и имени пользователя.
  • Используйте:
Base URL: https://incidentrelay.example.com/caldav/
User name: your IncidentRelay username or email
Password: personal API token with calendar:read
  • Выберите календари команд для синхронизации.

Поведение в режиме только для чтения#

Календари CalDAV в IncidentRelay доступны только для чтения.

Разрешённые операции:

OPTIONS
PROPFIND
REPORT
GET
HEAD
PROPPATCH as no-op for client-side calendar metadata

Отклоняемые операции:

PUT
DELETE
MKCALENDAR

Некоторые клиенты, особенно Apple Calendar, могут отправлять PROPPATCH для сохранения локальных свойств календаря, таких как цвет, отображаемое имя или порядок. IncidentRelay принимает эти запросы как no-op, чтобы обновление календаря в режиме только для чтения продолжало работать.

Устранение неполадок#

Ошибка аутентификации#

Проверьте, что:

  • имя пользователя — это имя пользователя или email IncidentRelay;
  • пароль — это персональный API-токен, а не пароль пользователя;
  • у токена есть область calendar:read;
  • токен не отозван и не истёк;
  • пользователь активен.

Аутентификацию можно проверить с помощью curl:

curl -i \
  -u 'user@example.com:PERSONAL_API_TOKEN' \
  -X PROPFIND \
  -H 'Depth: 0' \
  https://incidentrelay.example.com/caldav/

Успешный ответ должен быть 207 Multi-Status.

Apple Calendar сообщает «No calendar home was specified»#

Используйте корневой эндпоинт CalDAV в качестве пути сервера:

/caldav/

Не используйте прямой путь к команде при настройке учётной записи.

Apple Calendar сообщает, что доступ не разрешён#

Проверьте в логах сервера ответы на PROPPATCH или REPORT. Apple Calendar ожидает успешных ответов WebDAV для некоторых операций с метаданными, даже если сам календарь доступен только для чтения.

Ожидаемое поведение:

PROPPATCH /caldav/calendars/teams/<team_id>/ -> 207
REPORT    /caldav/calendars/teams/<team_id>/ -> 207

Вход выполнен, но календари не появляются#

Проверьте, что у пользователя есть доступ хотя бы к одной активной команде. Пользователю должно быть разрешено чтение календаря команды.

Также проверьте, что команда и её группа активны.

События не появляются#

Проверьте, что у команды есть ротации и будущие слоты дежурств. Команда без ротаций всё равно может быть обнаружена как пустой календарь.

Используйте curl для проверки домашнего каталога календарей:

curl -i \
  -u 'user@example.com:PERSONAL_API_TOKEN' \
  -X PROPFIND \
  -H 'Depth: 1' \
  https://incidentrelay.example.com/caldav/calendars/

Ответ должен содержать hrefs календарей, например:

/caldav/calendars/teams/1/

Заметки по безопасности#

  • CalDAV использует HTTP Basic Auth с персональным API-токеном.
  • Области calendar:read достаточно для синхронизации календаря.
  • Отзовите токен в разделе Profile, чтобы прекратить доступ по CalDAV.
  • Не логируйте заголовок Authorization.
  • Не публикуйте CalDAV по обычному HTTP в production.
  • CalDAV не позволяет пользователям редактировать расписания IncidentRelay из внешних календарных клиентов.