MAATRIX / Блог / Baïkal на Ubuntu 24.04: пошаговая установка

Baïkal на Ubuntu 24.04: пошаговая установка

MAATRIX

Если Google Calendar и Google Contacts синхронизируют ваши встречи и телефонную книгу через американские дата-центры, а вы хотите держать эти данные у себя — Baïkal решает задачу за час на самом скромном VPS. Это лёгкий CalDAV/CardDAV сервер с веб-панелью администрирования, который не тянет за собой Nextcloud целиком и работает даже на 1 ГБ памяти. Ниже — установка с нуля: PHP, Nginx, база данных, SSL и подключение календарей и контактов с телефона и компьютера.

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

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

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

Что такое Baïkal и кому он подходит

Baïkal — это PHP-приложение поверх библиотеки sabre/dav, которое реализует протоколы CalDAV (календари) и CardDAV (контакты) плюс отдаёт их через веб-интерфейс администратора: создание пользователей, книг контактов, календарей, общий доступ по ссылке для приглашения на события.

Главное отличие от Nextcloud — Baïkal делает ровно одну вещь и не тащит файловое хранилище, офисные редакторы и десятки приложений. Это плюс для VPS с ограниченными ресурсами и минус, если вам нужна ещё и синхронизация файлов — тогда придётся ставить два продукта отдельно или смотреть в сторону Nextcloud с модулями календаря и контактов.

СценарийЧто выбрать
Только календарь и контакты, минимум ресурсовBaïkal
Календарь, контакты и файлы в одном местеNextcloud
Максимально простой сервер без веб-панели, YAML-конфигRadicale
Нужна интеграция с Exchange/Outlook на уровне организациикоммерческие решения (не тема этой статьи)

Если вы уже сравнивали варианты полегче, у нас есть отдельный разбор установки Radicale на Ubuntu 24.04 — он ещё компактнее Baïkal, но без веб-панели администрирования, только конфиг-файлы.

Baïkal умеет хранить данные в SQLite (файл на диске, ничего дополнительно ставить не нужно) или в MySQL/MariaDB (нужен отдельный сервер БД, но выше надёжность при параллельной записи и проще делать резервные копии стандартными средствами). Для одного-двух пользователей и десятка устройств SQLite более чем достаточен; если планируете десятки аккаунтов или интеграцию с другими сервисами — берите MariaDB сразу, миграция базы задним числом не тривиальна.

Подготовка сервера

Понадобится VPS с Ubuntu 24.04, публичным IP и доменом (или поддоменом), указывающим на этот IP — CalDAV/CardDAV клиенты по спецификации требуют HTTPS, без валидного сертификата часть приложений (особенно на iOS) откажется подключаться.

Обновите систему и поставьте базовые пакеты:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl unzip ca-certificates

Проверьте, что часовой пояс сервера выставлен корректно — Baïkal использует системное время для расчёта повторяющихся событий и напоминаний:

sudo timedatectl set-timezone Europe/Moscow
timedatectl

Замените Europe/Moscow на нужный пояс — список доступных смотрите через timedatectl list-timezones.

Если сервер только что арендован и вы ещё не закрыли доступ по паролю, сделайте это перед тем, как открывать сервис наружу — инструкция по SSH-ключам вместо пароля на Ubuntu 24.04 займёт пять минут и закроет самый частый вектор атаки на свежий VPS.

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

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

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

Установка PHP, Nginx и MariaDB

Baïkal требует PHP 8.1+ с рядом расширений. В репозиториях Ubuntu 24.04 по умолчанию идёт PHP 8.3 — этого достаточно, отдельный PPA не нужен.

sudo apt install -y nginx php8.3-fpm php8.3-common php8.3-curl \
  php8.3-sqlite3 php8.3-mysql php8.3-xml php8.3-mbstring \
  php8.3-dom php8.3-intl php8.3-ldap

Пакет php8.3-sqlite3 ставим в любом случае — даже если основной бэкенд будет MariaDB, SQLite пригодится для быстрого теста установки. Если решили работать через MySQL/MariaDB, поставьте сервер БД:

sudo apt install -y mariadb-server
sudo mysql_secure_installation

Создайте базу и пользователя для Baïkal:

sudo mysql -u root -p
CREATE DATABASE baikal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'baikal'@'localhost' IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СВОЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON baikal.* TO 'baikal'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Если раньше не работали с MariaDB — подробный разбор установки и типовых настроек есть в статье «Как установить и настроить MariaDB на VPS», там же список частых проблем при первом запуске.

Проверьте, что PHP-FPM стартовал:

sudo systemctl status php8.3-fpm --no-pager

Установка Baïkal

Официальный способ — скачать релиз-архив с GitHub, а не клонировать репозиторий целиком (в тарболе уже собраны зависимости через Composer, отдельно ничего дособирать не нужно). Чтобы не хардкодить версию, которая устареет через пару месяцев, возьмите ссылку на последний релиз через GitHub API:

cd /tmp
BAIKAL_URL=$(curl -s https://api.github.com/repos/sabre-io/Baikal/releases/latest \
  | grep "browser_download_url.*zip" | cut -d '"' -f4)
echo "$BAIKAL_URL"
curl -L -o baikal.zip "$BAIKAL_URL"

Если по какой-то причине команда не нашла ссылку (GitHub периодически меняет формат ответа API), зайдите на страницу релизов проекта sabre-io/Baikal в браузере и скопируйте ссылку на baikal-x.y.z.zip вручную.

Распакуйте в /var/www:

sudo unzip baikal.zip -d /var/www/
sudo mv /var/www/baikal-* /var/www/baikal
sudo chown -R www-data:www-data /var/www/baikal

Baïkal хранит конфигурацию и (в случае SQLite) саму базу в каталоге Specific/ — именно на него нужны права записи от имени www-data:

sudo chmod -R 750 /var/www/baikal
sudo find /var/www/baikal/Specific -type d -exec chmod 770 {} \;

Nginx, HTTPS и права доступа

Создайте виртуальный хост. Ключевой момент — правило переписывания URL для путей /dav.php и /.well-known/: без него CalDAV/CardDAV-клиенты, которые автообнаруживают сервер по /.well-known/caldav, не найдут точку входа.

# /etc/nginx/sites-available/baikal.conf
server {
    listen 80;
    server_name dav.example.com;
    root /var/www/baikal/html;
    index index.php;

    location = /.well-known/caldav {
        return 301 /dav.php;
    }
    location = /.well-known/carddav {
        return 301 /dav.php;
    }

    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;
    }

    location ~ /(\.ht|Core|Specific/db|config) {
        deny all;
    }

    client_max_body_size 32M;
}

Замените dav.example.com на ваш реальный поддомен и включите сайт:

sudo ln -s /etc/nginx/sites-available/baikal.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Если раньше не настраивали Nginx как реверс-прокси или обратный веб-сервер под похожие сценарии — общая логика конфигурации разобрана в статье «Nginx как реверс-прокси на Ubuntu 24.04».

Теперь выпустите сертификат Let's Encrypt через certbot:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d dav.example.com

Certbot сам пропишет listen 443 ssl и редирект с 80 на 443. Подробности про автопродление и типичные ошибки — в статье «Как установить и настроить Let's Encrypt SSL на VPS».

Не забудьте про фаервол — откройте только нужные порты:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

Первый запуск и настройка через веб-панель

Откройте в браузере https://dav.example.com/admin/ — Baïkal запустит мастер первичной настройки:

  1. Administrator password — задайте пароль для входа в панель (не путайте с паролями пользователей CalDAV/CardDAV, они отдельные).
  2. Timezone — выберите пояс сервера ещё раз на уровне приложения.
  3. Database — выбор между SQLite и MySQL. Для SQLite ничего дополнительно вводить не нужно, файл базы создастся автоматически в Specific/db/. Для MySQL укажите хост localhost, имя базы baikal, пользователя и пароль, которые вы создавали на шаге установки MariaDB.

