Radicale на Ubuntu 24.04: пошаговая установка
Если вам нужен свой сервер календарей и контактов, а разворачивать ради этого 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →