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

Radicale на Ubuntu 24.04: пошаговая установка

MAATRIX

Если вам нужен свой сервер календарей и контактов, а разворачивать ради этого Nextcloud с его MySQL, Redis и десятком служебных процессов не хочется — Radicale закрывает вопрос за 15 минут. Это один Python-процесс без базы данных: календари и адресные книги хранятся прямо в файлах на диске. Ниже — рабочая установка на чистом Ubuntu 24.04 с HTTPS и подключением реальных клиентов: телефона, Apple Calendar и Thunderbird.

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

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

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

Когда Radicale — то, что нужно

Radicale — это CalDAV/CardDAV сервер, то есть протокольная совместимость с любым клиентом, который умеет синхронизировать календари и контакты: DAVx5 на Android, встроенные Calendar/Contacts на iOS и macOS, Thunderbird, Evolution, Outlook через коннекторы. Он не пытается быть заменой Google Calendar с веб-интерфейсом и шарингом на десятки людей — это личный или семейный сервер на несколько пользователей, которым важно не отдавать данные календаря сторонним сервисам.

Главные плюсы для VPS: минимум зависимостей (только Python 3), хранение в файлах — бэкап это tar каталога, а не дамп базы, и скромное потребление ресурсов — процесс спокойно живёт на сервере с 512 МБ RAM вместе с другими сервисами. Минус тоже нужно понимать честно: нет веб-морды для управления событиями глазами, всё делается через CalDAV-клиенты, а встроенная авторизация рассчитана на десятки пользователей, а не на сотни — это персональный инструмент, не корпоративный портал.

Если вы уже держите на сервере Nextcloud и вам просто нужен ещё один календарь — модуль Nextcloud Calendar решит задачу без установки отдельного сервиса. Radicale имеет смысл именно тогда, когда полноценный Nextcloud — избыточен, а нужен только CalDAV/CardDAV.

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

Возьмите чистый Ubuntu 24.04 (арендовать можно и на маленьком тарифе — 1 vCPU и 512 МБ–1 ГБ RAM для Radicale с запасом). Обновите систему и поставьте базовые пакеты:

apt update && apt upgrade -y
apt install -y python3 python3-venv python3-pip apache2-utils

Пакет apache2-utils нужен ради утилиты htpasswd — ей будем создавать пользователей с хешированными паролями. Если сервер новый, до этого шага стоит сразу закрыть периметр — вынести SSH на ключи и включить firewall, это делается один раз и потом не отвлекает: подробный разбор в статье про настройку UFW на Ubuntu 24.04.

Создайте отдельного системного пользователя — Radicale не должен работать от root:

useradd --system --home-dir /var/lib/radicale --create-home --shell /usr/sbin/nologin radicale

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

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

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

Установка Radicale в venv

Ставить Radicale через apt не стоит — в репозиториях Ubuntu часто лежит устаревшая версия. Правильный путь — изолированное виртуальное окружение и pip:

python3 -m venv /opt/radicale/venv
/opt/radicale/venv/bin/pip install --upgrade pip
/opt/radicale/venv/bin/pip install radicale

Проверьте, что бинарник появился и запускается:

/opt/radicale/venv/bin/radicale --version

Создайте каталоги для конфигурации и данных с правильным владельцем:

mkdir -p /etc/radicale /var/lib/radicale/collections
chown -R radicale:radicale /var/lib/radicale
chmod 700 /var/lib/radicale/collections

Каталог collections — это и есть всё хранилище: у каждого пользователя внутри будет своя папка с календарями и адресными книгами в формате iCalendar/vCard. Права 700 важны — там лежат личные данные пользователей.

Пользователи и аутентификация

Radicale поддерживает несколько схем авторизации, но для одиночного сервера проще всего htpasswd-файл с bcrypt-хешами. Создайте файл и первого пользователя:

htpasswd -B -c /etc/radicale/users alice

Флаг -c создаёт файл заново — используйте его только для первого пользователя, для остальных без -c:

htpasswd -B /etc/radicale/users bob

Проверьте владельца и права:

chown radicale:radicale /etc/radicale/users
chmod 640 /etc/radicale/users

Пароли лучше генерировать сразу длинные и случайные (openssl rand -base64 18) — это не веб-форма с подсказками сложности, а прямой доступ к личным данным по протоколу, который легко перебирать без rate-limit на уровне самого Radicale.

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

Создайте основной конфиг /etc/radicale/config:

[server]
hosts = 127.0.0.1:5232
max_connections = 20
max_content_length = 100000000
timeout = 30