После завершения мастера файл Specific/config.php создастся и заблокирует повторный запуск установки — это ожидаемое поведение, а не баг: так Baïkal защищает уже настроенный сервер от случайного сброса.

Дальше зайдите в саму панель /admin/ под администратором и создайте:

  • пользователя (Users → +) с логином и паролем, которые будут использоваться в CalDAV/CardDAV клиентах;
  • книгу контактов (Address Books) — привяжите её к пользователю;
  • один или несколько календарей (Calendars) — цвет и название видны в клиентах.

URL для подключения формируются автоматически и показаны прямо в панели, обычно это:

Календарь:  https://dav.example.com/dav.php/calendars/USERNAME/CALENDAR_ID/
Контакты:   https://dav.example.com/dav.php/addressbooks/USERNAME/CALENDAR_ID/

Подключение календарей и контактов с устройств

iOS/iPadOS: Настройки → Календарь (или Контакты) → Учётные записи → Добавить учётную запись → Другая → Учётная запись CalDAV/CardDAV. Сервер — ваш домен без https://, логин и пароль — те, что создали в панели. Благодаря /.well-known/ редиректу iOS сама найдёт нужный путь, вручную указывать /dav.php/... не придётся.

Android: встроенной поддержки CalDAV/CardDAV нет — нужен клиент DAVx5 (open source, есть в F-Droid и Google Play). При добавлении аккаунта выберите «Вход по URL и паролю с логином» и укажите базовый адрес https://dav.example.com/dav.php/.

Thunderbird: календарь подключается через встроенный модуль (File → New → Calendar → On the Network, тип CalDAV, тот же URL из панели). Контакты — через дополнение CardBook, устанавливается отдельно из каталога дополнений.

Linux (Evolution, GNOME Calendar): оба поддерживают CalDAV/CardDAV из коробки, добавление аккаунта — те же URL и логин.

После первой синхронизации рекомендую сразу настроить резервное копирование: для SQLite достаточно копировать файл Specific/db/db.sq3 и каталог config/, для MySQL — обычный mysqldump по расписанию через cron. Данные календарей и контактов маленькие по объёму, но именно их обычно не бэкапят, полагаясь на «оно же в облаке», а Baïkal — уже не облако, это ваш сервер, и его надо бэкапить самостоятельно.

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

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

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

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

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

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

Можно ли перейти с SQLite на MySQL позже, если пользователей станет больше?

Штатного экспортёра для этого нет. Практический путь — вручную создать пользователей и книги в MySQL-инсталляции заново и импортировать события/контакты через клиент (например, экспорт .ics/.vcf из старой книги и импорт в новую), а не переносить файл базы напрямую.

Baïkal поддерживает несколько доменов/учётных записей на одном сервере?

Да, панель админа позволяет создавать сколько угодно пользователей, у каждого — свои календари и книги контактов, независимые друг от друга.

Нужен ли отдельный SMTP для приглашений на события?

Нет, Baïkal не рассылает email-приглашения сам — это делает клиент (Thunderbird, Apple Calendar и т.д.) через собственные настройки почты, сервер только хранит события.

Что делать, если iOS не может подключиться, а браузер панель открывает нормально?

Чаще всего дело в сертификате — проверьте sudo certbot certificates, убедитесь что сертификат валиден для нужного домена, и что HTTP (порт 80) не заблокирован фаерволом — certbot и ACME-challenge при продлении используют именно его.

Насколько Baïkal нагружает VPS?

Для личного использования и небольшой команды нагрузка минимальна — это лёгкое PHP-приложение без фоновых процессов, конкретные цифры зависят от количества клиентов и частоты синхронизации, поэтому ориентируйтесь на свой профиль использования, а не на усреднённые цифры из интернета.

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

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

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