MAATRIX / Блог / Как установить и настроить DAViCal на VPS

Как установить и настроить DAViCal на VPS

MAATRIX

Если Radicale вам маловат — нужны не личные календари на пару устройств, а инфраструктура для команды: общие календари отделов, переговорки как ресурсы, делегирование доступа секретарю — стоит присмотреться к DAViCal. Это старый, скучный в хорошем смысле CalDAV/CardDAV-сервер на PHP и PostgreSQL, который тянет свою реализацию с середины 2000-х и почти не менялся в архитектуре — а значит, всё, что могло сломаться, давно сломалось и было исправлено кем-то другим. Разберём установку с нуля: PostgreSQL, Apache, схему прав и общие календари.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое DAViCal и когда он лучше Radicale или Nextcloud

DAViCal — сервер, реализующий CalDAV и CardDAV поверх PHP-приложения с хранением всех данных в PostgreSQL: события, контакты, пользователи, права доступа — всё это строки в таблицах, а не файлы на диске. Для одного человека это скорее минус — лишняя СУБД ради пары календарей избыточна, и здесь честно выигрывает Radicale с его файловым хранилищем и минимальными зависимостями. Но для команды разница в другую сторону: в DAViCal из коробки есть модель ресурсов (переговорки, проекторы, служебные машины — тоже участники календаря, которых можно "пригласить" на встречу), группы пользователей, делегирование доступа (proxy-пользователи, которые видят и редактируют чужой календарь от своего имени) и тонкие ACL на уровне отдельной коллекции.

Второй ориентир — Nextcloud. Там CalDAV/CardDAV — это одна из функций большого веб-офиса с файлами, заметками и десятками приложений; полноценная установка Nextcloud тянет за собой Redis, PHP-FPM с десятком расширений и заметно больше памяти на старте. DAViCal — только сервер протокола, без веб-интерфейса для просмотра расписания глазами (администрирование через веб есть, полноценного календаря-клиента в браузере — нет). Если вам нужен именно бэкенд синхронизации для команды из 10-50 человек с ресурсами и правами, а не файлохранилище с календарём в довесок — DAViCal делает это узкое дело добротно и предсказуемо.

Минимальный VPS — 1 CPU, 1 ГБ RAM с запасом под PostgreSQL и Apache; для полусотни активных пользователей комфортнее 2 ГБ, PostgreSQL любит свободную память под кэш страниц.

Подготовка сервера: PostgreSQL, Apache, PHP

DAViCal написан на процедурном PHP и рассчитан на классическую связку Apache + mod_php + PostgreSQL — именно так его проще всего развернуть и поддерживать, без импровизаций с PHP-FPM за nginx. На Ubuntu 24.04 или Debian 12:

apt update
apt install -y postgresql apache2 libapache2-mod-php php-pgsql php-xml php-curl php-mbstring

Проверьте версию PHP:

php -v

Кодовая база DAViCal старая, писалась ещё под PHP 5-7, и на PHP 8.x иногда сыплет notice- и deprecated-предупреждениями в лог (не фатальными, но шумными). Это честный нюанс, а не повод отказываться от решения — работает стабильно, но в php.ini для продакшена стоит выставить display_errors = Off и error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE, чтобы предупреждения не просачивались в вывод страницы и не путали пользователей белым экраном там, где на самом деле всё отработало.

Убедитесь, что PostgreSQL поднялся:

systemctl enable --now postgresql
systemctl status postgresql

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка DAViCal и загрузка схемы в PostgreSQL

В репозиториях Debian и Ubuntu (universe) пакет davical обычно есть — это самый быстрый путь, дальше настройка через dbconfig-common:

apt install -y davical

Инсталлятор задаст стандартные вопросы dbconfig-common: настраивать ли базу автоматически (да), пароль для служебной роли davical_dba. Пакет сам создаст базу davical, накатит схему таблиц и заведёт роль приложения davical_app, от имени которой PHP будет ходить в БД в рантайме — она умышленно ограничена в правах и не видит роль davical_dba, которая используется только для миграций схемы.

Если в вашем дистрибутиве пакета нет (в самых новых релизах DAViCal иногда выпадает из репозитория) — ставьте из исходников с GitLab проекта:

apt install -y git postgresql-contrib
git clone https://gitlab.com/davical-project/awl.git /usr/share/awl
git clone https://gitlab.com/davical-project/davical.git /usr/share/davical