[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt

[storage]
filesystem_folder = /var/lib/radicale/collections

[rights]
type = owner_only

[logging]
level = warning

Ключевые моменты:

  • hosts = 127.0.0.1:5232 — Radicale слушает только локально, наружу его отдаёт reverse proxy с HTTPS. Открывать 5232 порт напрямую в интернет не стоит: протокол CalDAV гоняет Basic Auth, и без TLS пароль будет уходить в открытом виде.
  • rights = owner_only — стандартная модель: каждый пользователь видит и правит только свои календари и контакты по пути вида /username/calendar-name/. Для семейного шаринга календарей есть более гибкий тип прав from_file с отдельным rights-файлом, но для старта owner_only — самый предсказуемый вариант.
  • max_content_length ограничивает размер загружаемых объектов — полезно, если кто-то будет пытаться закинуть в календарь вложение весом с фильм.

Systemd-сервис и запуск

Опишите юнит /etc/systemd/system/radicale.service:

[Unit]
Description=Radicale CalDAV/CardDAV server
After=network.target

[Service]
Type=simple
User=radicale
Group=radicale
ExecStart=/opt/radicale/venv/bin/radicale --config /etc/radicale/config
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Включите и запустите:

systemctl daemon-reload
systemctl enable --now radicale
systemctl status radicale

Быстрая проверка, что сервис слушает локально:

curl -u alice: http://127.0.0.1:5232/

Curl спросит пароль — введите тот, что задавали через htpasswd. В ответ должен прийти HTML-заглушка Radicale с базовой информацией, а не ошибка соединения.

HTTPS через reverse proxy

Без HTTPS CalDAV-клиенты либо откажутся подключаться, либо будут гонять логин и пароль в открытом виде — этот шаг не опциональный. Заведите поддомен (например, cal.example.com), направьте A-запись на IP сервера и поставьте nginx с Let's Encrypt по общей схеме — этот процесс подробно разобран в статье про nginx как reverse proxy на Ubuntu 24.04; если предпочитаете автоматический SSL без отдельной возни с certbot, вариант проще — Caddy с авто-SSL.

Конфиг nginx для Radicale выглядит так:

server {
    listen 80;
    server_name cal.example.com;
    location / { return 301 https://$host$request_uri; }
}

server {
    listen 443 ssl http2;
    server_name cal.example.com;

    ssl_certificate     /etc/letsencrypt/live/cal.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cal.example.com/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:5232/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Script-Name "";
    }
}

client_max_body_size в nginx должен быть не меньше, чем max_content_length в конфиге Radicale, иначе большие вложения будут отбрасываться прокси раньше, чем дойдут до самого сервиса. Получить сертификат стандартно через certbot:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d cal.example.com

Подключение клиентов

Итоговый URL для подключения — https://cal.example.com/, логин и пароль — те, что задавали через htpasswd.

Android (DAVx5). Установите приложение, добавьте аккаунт «Вход через URL и учётные данные», в поле Base URL укажите https://cal.example.com/, ниже — логин и пароль. DAVx5 сам обнаружит и календари, и адресную книгу пользователя и предложит синхронизировать их с системным приложением «Календарь».

iOS / macOS. Настройки → Календарь (или Контакты) → Учётные записи → Добавить учётную запись → Другое → Учётная запись CalDAV (или CardDAV). Сервер: cal.example.com, порт 443, обязательно включён SSL, логин и пароль — стандартные.

Thunderbird. Встроенная поддержка CalDAV есть в разделе «Календарь»: новый календарь → «В сети» → адрес https://cal.example.com/alice/имя-календаря/. Точный путь к конкретному календарю Radicale показывает в веб-интерфейсе на корневом URL после логина — там перечислены все коллекции пользователя со ссылками.

При первом подключении у нового пользователя календарей ещё нет — большинство клиентов (DAVx5, Apple Calendar) предложат создать календарь и адресную книгу автоматически при первой синхронизации.

Бэкап и обслуживание

Всё хранилище Radicale — это один каталог, поэтому бэкап тривиален:

tar -czf radicale-backup-$(date +%F).tar.gz -C /var/lib/radicale collections

Добавьте эту команду в cron или, если на сервере уже настроен единый бэкап-механизм для нескольких сервисов, включите каталог /var/lib/radicale/collections в общий скрипт. Восстановление — обратная операция: распаковать архив на место, выставить владельца radicale:radicale и перезапустить сервис.

Обновление Radicale — переустановка пакета в venv:

/opt/radicale/venv/bin/pip install --upgrade radicale
systemctl restart radicale

Формат хранения между минорными версиями 3.x стабилен, но перед серьёзным обновлением бэкап каталога collections — хорошая привычка, а не паранойя.

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

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

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

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

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

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

Radicale подходит для команды из 20+ человек?

Технически выдержит, но встроенная модель прав и htpasswd-аутентификация рассчитаны на небольшие группы. Для команды с общими календарями и гибким шарингом удобнее модуль Calendar в Nextcloud — сравнение подходов есть в статье про установку Nextcloud на Ubuntu 24.04.

Можно расшарить календарь между несколькими пользователями?

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

Что будет, если сервер упадёт во время записи события?

Radicale пишет каждую коллекцию атомарно (временный файл + переименование), так что частичной записи одного события на диске не бывает. Риск — только для событий, которые клиент не успел отправить до сбоя, а это уже вопрос синхронизации на стороне клиента, а не сервера.

Нужен ли отдельный DNS для CalDAV, если домен уже используется под сайт?

Нет, можно повесить Radicale на поддомен того же домена или даже на путь вида example.com/dav/, прописав X-Script-Name в nginx — но отдельный поддомен читается проще и меньше путает клиентские приложения при автообнаружении.

Как понять, что синхронизация вообще работает?

Проще всего создать тестовое событие через клиент и посмотреть, появился ли файл .ics в соответствующей папке внутри /var/lib/radicale/collections/ — если файл на месте, серверная часть отработала, и проблему стоит искать в конкретном клиенте.

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

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

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