Как установить и настроить Baïkal на VPS
Google Calendar и iCloud удобны, пока не встаёт вопрос «а где физически лежат мои встречи и контакты» или пока аккаунт не начинает капризничать с двухфакторкой на рабочем телефоне. Baïkal решает это просто: лёгкий CalDAV/CardDAV-сервер с веб-панелью, который синхронизирует календари и адресные книги между телефоном, ноутбуком и почтовым клиентом — и всё это на вашем собственном VPS, без чужих серверов между вами и вашими данными.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Baïkal и кому он подойдёт
Baïkal — открытый сервер CalDAV (календари) и CardDAV (контакты), построенный поверх библиотеки sabre/dav. Он не претендует на замену Nextcloud: нет файлового хранилища, заметок, канбана — только календари и контакты, зато быстро ставится, почти не требует ресурсов и не просит непрерывного внимания.
Есть смысл выбрать Baïkal, если:
- нужна только синхронизация календарей/контактов, а остальной функционал Nextcloud избыточен;
- сервер слабый (1 vCPU / 1 ГБ RAM хватает с запасом);
- важна простая веб-панель администратора без консоли для рутинных задач — завести пользователя, посмотреть календари.
Если параллельно нужны файлы, заметки и совместное редактирование документов, разумнее сразу смотреть в сторону Nextcloud — там CalDAV/CardDAV тоже есть, но ценой куда более тяжёлого стека. Baïkal — вариант «только календарь и контакты, и чтобы работало без сюрпризов».
Что понадобится перед установкой
- VPS с Ubuntu 24.04, минимум 1 vCPU и 1 ГБ RAM — для личного использования и небольшой команды этого достаточно с запасом;
- доменное имя или поддомен (например,
dav.example.com), направленный A-записью на IP сервера — без домена не получить нормальный SSL, а без SSL мобильные клиенты синхронизацию просто не примут; - root или sudo-доступ по SSH;
- 10–15 минут свободного времени.
Базу данных для Baïkal можно выбрать между SQLite (файл, ничего дополнительно настраивать не нужно) и MySQL/MariaDB. Для личного использования и небольших команд SQLite хватает за глаза — файл базы весит считаные мегабайты даже при сотнях событий. MariaDB имеет смысл, если календарей и пользователей много и хочется штатных бэкапов через mysqldump.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстанавливаем nginx, PHP и зависимости
Обновляем систему и ставим nginx с PHP-FPM и нужными модулями PHP:
apt update && apt upgrade -y
apt install -y nginx php-fpm php-cli php-curl php-dom php-mbstring \
php-xml php-sqlite3 unzip curl
Если решили использовать MariaDB вместо SQLite, дополнительно:
apt install -y mariadb-server php-mysql
mysql_secure_installation
и создаём базу с пользователем:
CREATE DATABASE baikal CHARACTER SET utf8mb4;
CREATE USER 'baikal'@'localhost' IDENTIFIED BY 'сильный_пароль';
GRANT ALL PRIVILEGES ON baikal.* TO 'baikal'@'localhost';
FLUSH PRIVILEGES;
Проверяем, какая версия PHP встала и под каким сокетом слушает php-fpm — пригодится для конфига nginx:
php -v
ls /run/php/
Обычно это что-то вроде /run/php/php8.3-fpm.sock на свежей Ubuntu 24.04.
Разворачиваем Baïkal и настраиваем права
Скачиваем актуальный релиз с официального GitHub-репозитория sabre-io/Baikal (на странице релизов всегда видно последнюю стабильную версию — на момент написания это ветка 0.9.x, но лучше свериться перед установкой):
mkdir -p /var/www/baikal
cd /tmp
curl -L -o baikal.zip https://github.com/sabre-io/Baikal/releases/latest/download/baikal-vX.Y.Z.zip
unzip baikal.zip -d /var/www/baikal
Если у релиза другое имя архива — проще склонировать репозиторий с нужным тегом:
cd /var/www
git clone https://github.com/sabre-io/Baikal.git baikal
cd baikal
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
git submodule update --init --recursive
Структура каталога после распаковки:
/var/www/baikal/
├── html/ ← это webroot, сюда смотрит nginx
├── Core/
├── vendor/
├── config/ ← конфиг подключения к БД
├── Specific/ ← настройки, созданные веб-инсталлятором
└── ...
Отдаём права веб-серверу на каталоги, куда Baïkal должен писать:
chown -R www-data:www-data /var/www/baikal
chmod -R 750 /var/www/baikal
chmod -R 770 /var/www/baikal/config /var/www/baikal/Specific
Каталог html остаётся точкой входа для nginx — всё остальное (Core, vendor, config, Specific) физически лежит вне публичного webroot, что снижает риск, если в конфиге nginx где-то ошибка.
Настраиваем nginx, PHP-FPM и SSL
Создаём конфиг сайта:
nano /etc/nginx/sites-available/baikal
server {
listen 80;
server_name dav.example.com;
root /var/www/baikal/html;
index index.php;
client_max_body_size 32M;
rewrite ^/.well-known/caldav /dav.php redirect;
rewrite ^/.well-known/carddav /dav.php redirect;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 120;
}
location ~ /\.(?!well-known) {
deny all;
}
}
Активируем сайт и проверяем синтаксис:
ln -s /etc/nginx/sites-available/baikal /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Дальше выпускаем SSL-сертификат — без него мобильные CalDAV/CardDAV-клиенты откажутся подключаться. Проще всего через certbot, подробный разбор шагов есть в статье про Let's Encrypt на VPS, если конфиг nginx уже похож на приведённый выше — certbot допишет блок listen 443 и редирект с 80-го порта сам:
apt install -y certbot python3-certbot-nginx
certbot --nginx -d dav.example.com
Общую логику работы nginx как обратного прокси и типичные грабли с конфигом стоит держать под рукой — они пригодятся не только для Baïkal, разбор есть в статье про nginx как reverse proxy.
Веб-установка, подключение клиентов и бэкап
Открываем https://dav.example.com/admin/ — запустится мастер первоначальной настройки. На первом шаге выбираем часовой пояс и придумываем пароль администратора, на втором — тип хранилища:
- SQLite — Baïkal сам создаст файл базы в
Specific/db/db.sqlite, ничего вводить не нужно; - MySQL/MariaDB — указываем хост
localhost, имя базыbaikal, пользователя и пароль, которые создавали на шаге установки зависимостей.
После завершения мастера заходим в /admin/ под созданным логином, создаём пользователей (Users and resources → Add user) и для каждого — календарь и/или адресную книгу.
Адреса для подключения клиентов формируются автоматически благодаря .well-known-редиректам из конфига nginx, так что в большинстве приложений достаточно указать сам домен:
| Клиент | Что вводить |
|---|---|
| iOS/macOS (Календарь, Контакты) | https://dav.example.com/ + логин/пароль пользователя |
| Thunderbird (TbSync/CardBook) | https://dav.example.com/dav.php/principals/ИМЯ_ПОЛЬЗОВАТЕЛЯ/ |
| Android (DAVx5) | https://dav.example.com/ — приложение само найдёт календари и книги через автообнаружение |
Если автообнаружение по какой-то причине не срабатывает (бывает на старых версиях клиентов), используйте прямые пути: календари — /dav.php/calendars/ИМЯ_ПОЛЬЗОВАТЕЛЯ/, адресные книги — /dav.php/addressbooks/ИМЯ_ПОЛЬЗОВАТЕЛЯ/.
Бэкап при SQLite — это просто копия трёх вещей: файла Specific/db/db.sqlite, каталога Specific/config (там хранятся настройки, применённые через веб-панель) и каталога config/ (данные подключения к БД). Для MariaDB добавляется регулярный дамп:
mysqldump -u baikal -p baikal > /root/backups/baikal-$(date +%F).sql
Общие практики по бэкапам и частым ошибкам при работе с MySQL/MariaDB на сервере разобраны отдельно, если решили пойти по этому пути — см. установку MariaDB на VPS. Файрвол на сервере с Baïkal стоит настроить так же, как и на любом другом веб-сервере — открыт только 80/443 порт наружу, остальное закрыто; шаги есть в статье про настройку ufw на VPS.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Чем Baïkal отличается от DAViCal и Radicale?
Radicale проще и работает вообще без веб-панели (конфиг только в файлах), DAViCal тяжелее и требует PostgreSQL. Baïkal — золотая середина: есть удобная веб-панель для администрирования пользователей, при этом минимум зависимостей и вес, сравнимый с Radicale.
Можно ли перенести календари с Google Calendar в Baïkal?
Да, через экспорт .ics из Google Calendar и импорт того же файла в веб-панели Baïkal (раздел календаря → Import), либо просто добавив оба аккаунта в один клиент (например, Thunderbird) и перетащив события между календарями.
Что делать, если клиент пишет ошибку 401 или не видит календарь после установки?
Чаще всего проблема в правах на Specific/ и config/ — проверьте, что владелец www-data, и что в консоли браузера при заходе на /admin/ нет ошибок PHP. Второй частый случай — забытый rewrite для .well-known в конфиге nginx, без него автообнаружение не срабатывает.
Нужен ли отдельный сервер под Baïkal, или можно на том же VPS, где уже крутится сайт?
Можно на том же — Baïkal почти не грузит CPU и RAM. Главное — не завести конфликт по 80/443 портам между nginx-блоками разных сайтов, для этого и нужен отдельный server_name.
Как перенести Baïkal на новый сервер?
Скопировать целиком каталог /var/www/baikal (включая Specific/ и config/) и, если использовалась MariaDB, дамп базы. На новом сервере — те же права chown/chmod, тот же nginx-конфиг, новый SSL-сертификат под новый IP.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →