Cal.com на Ubuntu 24.04: пошаговая установка
Calendly удобен, пока не упираешься в лимиты бесплатного тарифа или не начинаешь думать, кому именно передаёшь данные о встречах и контактах клиентов. Cal.com — открытая альтернатива с тем же набором привычных функций: публичная страница бронирования, синхронизация с календарями, автоматические письма участникам. Разворачиваем её на своём сервере под Ubuntu 24.04 в Docker — от чистой системы до рабочего планировщика с HTTPS, отдельной базой и подключённым календарём.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Cal.com и зачем хостить самому
Cal.com — это открытый движок для бронирования встреч: страница вида cal.example.com/vashe-imya, на которой посетитель видит свободные слоты и выбирает удобное время, а система сама шлёт подтверждения, напоминания и создаёт события в календаре. Проект распространяется под лицензией AGPLv3, и это важный нюанс: базовый функционал бронирования, синхронизации календарей и уведомлений открыт и бесплатен при самостоятельном хостинге, а часть возможностей уровня Enterprise (SSO, инсайты команды и некоторые интеграции) требует платного ключа лицензии. Для личного использования или небольшой команды это ограничение обычно не мешает.
Самостоятельный хостинг Cal.com даёт то же самое, ради чего вообще уходят от облачных SaaS: данные о встречах и контактах остаются на вашем сервере, а не в стороннем облаке; нет ограничений бесплатного тарифа на число типов событий или интеграций; вы сами решаете, когда обновляться. Для пользователей из России добавляется практическая причина — свой сервер не зависит от того, принимает ли зарубежный SaaS карту российского банка. Проект собирает Next.js-приложение и требует базу данных, поэтому под него нужен сервер помощнее, чем под лёгкий бэкенд-сервис: комфортно работать на 2 ядрах и 4 ГБ памяти, а для сборки образа лучше иметь запас — 8 ГБ ощутимо снижают риск, что процесс сборки упадёт по нехватке памяти. У MAATRIX такой VPS на Ubuntu 24.04 оплачивается из России картой, по СБП, криптой или токеном MAAT, локацию можно взять под задачу — US ближе к зарубежным сервисам, RU или UK под остальные сценарии.
Шаг 1. Подготовка сервера
Обновите систему и сразу закройте периметр фаерволом — открытыми останутся только SSH и веб-порты:
apt update && apt upgrade -y
ufw allow 22/tcp && ufw allow 80,443/tcp && ufw enable
Заведите домен (или поддомен) и направьте его A-запись на IP сервера — он понадобится и для HTTPS-сертификата, и для корректных ссылок в письмах-приглашениях, которые Cal.com рассылает участникам встреч. Если домен и DNS настраиваете впервые, пошагово это разобрано в статье про настройку домена и DNS на Ubuntu 24.04. Проверьте, что запись распространилась, командой dig +short vash-domen.ru — она должна вернуть IP сервера.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверШаг 2. Docker и исходники Cal.com
Ставим Docker официальным скриптом — на Ubuntu 24.04 он отрабатывает без нареканий, подробности разобраны в отдельной статье про установку Docker с нуля:
curl -fsSL https://get.docker.com | sh
docker compose version
Cal.com — монорепозиторий на Next.js и Prisma, и «официального» готового образа на Docker Hub у проекта нет: контейнер собирается из исходников через docker compose build. Клонируйте репозиторий с Docker-обвязкой вместе с подмодулем самого приложения:
git clone --recursive https://github.com/calcom/docker.git cal-com
cd cal-com
Флаг --recursive обязателен — без него подмодуль с кодом Cal.com останется пустым, и сборка не найдёт исходники.
Шаг 3. Переменные окружения
Скопируйте образец конфигурации и откройте его на редактирование:
cp .env.example .env
nano .env
Ключевые переменные, которые нужно заполнить своими значениями:
DATABASE_URL=postgresql://calcom:StrongPassHere@database:5432/calendso
NEXTAUTH_SECRET=<сгенерированная строка>
CALENDSO_ENCRYPTION_KEY=<сгенерированная строка>
NEXT_PUBLIC_WEBAPP_URL=https://vash-domen.ru
NEXTAUTH_URL=https://vash-domen.ru
EMAIL_FROM=noreply@vash-domen.ru
EMAIL_SERVER_HOST=smtp.vash-provider.ru
EMAIL_SERVER_PORT=587
EMAIL_SERVER_USER=noreply@vash-domen.ru
EMAIL_SERVER_PASSWORD=<пароль-smtp>
NEXTAUTH_SECRET и CALENDSO_ENCRYPTION_KEY — это секреты для подписи сессий и шифрования данных подключённых интеграций (токены календарей и т. п.), генерируйте их отдельно и не переиспользуйте:
openssl rand -base64 32
Без корректного SMTP-блока Cal.com всё равно запустится, но письма с подтверждениями и напоминаниями участникам встреч уходить не будут — для рабочего инструмента это критично, так что настройте отправку сразу, а не «потом». База данных в этом примере — контейнер PostgreSQL из того же compose-файла; если предпочитаете вынести базу на отдельный сервер, ориентир по установке есть в статье про PostgreSQL на Ubuntu 24.04, а в DATABASE_URL тогда указывается адрес этого сервера вместо имени сервиса database.
Шаг 4. Сборка и запуск
В поставке репозитория уже есть docker-compose.yml с сервисом Cal.com и PostgreSQL. Порт наружу лучше не открывать напрямую — привяжите его к локальному адресу, доступ снаружи пойдёт через реверс-прокси на следующем шаге:
services:
database:
image: postgres:15
restart: always
environment:
POSTGRES_USER: calcom
POSTGRES_PASSWORD: StrongPassHere
POSTGRES_DB: calendso
volumes:
- cal_postgres:/var/lib/postgresql/data
calcom:
build:
context: ./calcom
restart: always
env_file: .env
depends_on:
- database
ports:
- "127.0.0.1:3000:3000"
volumes:
cal_postgres:
Запускайте сборку — она тяжелее, чем у большинства других self-hosted проектов, потому что Next.js-приложение компилируется прямо на сервере, и на слабом тарифе процесс может занять заметно больше времени, чем вы ожидаете:
docker compose build
docker compose up -d
docker compose logs -f calcom
При первом старте контейнер применяет миграции базы данных Prisma автоматически — в логах должны появиться записи о применённых миграциях, а следом сообщение, что сервер слушает порт 3000. Если сборка падает по памяти, временно добавьте своп-файл или возьмите тариф с большим объёмом ОЗУ хотя бы на время сборки — после неё требования к ресурсам заметно ниже.
Шаг 5. HTTPS через реверс-прокси
Выставлять Cal.com наружу без шифрования нельзя — через форму бронирования и письма проходят персональные данные участников встреч. Проще всего поставить перед контейнером Caddy — он сам получит и продлит сертификат, подробный разбор есть в статье про Caddy с автоматическим SSL. Минимальный конфиг:
vash-domen.ru {
reverse_proxy 127.0.0.1:3000
}
Если используете Nginx — принцип тот же: серверный блок с доменом, проксирование на локальный порт 3000, сертификат от certbot. После установки прокси наружу торчит только 443-й порт, а само приложение остаётся видимым исключительно с локального адреса сервера.
Шаг 6. Первый вход и подключение календаря
Откройте домен в браузере, когда сертификат выпустился и DNS распространился. Cal.com предложит зарегистрировать первую учётную запись — она автоматически станет админской в этом инстансе. Задайте надёжный пароль: это единственная преграда между интернетом и данными о ваших встречах.
После входа настройте тип события (Event Type) — длительность, буфер между встречами, вопросы для гостя перед бронированием — и подключите внешний календарь, чтобы Cal.com видел занятость и не предлагал пересекающиеся слоты. Для синхронизации с Google Calendar нужен собственный OAuth-клиент в Google Cloud Console (тип приложения — веб, redirect URI указывает на ваш домен) — его данные прописываются в переменную GOOGLE_API_CREDENTIALS, после чего в интерфейсе Cal.com появляется кнопка подключения аккаунта Google. Календари через CalDAV (например, из другого почтового провайдера) подключаются без дополнительной настройки OAuth, прямо из интерфейса логином и паролем приложения.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Cal.com действительно бесплатен при самостоятельном хостинге?
Базовая функциональность — бронирования, синхронизация календарей, письма-уведомления — открыта под AGPLv3 и бесплатна. Часть функций уровня Enterprise (SSO, аналитика команды, некоторые интеграции) требует платного ключа лицензии.
Сколько ресурсов реально нужно?
Для работы после сборки достаточно 2 ядер и 4 ГБ памяти. Саму сборку образа комфортнее проводить с запасом памяти — на слабом тарифе она может упасть по нехватке ОЗУ, тогда помогает временный своп-файл.
Можно ли поставить без Docker, из исходников напрямую?
Да, у проекта есть путь через Yarn-монорепозиторий (yarn install, миграции Prisma, yarn build, yarn start), но он требует ручного управления версией Node.js и процесс-менеджером. Docker избавляет от этой возни и упрощает обновления.
Как обновлять инстанс?
Обновите подмодуль с исходниками кода (git submodule update --remote), пересоберите образ и пересоздайте контейнер: docker compose build && docker compose up -d. Перед крупным обновлением стоит сделать дамп базы данных на всякий случай.
Как настроить резервное копирование?
Регулярно снимайте дамп PostgreSQL (pg_dump) и уносите копию за пределы сервера. В базе хранится вся конфигурация — типы событий, интеграции, история бронирований, — а исходный код при необходимости всегда можно склонировать заново.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →