Twenty CRM
Twenty - open-source CRM на NestJS + React + PostgreSQL. Альтернатива Salesforce и HubSpot для команд 5-50 человек, которым важен контроль над данными и отсутствие подписки за место. Развернули релиз v2.14.0 через Docker Compose на Fatmetal Cloud Servers, сняли реальные показатели по памяти, диску и времени старта.
Вердикт
- командам 5-50 человек, уходящим с Salesforce/HubSpot
- кто хочет данные CRM на своем сервере
- соло без потребности в CRM
- кому нужна телефония/маркетинг из коробки
Проверено на версии v2.14.0, июнь 2026. На новых версиях результаты могут отличаться.
Что такое Twenty и какую задачу решает
Twenty - система управления отношениями с клиентами с открытым исходным кодом. Команда строит ее как ответ на две проблемы коммерческих CRM: данные клиентов заперты внутри платформы, а цена растет вместе с числом мест. Twenty устанавливается на собственный сервер, данные остаются в вашей PostgreSQL, а интерфейс собран в духе Notion, Airtable и Linear - таблицы, kanban, фильтры, кастомные объекты и поля.
Это инструмент для продуктовых команд, отделов продаж и фаундеров, которым нужна управляемая воронка, карточки компаний и контактов, и при этом неприемлема подписка за каждого пользователя или хранение базы клиентов у внешнего вендора. Из коробки есть кастомные объекты и поля, роли и права, простые workflow с триггерами и действиями, а также интеграция почты, календаря и файлов.
Чем отличается от Salesforce и HubSpot
Сравниваем по тому, что реально влияет на выбор self-hosted CRM, а не по длине списка фич. У коммерческих платформ шире готовая экосистема - это честно отмечаем в разделе «когда это не ваш выбор».
| Параметр | Twenty (self-hosted) | Salesforce / HubSpot |
|---|---|---|
| Модель цены | Бесплатно, платите за инфраструктуру (от ~500-1100 ₽/мес за VM) | Подписка за место в месяц, растет с числом пользователей |
| Где лежат данные | Ваша PostgreSQL на вашем сервере | Облако вендора |
| Vendor lock-in | Нет: открытый код, прямой доступ к БД, экспорт SQL | Экспорт ограничен форматами и тарифом |
| Кастомные объекты и поля | Есть, в UI | Есть (на старших тарифах) |
| Доступ к исходному коду | Да, AGPLv3 (часть файлов - Enterprise) | Нет |
| Готовая экосистема (телефония, маркетинг, AppExchange) | Беднее, проект молодой (v2.x) | Зрелая, широкая |
| Обслуживание | На вас: обновления, бэкапы, SSL | На вендоре |
Тех-стек и архитектура
Twenty - это TypeScript-монорепозиторий на Nx. Бэкенд написан на NestJS, использует PostgreSQL как основное хранилище, Redis для кеша и BullMQ для фоновых задач. Фронтенд - React (Jotai для стейта, Linaria для стилей, Lingui для локализации). В Docker Compose это раскладывается на четыре контейнера: server (API + отдача фронта), worker (фоновые задачи через BullMQ), db (postgres:16) и redis.
Сервер при первом старте сам прогоняет миграции БД и регистрирует фоновые задачи. Worker запускается отдельно и зависит от готовности сервера - это важная деталь для деплоя, к ней вернемся в разделе про подводные камни.
Минимальная конфигурация
Официальный минимум в документации Twenty - 2 GB RAM. На практике это впритык: только server и worker в простое на пустой базе уже забирают около 1,5 GB.
| Официальный минимум RAM | 2 GB |
| Реально в простое (4 контейнера, пустая БД) | ~1,5 GB |
| Рекомендуем на команду до 20 чел | CPU4-RAM8-DISK100 |
| Тариф Fatmetal | CPU4-RAM8-DISK100 - 1100 ₽/мес |
| Минимально-рабочий тариф | CPU2-RAM4-DISK50 - 500 ₽/мес |
| Место на диске под образы | ~2,6 GB |
Почему не 4 GB по умолчанию. На CPU2-RAM4-DISK50 (500 ₽/мес) Twenty поедет для небольшой команды и теста, но запас под нагрузку, файлы и бэкапы маленький. Тестировали на CPU4-RAM8-DISK100 (1100 ₽/мес) - там комфортно с заделом на рост.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес
Развертывание на Fatmetal через Docker Compose
Базовый путь - Cloud Server с Ubuntu 24.04 и приложением Docker из маркетплейса. Twenty в маркетплейсе Fatmetal нет, ставим официальным docker-compose.
-
Создать VM
Cloud Server, тариф CPU4-RAM8-DISK100, ОС Ubuntu 24.04 LTS, приложение Docker из маркетплейса. Docker и Compose ставятся через cloud-init при первом запуске.
-
Подготовить каталог и .env
mkdir ~/twenty && cd ~/twenty curl -o docker-compose.yml \ https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml curl -o .env \ https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/.env.example -
Сгенерировать секреты и задать переменные
Сгенерируйте
APP_SECRETи ключ шифрования, задайте пароль Postgres, закрепите версию образа и адрес доступа.# в .env APP_SECRET=$(openssl rand -base64 32) PG_DATABASE_PASSWORD=задайте_свой_пароль SERVER_URL=http://ВАШ_IP:3000 TAG=v2.14.0 -
Поднять стек
docker compose pull docker compose up -dСервер сам прогонит миграции при первом старте. Дождитесь статуса healthy у контейнера
server. -
Проверить
docker compose ps curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3000/healthz # ожидаем 200Интерфейс - на порту 3000, открывается и по
http://IP:3000. Для продакшена поставьте обратный прокси с TLS (часть функций требует защищенного контекста) - об этом в разделе про безопасность.
Что измерили после запуска
Цифры с тестового CPU4-RAM8-DISK100, Ubuntu 24.04, Docker CE 29.6.0, Compose v5.1.4. Состояние - свежая установка, пустая база, без нагрузки.
| Скачивание образов (docker compose pull) | ~51 c |
| Старт до healthy (с миграциями) | ~1 мин 50 c |
| RAM - worker | 877 MiB |
| RAM - server | 611 MiB |
| RAM - postgres | 41 MiB |
| RAM - redis | 7 MiB |
| RAM - весь стек в простое | ~1,5 GB |
| CPU в простое | <1% на контейнер, load avg ~0,5 |
| Образы на диске | twenty 1,85 GB · postgres 642 MB · redis 208 MB |
| Отклик /healthz (локально) | ~8-16 мс |
| Отклик извне (другая сеть) | ~190 мс (TTFB, с учетом сети) |
Главное по памяти: worker - самый тяжелый контейнер (877 MiB), тяжелее самого сервера. Это NestJS-процесс фоновых задач. При планировании RAM считайте именно его, а не только server.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске. Если на них не наступить, деплой проходит за один заход.
Docker недоступен сразу после старта VM. Приложение Docker из маркетплейса ставится через cloud-init, и еще 2-3 минуты после статуса «Running» команда docker отсутствует. Дождитесь завершения: cloud-init status должен вернуть done.
Тег образа ≠ git-тег. Образ публикуется на Docker Hub под конкретным тегом. Не угадывайте версию - закрепите в TAG ту, что реально существует на Docker Hub (например, v2.14.0), иначе получите not found при pull.
Worker остается в статусе Created. Контейнер worker ждет healthy-статуса сервера. Если up -d вернулся раньше, чем сервер стал healthy, worker может не подняться. Лечится повторным docker compose up -d после того, как server стал healthy.
Пустые секреты. Если не задать APP_SECRET и ключ шифрования в .env, Twenty стартует на небезопасных значениях по умолчанию и предупреждает в логах. Сгенерируйте их сразу и сохраните: потеря ключа шифрования = потеря доступа к секретам в базе.
Часть функций требует защищенного контекста. По документации Twenty, отдельные браузерные возможности (например, копирование в буфер обмена) работают только в защищенном контексте - это HTTPS либо localhost. Поэтому для нормальной работы открывайте приложение через localhost (SSH-туннель) или сразу поднимайте HTTPS, а не ходите по сырому http://IP.
Безопасность и обновления
По http приложение открывается и работает, но часть браузерных функций (например, копирование в буфер) по документации требует защищенного контекста - HTTPS либо localhost. Поэтому на проде ставьте обратный прокси с TLS. Минимальный рабочий вариант на Caddy:
# /etc/caddy/Caddyfile - Twenty за HTTPS
ваш-домен {
reverse_proxy 127.0.0.1:3001
}
Caddy сам получит сертификат Let's Encrypt для домена. Twenty при этом слушает локальный порт (например, 3001), наружу торчит только Caddy. В .env приведите SERVER_URL к публичному адресу: SERVER_URL=https://ваш-домен - он должен совпадать с тем, как пользователи открывают приложение.
Релизы и security-advisories отслеживайте в репозитории (watch → releases). Обновление - смена тега и пересборка:
# обновление до новой версии
cd ~/twenty
sed -i 's/^TAG=.*/TAG=НОВАЯ_ВЕРСИЯ/' .env
docker compose pull
docker compose up -d # миграции прогонятся автоматически
Перед обновлением снимайте дамп БД - откат сводится к восстановлению из дампа:
docker exec twenty-db-1 pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
Часть файлов проекта - под Enterprise-лицензией Twenty (помечены /* @license Enterprise */), остальное под AGPLv3. Для коммерческого использования enterprise-функций нужна подписка - это стоит учитывать, если планируете дорабатывать и распространять форк.
Связь с другими стеками
Что обычно ставят рядом с Twenty в продовом контуре.
- Обратный прокси с SSL - Caddy или Nginx Proxy Manager для HTTPS и корректного
SERVER_URL. - Бэкапы -
pg_dumpпо cron + выгрузка дампов в S3-совместимое хранилище. - Мониторинг - Grafana + Prometheus, чтобы держать под контролем память worker под нагрузкой.
- Почта и календарь - интеграция через Google / Microsoft OAuth для синхронизации писем и встреч.
- Объектное хранилище - S3-совместимый бакет под файлы и вложения вместо локального диска.
- Управление из AI-агента - есть открытый community-скилл twenty-crm-skill (MIT). Он дает AI-агенту (Claude Code, Cursor и другим по стандарту Agent Skills) читать и менять данные CRM - контакты, компании, сделки, задачи, заметки, кастомные объекты - прямо через REST API вашего Twenty. Под капотом генерирует CLI из OpenAPI-спеки воркспейса (
ocli) и работает на любом деплое, включая self-hosted. Пригодится, чтобы автоматизировать рутину по базе и подключить CRM к agent-воркфлоу.
Когда это НЕ ваш выбор
Нужен CRM «из коробки» без обслуживания инфраструктуры
Если в команде некому держать обновления, бэкапы и SSL - облачный SaaS или managed-вариант Twenty Cloud снимут эту нагрузку. Self-hosted означает, что эксплуатация на вас.
Нужна зрелая экосистема под маркетинг и телефонию
Twenty - молодой проект (v2.x). Готовые интеграции телефонии, маркетинг-автоматизации и маркетплейс приложений у Salesforce и HubSpot шире. Если воронка завязана на эту экосистему - Twenty пока не закроет ее целиком.
Планируете коммерческий форк enterprise-функций
Не весь код под AGPLv3: enterprise-файлы - под коммерческой лицензией. Для распространения доработок таких частей нужна подписка Twenty.
Частые вопросы
Можно поставить без Docker?
Можно из исходников (Node), но Docker Compose - основной и проверенный путь.
Хватит ли 2 GB RAM?
Нет, стек съедает ~1,5 GB - нужен тариф от 8 GB.
Можно в продакшен?
Да, после своих секретов, reverse-proxy с TLS и бэкапа Postgres.
Как обновлять?
Сменить тег образа и docker compose pull && up -d.
Как делать бэкап?
pg_dump базы Postgres + том данных.
Нужна ли авторизация?
Своя есть - регистрация и вход в воркспейс.
Ограничения лицензии?
AGPLv3.
Итог
Twenty v2.14.0 поднимается на Fatmetal Cloud Server за один заход: образы тянутся ~51 секунду, до рабочего состояния с миграциями - около двух минут. В простое стек забирает ~1,5 GB RAM, главный едок - worker. Для команды до 20 человек берем CPU4-RAM8-DISK100 за 1100 ₽/мес с запасом; минимально рабочий вариант - CPU2-RAM4-DISK50 за 500 ₽/мес. Это рабочая замена Salesforce/HubSpot там, где важны контроль над данными и отсутствие подписки за место.
Рекомендуемая конфигурация для установки:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe
Не хотите устанавливать вручную?
Запустите Twenty CRM на этой конфигурации автоматически - от 990 ₽/мес.
Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Если найдете баг в гайде - напишите, поправим в течение дня.