AWL (Andrew's Web Libraries) — это общий PHP-фреймворк, на котором построен DAViCal, ставится рядом отдельным репозиторием. Дальше в каталоге /usr/share/davical смотрите файл INSTALL — там для конкретной версии расписан порядок применения SQL-файлов из каталога dba/ (обычно это скрипт вида dba/create-database.sh, который накатывает схему по шагам) и шаблон конфига config.php.dist, который нужно скопировать в /etc/davical/config.php и заполнить под себя. Точные имена файлов чуть плавают от релиза к релизу, поэтому для установки из исходников INSTALL внутри самого репозитория — более надёжный источник истины, чем любая инструкция снаружи.

Дальше в статье используется путь через apt-пакет — он покрывает подавляющее большинство случаев и снимает ручную возню со схемой.

Конфигурация и Apache

Основной конфиг приложения — /etc/davical/config.php. Пакет уже прописал туда строку подключения к БД, вам нужно задать доменные настройки:

<?php
$c->sysabbr = 'DAViCal';
$c->system_name = 'DAViCal Calendar Server';
$c->admin_email = 'admin@example.com';
$c->domain_name = 'caldav.example.com';

domain_name используется DAViCal для построения ссылок на коллекции и должен совпадать с тем именем, по которому клиенты будут стучаться на сервер. Apache-конфиг пакет кладёт в /etc/apache2/conf-available/davical.conf с алиасом /davical на /usr/share/davical/htdocs — включите его и модуль rewrite, без которого не заработает построение URL коллекций:

a2enmod rewrite
a2enconf davical
systemctl reload apache2

Проверить, что приложение поднялось, можно локальным запросом:

curl -I http://127.0.0.1/davical/

Ожидаемый ответ — 200 или 302 на страницу логина, а не 500 или таймаут. Если Apache отдаёт 500, первым делом смотрите /var/log/apache2/error.log — почти всегда это либо не хватает PHP-расширения (обычно pgsql или xml), либо конфиг config.php не может достучаться до базы из-за неверного пароля роли davical_app.

Первый вход и создание пользователей

Открывайте http://ваш-домен/davical/ в браузере. Начальная схема БД создаёт единственную учётную запись — admin, пароль по умолчанию тоже admin. Первое, что нужно сделать после установки — зайти под этой парой и немедленно сменить пароль в разделе управления пользователями: до этого момента сервер, если он уже смотрит в интернет, фактически открыт для любого, кто знает дефолтную комбинацию.

Дальше через веб-интерфейс администратора (Admin → Users) заводите остальных пользователей команды — логин, email, пароль, и для каждого можно сразу указать тип принципала: обычный пользователь, группа или ресурс. Ресурс — это тот самый способ завести переговорку или проектор как участника календаря: заводите его как отдельного "пользователя" с типом ресурса, и дальше любой сотрудник может пригласить эту сущность на встречу через клиентское приложение, а DAViCal отследит занятость и покажет конфликт по времени.

Права доступа настраиваются на уровне коллекции (Admin → принципал → Calendars): можно выдать другому пользователю доступ на чтение, запись или полное администрирование конкретного календаря — это и есть механизм proxy-доступа, когда секретарь видит и правит календарь руководителя от своего логина, без общего пароля на аккаунт.

Общие календари, TLS и бэкап

Групповые (общие) календари создаются похожим образом — заводите принципала типа "группа", добавляете в неё нужных пользователей, и календарь этой группы становится видимым всем её участникам с правами, которые вы назначили. Это удобнее, чем раздавать доступ к личному календарю одного человека всей команде — права привязаны к группе, а не к конкретному сотруднику, и при увольнении достаточно убрать человека из группы.

Сертификат для домена получайте так же, как для любого сервиса за Apache — подробный разбор certbot и альтернатив есть в статье про certbot и acme.sh:

apt install -y certbot python3-certbot-apache
certbot --apache -d caldav.example.com

Certbot сам допишет виртуальный хост на 443 и настроит редирект с 80. После этого URL для клиентов — https://caldav.example.com/davical/caldav.php/username/calendarname/, а автообнаружение по .well-known/caldav и .well-known/carddav пакет DAViCal уже прописывает в свой Apache-конфиг, так что большинству клиентов (DAVx5, Thunderbird, встроенный CalDAV в macOS/iOS) достаточно указать домен и логин.

Бэкап здесь — это в первую очередь бэкап базы PostgreSQL, а не файлов на диске:

sudo -u postgres pg_dump davical | gzip > davical-backup-$(date +%F).sql.gz

Общий подход к настройке PostgreSQL, ролей и регулярных дампов на VPS подробно разобран в статье про установку PostgreSQL на Ubuntu — те же принципы cron-расписания и ротации архивов применимы и к базе DAViCal. Восстановление — создать пустую базу davical, накатить дамп через psql davical < davical-backup.sql, перезапустить Apache. Конфиг /etc/davical/config.php при этом отдельно бэкапить тоже стоит — в нём пароль роли davical_app и доменные настройки, без него после восстановления БД приложение не подключится к своим же данным.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем DAViCal принципиально отличается от Radicale, если оба умеют CalDAV?

Хранилищем и моделью прав. Radicale — файлы на диске и простая модель "каждый видит своё", DAViCal — PostgreSQL, группы, ресурсы (переговорки) и делегирование доступа между пользователями. Для одного-двух человек это оверинжиниринг, для команды с общими календарями — наоборот, нужный набор функций.

После установки открывается белая страница вместо логина — что не так?

Чаще всего не хватает PHP-расширения pgsql или xml, либо не включён модуль rewrite в Apache. Смотрите /var/log/apache2/error.log — там будет конкретная ошибка PHP, а не общее "500 Internal Server Error".

Нужно ли отдельно ставить AWL, если DAViCal поставился через apt?

Нет, пакет davical в Debian/Ubuntu тянет AWL как зависимость автоматически. Отдельно клонировать AWL с GitLab нужно только при установке из исходников, в обход пакетного менеджера.

Как сбросить пароль администратора, если он забыт?

Через PostgreSQL напрямую: подключитесь к базе davical под ролью davical_dba и обновите поле password в таблице usr для пользователя admin — DAViCal хранит пароль в виде хеша, поэтому проще временно создать нового пользователя с правами администратора через SQL-инсерт по образцу существующей записи, чем подбирать формат хеша вручную.

Можно ли подключить DAViCal к уже существующему кластеру PostgreSQL, где крутятся другие проекты?

Да, это обычная практика — база davical не требует выделенного инстанса PostgreSQL, важно только не смешивать роль davical_app с ролями других приложений, чтобы права не пересекались.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →