DAViCal на Ubuntu 24.04: пошаговая установка
Если команде нужен общий календарь с переговорками, делегированием доступа между сотрудниками и нормальной моделью прав — а Radicale для этого слишком прост, а разворачивать целый Nextcloud ради одного модуля не хочется — DAViCal закрывает именно эту нишу. Это старый проект, PHP плюс PostgreSQL, без модного интерфейса, зато с моделью пользователей и ресурсов, которая проектировалась под офисный CalDAV с самого начала. Ниже — рабочая установка на чистом Ubuntu 24.04: пакет из репозитория, база данных, HTTPS и подключение реальных клиентов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Когда DAViCal — то, что нужно
DAViCal — это CalDAV/CardDAV сервер на PHP с хранением в PostgreSQL, который в Debian и Ubuntu живёт как обычный apt-пакет уже больше пятнадцати лет. По сравнению с Radicale у него принципиально другая модель прав: помимо обычных пользователей есть ресурсы (переговорки, проектор, служебный автомобиль) как отдельный тип принципала, и есть полноценные гранты — можно дать конкретному коллеге доступ на чтение или запись к чужому календарю, не заводя общий логин на всех. Для команды из 10–50 человек, которой нужны общие и делегированные календари, это ровно тот функционал, ради которого в Radicale пришлось бы городить костыли.
Честно о минусах: веб-интерфейс визуально не менялся много лет и выглядит как админка десятых годов — это чисто рабочий инструмент, не то, что приятно показывать клиентам. Активная разработка новых фич давно остановилась, проект живёт в режиме поддержки и багфиксов. Но именно поэтому протокольная часть обкатана предельно — DAViCal ставили тысячи админов на самых разных версиях Debian/Ubuntu, и он один из немногих CalDAV-серверов с честной поддержкой LDAP-авторизации из коробки. Если нужен просто личный календарь на одного-двух человек — берите Radicale, он проще на порядок. Если корпоративный портал целиком — Nextcloud с модулем Calendar. DAViCal — золотая середина именно для командного CalDAV без лишнего веса.
Подготовка сервера
DAViCal тяжелее Radicale: помимо PHP-процесса под Apache здесь ещё и полноценный PostgreSQL. Для команды до полусотни человек с запасом хватит 1–2 vCPU и 2 ГБ RAM — меньше тоже заработает, но PostgreSQL любит свободную память под кэш, и с 1 ГБ сервер будет постоянно упираться в диск при активной синхронизации нескольких клиентов одновременно.
Возьмите чистый Ubuntu 24.04, обновите систему и задайте hostname под будущий домен:
apt update && apt upgrade -y
hostnamectl set-hostname cal.example.com
Если сервер новый, до установки сервисов стоит сразу закрыть периметр — вынести SSH на ключи и включить firewall, чтобы потом не отвлекаться на это отдельно: подробности в статье про настройку UFW на Ubuntu 24.04. Домен или поддомен для сервера должен указывать A-записью на IP сервера ещё до выпуска сертификата — заведите её сейчас, DNS обычно применяется быстрее, чем вы дойдёте до шага с HTTPS.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка DAViCal через apt
В отличие от Radicale, DAViCal ставится прямо из репозитория Ubuntu — отдельный пакет собирает вокруг себя PostgreSQL, Apache, PHP с модулем pgsql и библиотеку AWL (Apache Web Libraries — PHP-фреймворк, на котором написан сам DAViCal):
apt install -y davical
В процессе установки debconf несколько раз спросит про базу данных: настраивать ли PostgreSQL автоматически через dbconfig-common (отвечайте «да»), и generate ли пароль для служебной роли davical_app — соглашайтесь на автогенерацию, руками эти пароли потом не нужны. На последнем шаге, при первой инициализации базы, установщик один раз выведет в консоль пароль пользователя admin — это единственный момент, когда он показывается в явном виде, сохраните его сразу (менеджер паролей или временный текстовый файл, который потом удалите).
Для автоматизированных раскладок без интерактивных вопросов используйте debconf-set-selections перед установкой — так пакет пройдёт без единого prompt'а:
echo "davical davical/pgsql/app-pass password $(openssl rand -base64 24)" | debconf-set-selections
echo "davical davical/dbconfig-install boolean true" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive apt install -y davical
Apache, база данных и первый вход
Пакет сам создаёт конфиг /etc/davical/davical.conf.php с параметрами подключения к базе и секретным ключом сессий, а также кладёт файл /etc/apache2/conf-available/davical.conf. Обычно он включается автоматически, но если после установки сайт не открывается — включите вручную и перезапустите Apache:
a2enconf davical
systemctl restart apache2
По умолчанию DAViCal доступен по адресу вашего сервера как http://IP-сервера/ (или /davical/, в зависимости от того, как настроен ServerName в Apache) — на этом этапе достаточно HTTP, HTTPS настроим отдельным шагом. Откройте адрес в браузере и войдите как admin с паролем, который вывела установка. Первым делом — смените пароль: вкладка «Users» → строка admin → «Edit Calendar Administrator».
Если пароль из установки потерян (консоль прокрутилась, лог не сохранили), пока он не был изменён через веб-интерфейс, его можно прочитать напрямую из базы — DAViCal хранит первичный пароль читаемым до первой смены через UI:
sudo -u postgres psql davical -c "select username, password from usr;"
Если и это не помогает или пароль уже захеширован, задайте новый напрямую SQL-командой — префикс ** указывает DAViCal перехешировать значение при следующем входе:
sudo -u postgres psql davical -c "UPDATE usr SET password = '**NewStrongPass123' WHERE username = 'admin';"
HTTPS и подключение клиентов
CalDAV гоняет Basic Auth, поэтому без TLS логин и пароль каждого пользователя будут уходить в открытом виде — сертификат обязателен, а не опционален. Если DAViCal — единственный сервис на сервере, проще всего повесить SSL прямо на Apache через certbot:
apt install -y certbot python3-certbot-apache
certbot --apache -d cal.example.com
Если на сервере уже есть nginx, обслуживающий другие сайты на 80/443, разумнее развести порты: перевести Apache на локальный порт (например, Listen 127.0.0.1:8080 в /etc/apache2/ports.conf) и проксировать через nginx, у которого уже настроен TLS — сравнение certbot и альтернативных ACME-клиентов для такой схемы разобрано в статье certbot или acme.sh — что выбрать для сервера. Проксирующий блок nginx выглядит стандартно:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
Итоговый CalDAV-адрес для клиента строится по шаблону https://cal.example.com/caldav.php/username/calendar-name/ — точный путь к конкретному календарю каждого пользователя показывается в веб-интерфейсе DAViCal после входа, на вкладке с его коллекциями. На Android заведите аккаунт в DAVx5, укажите этот URL и логин/пароль — приложение само обнаружит все доступные календари и адресные книги пользователя. На iOS/macOS: Настройки → Календарь → Учётные записи → Добавить → Другое → Учётная запись CalDAV, сервер cal.example.com, порт 443, SSL включён. В Thunderbird — новый календарь → «В сети» → тот же полный URL до конкретной коллекции.
Пользователи, ресурсы и общие календари
Здесь DAViCal отрабатывает свою основную задачу. Создание пользователя: «Users» → «Add User», указываете логин, email, пароль — это обычный принципал с личным календарём и адресной книгой по умолчанию.
Ресурсы (переговорки, проектор, служебная машина) заводятся так же, через «Users» → «Add User», но с галочкой «Resource» вместо обычного пользователя — DAViCal трактует их как принципалов без интерактивного входа, к чьему календарю дают доступ на бронирование остальным сотрудникам. Любой пользователь с правом записи в календарь ресурса создаёт там событие — это и есть бронирование переговорки.
Делегированный доступ настраивается через вкладку «Grants» у конкретного пользователя: выбираете, кому и какой уровень прав выдать — только чтение, чтение и запись, или полное администрирование чужого календаря. Это закрывает типичный кейс «ассистент ведёт календарь руководителя» без передачи логина и пароля — то, что в Radicale потребовало бы отдельного файла с правилами from_file и было бы куда менее прозрачно для самих пользователей.
Бэкап и обновление
Всё состояние DAViCal — это одна база PostgreSQL, бэкап которой обычной командой pg_dump покрывает и календари, и контакты, и пользователей целиком:
sudo -u postgres pg_dump -Fc davical > /var/backups/davical-$(date +%F).dump
Общий подход к автоматизации бэкапов баз данных на сервере, включая ротацию и проверку восстановления, разобран в статье про резервное копирование БД. Отдельно сохраните и /etc/davical/davical.conf.php — без него дамп базы бесполезен, конфиг содержит ключ сессий и параметры подключения.
Важный нюанс, который стоит знать заранее: обычное обновление через apt upgrade само прогоняет скрипт миграции схемы базы при необходимости, и проблем не возникает. А вот при ручном восстановлении дампа — например, при переносе на новый сервер или тестовом восстановлении бэкапа — схема базы может оказаться старше версии установленного пакета, и запись новых событий начнёт падать с ошибкой PostgreSQL вроде column "dtstart_orig" of relation "calendar_item" does not exist, при этом чтение календарей через CalDAV продолжает работать как ни в чём не бывало, что сбивает с толку при диагностике. Лечится это одной командой сразу после восстановления дампа:
/usr/share/davical/dba/update-davical-database
Она сравнивает версию схемы в базе с версией установленного пакета и докатывает недостающие миграции. Возьмите за привычку запускать её после любого ручного восстановления — это тот случай, когда лишняя команда стоит на порядок дешевле часа диагностики «почему события не сохраняются».
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
DAViCal вообще ещё развивается, или это мёртвый проект?
Новых фич давно не появляется, но багфиксы и обновления под актуальные версии Debian/Ubuntu выходят регулярно — пакет собирается и работает под Ubuntu 24.04 без плясок с бубном. Для стабильного CalDAV-сервера это скорее плюс: протокол за десять с лишним лет обкатан до предела.
В чём принципиальная разница с Radicale для команды из 15 человек?
Radicale хранит всё в файлах и не умеет делегированный доступ и ресурсы из коробки — это личный инструмент. DAViCal на PostgreSQL даёт полноценную модель прав, общие переговорки и гранты между пользователями — то, что реально нужно офису, а не одному человеку.
Нужна ли интеграция с LDAP/Active Directory?
Не обязательно — DAViCal прекрасно работает с собственной таблицей пользователей в PostgreSQL. LDAP-аутентификация поддерживается и настраивается в davical.conf.php, но для команды до полусотни человек локальные учётки обычно проще в поддержке, чем синхронизация с внешним каталогом.
Что делать, если забыл пароль администратора?
Пока пароль не менялся через веб-интерфейс, его можно прочитать напрямую из таблицы usr в базе. Если уже захеширован — задайте новый через SQL с префиксом **, как показано выше, DAViCal перехеширует его при следующем входе.
Можно перенести существующие календари из Google Calendar или Outlook?
Да, через экспорт в .ics из исходного сервиса и импорт файла на нужный календарь пользователя через веб-интерфейс DAViCal — прямой миграции «в одну кнопку» нет, но для разового переноса ручной импорт занимает пару минут на календарь.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →