Перейти к основному содержимому

Календарь в Apple Calendar, Outlook и CalDAV

Актуально для: SimpleTwo 0.9.x · Проверено: 01.10.2026

Календарь платформы читается не только нашим приложением: подписанный Outlook обновляет подписку по своему расписанию, CalDAV-клиент опрашивает сервер сам. Именно поэтому служба календаря стоит рядом с чатом, а не внутри него, и именно поэтому у неё публичное имя.

Три способа подключить сторонний клиент, от простого к полному:

СпособЧто даётНаправлениеКому
ICS-подпискакалендарь виден в любом клиенте, понимающем webcal://только чтениеApple Calendar, Outlook, Google Calendar, экран в переговорной
CalDAVучётная запись календаря целиком: список календарей, события, свободно/заняточтение (запись — по мере готовности, см. ниже)Apple Calendar на macOS/iOS, Thunderbird, любой CalDAV-клиент
CardDAV — каталогкорпоративный каталог как адресная книгатолько чтениете же клиенты, отдельная настройка
CardDAV — ваши книгиличные адресные книги и книги команды, в той же учётной записи, что и CalDAVчтение и записьте же клиенты, та же учётная запись

1. ICS-подписка — самый короткий путь​

Подписка выдаётся на конкретный календарь и содержит секрет в самой ссылке. Секрет показывается один раз: ротация выдаёт новую ссылку и обесценивает прежнюю.

Получить ссылку:

curl -fsS -X POST "https://dir.<домен>/cal/v1/calendars/<id>/subscriptions" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"label":"Мой ноутбук"}'

В ответе две ссылки на один и тот же ресурс:

{
"calendar_id": "cal-…",
"url": "https://dir.<домен>/cal/v1/calendars/cal-…/subscribe.ics?key=…",
"webcal_url": "webcal://dir.<домен>/cal/v1/calendars/cal-…/subscribe.ics?key=…",
"note": "shown once — rotating replaces it"
}

Разница между ними практическая: https:// клиент скачает как файл, а webcal:// воспримет как подписку и будет обновлять. Apple Calendar и Outlook ждут именно второй.

Ссылка — это и есть доступ

В ней нет пароля и нет вашей сессии: кто получил ссылку, тот видит календарь. Поэтому выдавайте по одной на устройство с понятной меткой — так отзыв не ломает остальные, — и не кладите её в общий чат. Отозвать: DELETE /v1/credentials/{id}.

Apple Calendar (macOS). Файл → Новая подписка на календарь → вставить webcal://… → частота обновления 15 минут. Оповещения от подписки лучше выключить: они дублируют напоминания, которые уже приходят пушем в SimpleTwo Connect.

Apple Calendar (iOS). Настройки → Приложения → Календарь → Учётные записи → Добавить → Другое → Подписной календарь → вставить ссылку.

Outlook (новый и веб). Календарь → Добавить календарь → Подписаться из интернета → вставить https://…-вариант.

Экран в переговорной. У календаря-ресурса та же выдача возвращает ещё и адрес панели (now_url): панель на стене — не подписчик, она спрашивает «что здесь сейчас». Один секрет открывает и подписку, и панель.

2. CalDAV — учётная запись, а не один календарь​

CalDAV даёт клиенту всё сразу: список календарей, события, свободно/занято. Обнаружение работает штатно, поэтому в клиенте достаточно ввести имя сервера и учётные данные.

ЧтоЗначение
Серверdir.<домен>
Адрес обнаруженияhttps://dir.<домен>/.well-known/caldav
Кореньhttps://dir.<домен>/dav/
Пользовательваш логин в SimpleTwo
Парольпароль приложения из портала identity с областью «календари (CalDAV)» — см. ниже; сессионный токен и пароль домена здесь не подходят

Apple Calendar (macOS). Настройки → Учётные записи → добавить CalDAV → тип «Вручную» → имя пользователя, пароль приложения, сервер dir.<домен>.

Какой пароль вводить: пароль приложения identity​

Вход сторонних программ по протоколам — почта (JMAP, SMTP), календари (CalDAV), контакты (CardDAV) — один на всю платформу: пароль приложения, который человек сам создаёт в портале identity (раздел «Пароли приложений»). У каждого пароля свои области, по одной на протокол:

Область в порталеЧто открывает
«календари (CalDAV)», caldavкалендари и приглашения в службе календаря
«контакты (CardDAV)», carddavваши адресные книги в службе календаря и каталог организации
«чтение почты», jmap · «отправка почты», smtpпочту

Для телефона, где одна учётная запись CalDAV даёт и календари, и книги, отметьте обе области. Пароль показывается один раз, отзывается отдельно от остальных и не раскрывает ваш основной пароль. Неверные попытки считаются в блокировку учётной записи так же, как неверный пароль на странице входа, а каждый вход виден вам в «Последних входах» портала. Пароли приложений включает администратор организации в консоли, в разделе «Безопасность → Требования ко входу»; пока они выключены, пункта в портале нет.

Пароли устройств календаря и переключатель dav_auth. Раньше пароль для CalDAV выдавала сама служба календаря (POST /v1/credentials, «пароль устройства»). Переход на пароли приложений идёт в два шага, и порядок важен:

  1. Пока переключатель dav_auth у администратора в положении calendar (так по умолчанию), служба календаря принимает и старые пароли устройств, и пароли приложений identity. В это время каждый создаёт пароль приложения и заменяет им пароль в своих программах — ничего не ломается, обе схемы работают рядом.
  2. Администратор переводит dav_auth в identity (консоль координатора, PUT /admin/api/settings/dav-auth с {"mode":"identity"}). С этого момента CalDAV и CardDAV службы календаря принимают от людей только пароли приложений; пароль устройства получает отказ с объяснением, новые пароли устройств больше не выдаются (POST /v1/credentials отвечает 409). Переключатель не встанет в identity, пока identity не развёрнут или пароли приложений в нём выключены, и сам напоминает, что пароли нужно создать заранее. Вернуть calendar можно всегда — старые пароли устройств снова заработают.

Перенести старые пароли автоматически нельзя: служба хранит только их отпечатки. Подписки (ICS-ссылки из §1) и панели переговорных — не вход человека, переключатель их не касается.

Что умеет учётная запись CalDAV (с directory 0.71.0 — полный набор, который ждёт Apple Calendar на macOS и iOS):

ВозможностьКак работает
Календари, события, серии, исключениячтение и запись; sync-collection, calendar-query, calendar-multiget, free-busy-query
Приглашениясервер рассылает их сам (RFC 6638, calendar-auto-schedule): участник видит приглашение во входящих планирования и в своём календаре со статусом «не подтверждено»
Принять / отклонить / под вопросомответ уходит организатору; в его календаре у участника меняется статус
Отмена встречиорганизатор удаляет событие — участники получают уведомление, встреча у них показывается отменённой до подтверждения; удаление участником — выход из встречи, а не отмена
Предложить другое времяучастник переносит встречу в своём календаре — организатору уходит предложение (iTIP COUNTER), сама встреча не двигается; организатор принимает или отклоняет в клиенте SimpleTwo
Напоминаниябудильники (VALARM) хранятся у каждого участника свои и переживают правки организатора
Имя и цвет календарязадаются в свойствах календаря в клиенте (PROPPATCH)
Делегированиекалендари, выданные вам на чтение или запись, видны в учётной записи и перечислены как делегирование (calendar-proxy)
Адресные книгиCardDAV в той же учётной записи — см. §4
Поиск участниковполе «Приглашённые» ищет людей и переговорные по каталогу (principal-property-search), с той же областью видимости, что поиск в приложениях (с directory 0.72.0)
Внешние гостиучастник с адресом вне организации получает приглашение и отмену письмом из почтового ящика организатора — если у организатора есть почта (продукт Mail); без ящика письмо не уходит (с directory 0.72.0 и mail 0.89.0)
Непринятые отменыотменённая встреча, которую участник не открыл, уходит из его календаря сама через 30 дней
Задачисписки Apple Reminders (VTODO): список создаётся из клиента, задачи с датой, приоритетом, статусом и напоминаниями хранятся в той же службе (с directory 0.73.0)
Вложенияфайл, прикреплённый к встрече или задаче в клиенте, хранится в службе (до 25 МБ файл, до 100 МБ на запись) и доступен всем участникам по ссылке из записи; файлы лежат в объектном хранилище (роль s3 или своё хранилище организации, бакет simpletwo-calendar), зашифрованы, без него вложения выключены (с directory 0.73.0)

Чего нет: заметок (Apple Notes синхронизируются не по CalDAV, а по IMAP) и push-уведомлений: Apple Calendar принимает push только от серверов Apple, сторонний сервер его дать не может, поэтому клиент опрашивает сервер с интервалом из своих настроек (по умолчанию 15 минут, можно поставить минуту).

CalDAV по умолчанию выключен: это настройка организации, а не отдельного сервера. Включает администратор в консоли координатора: Настройки → карточка «CalDAV и CardDAV» → «Включить CalDAV». Каждый хост роли directory применяет её при следующем опросе (около минуты) и перезапускает службу; состояние видно в /cal/healthz роли как caldav.

Почему CalDAV, а не «просто наше приложение»

Потому что у половины сотрудников календарь уже открыт в другой программе, и просить их смотреть расписание в двух местах — верный способ получить расписание, которое никто не ведёт. Сервер отдаёт то же, что видит наш клиент, с теми же правами.

3. CardDAV — адресная книга организации​

Коллеги находятся в телефоне штатным поиском по контактам, включая набор номера: в той же учётной записи CardDAV, что и личные книги (§4), есть книга «Адресная книга организации». Отдельную учётную запись заводить не нужно.

ЧтоЗначение
Адрес обнаруженияhttps://dir.<домен>/.well-known/carddav
Книгаhttps://dir.<домен>/dav/addressbooks/<логин>/_organisation/
Пользователь и парольте же, что в §4

Кого в ней видно, решают политики адресной книги — то же правило, что для поиска в приложении SimpleTwo (Группы — «Глобальная адресная книга»). Гость, которому группа ограничила видимость, видит в телефоне ровно тех, кого видит в приложении. В книгу не попадают: те, кого человек знает только по переписке (в приложении они находятся по имени), отключённые учётки, боты, переговорки и сам человек. Учётку, скрытую из адресной книги, находят только по точному адресу — в этом списке её нет.

Книга только для чтения: это отражение каталога, и запись сотрудника исправляют там, где она заведена.

4. Личные и общие адресные книги — CardDAV рядом с календарями​

С 28.09.2026 адресные книги человека живут в службе календаря — так же, как в связке Active Directory и Exchange: каталог (сотрудники, группы и контакты организации) остаётся в службе идентификации, а то, что лежит «в ящике» у человека, — его книги и книги команды — у календаря. Поэтому одна учётная запись CalDAV в телефоне даёт и календари, и эти книги: адрес обнаружения и пользователь те же, что в §2, а у пароля приложения должна быть отмечена область «контакты (CardDAV)».

ЧтоЗначение
Адрес обнаруженияhttps://dir.<домен>/.well-known/carddav
Ваши книгиhttps://dir.<домен>/dav/addressbooks/<логин>/
Одна книгаhttps://dir.<домен>/dav/addressbooks/<владелец>/<id-книги>/
Пользователь и парольваш логин и пароль приложения identity с областью «контакты (CardDAV)»; до переключения dav_auth подходит и пароль устройства календаря

Что нужно знать:

  • Книга, которой с вами поделились, видна в списке рядом с вашими, по адресу её владельца. Писать в неё можно, если владелец дал доступ write; иначе клиент покажет её только для чтения.
  • Пароль приложения identity — это вы. С ним действуют ваши собственные права на книги и календари. Старый пароль устройства календаря ограничивает сверху: выданный на уровне full читает книги, но не пишет в них — даже в собственную; для записи нужен уровень write.
  • Книги, выданные группе, по CardDAV пока не видны: пароль называет человека, но не его группы. В приложении SimpleTwo такие книги видны.
  • Контакт — это указатель на человека. Карточка без адреса почты, телефона и логина (X-SIMPLETWO-USER) не сохраняется: сервер ответит отказом valid-address-data. Всё остальное, что пишет телефон — фото, несколько адресов, подписи полей, — хранится как есть и возвращается клиенту без потерь.
  • Новую книгу создают в приложении, а не в клиенте CardDAV: у книги должно быть имя и идентификатор, который выдаёт сервер.
  • Содержимое книг зашифровано на диске ключом, который служба календаря получает от координатора и держит только в памяти. /healthz службы показывает books_sealed.

Каталог (§3) и книга организации остаются там, где были: это объекты каталога, а не личные данные.

Что делать, когда не работает​

СимптомПричина
Клиент скачал один файл и больше не обновляетвзяли https://-ссылку вместо webcal://
Подписка пустаяу ссылки уровень доступа, при котором календарь виден без содержимого, либо в календаре действительно нет записей в окне подписки
CalDAV не логинится с рабочим паролемпароль домена здесь не подходит: нужен пароль приложения из портала identity, имя пользователя — логин
После переключения dav_auth телефон перестал синхронизироватьсястарый пароль устройства больше не принимается: создайте пароль приложения в портале identity и замените пароль в учётной записи — см. §2
Календари синхронизируются, а книги — нет (или наоборот)у пароля приложения не отмечена нужная область: «календари (CalDAV)» или «контакты (CardDAV)»
Отказ «учётная запись заблокирована до …»слишком много неверных попыток подряд; блокировка общая с входом в портал, дождитесь указанного времени
Событие, созданное в Apple Calendar, не появилось в SimpleTwoCalDAV в этой установке выключен — Настройки → «CalDAV и CardDAV», см. §2
Apple Calendar не предлагает «Принять/Отклонить» на приглашенииклиент не увидел calendar-auto-schedule: учётная запись создана до directory 0.71.0 — удалите и добавьте её заново
Перенёс чужую встречу в своём календаре, а у остальных она не сдвинуласьтак и задумано: перенос участником — предложение другого времени организатору, двигает встречу только организатор
Ссылка перестала работать после ротациитак и задумано: ротация обесценивает прежний секрет, выдайте новую подписку
Телефон не сохраняет контакт в книгув карточке нет ни почты, ни телефона, либо старый пароль устройства выдан без права записи, либо книгой с вами поделились только на чтение — см. §4
Книга, выданная группе, не видна в телефонетак сейчас устроено: по CardDAV видны книги, выданные лично вам — см. §4
Клиент не находит сервер по именине отвечает /.well-known/caldav: проверьте, что имя dir.<домен> заведено в DNS и у службы есть сертификат