Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Обновлено 10 сентября 2026 г.
CRM и продажи

Twenty CRM

Twenty - open-source CRM на NestJS + React + PostgreSQL. Альтернатива Salesforce и HubSpot для команд 5-50 человек, которым важен контроль над данными и отсутствие подписки за место. Развернули релиз v2.14.0 через Docker Compose на Fatmetal Cloud Servers, сняли реальные показатели по памяти, диску и времени старта.

Июнь 2026 ~9 минут чтения Fatmetal Team
CRM · Self-hosted SaaS Лицензия: AGPLv3 (+ Enterprise-файлы) Статус: запущен у нас, v2.14.0

Вердикт

Подходит
  • командам 5-50 человек, уходящим с Salesforce/HubSpot
  • кто хочет данные CRM на своем сервере
Не подходит
  • соло без потребности в CRM
  • кому нужна телефония/маркетинг из коробки
Мин. тариф: CPU4-RAM8-DISK100 Рекомендуем: CPU4-RAM8-DISK100 Сложность: medium Время запуска: pull ~51 c Главный риск: аппетит по RAM (~1,5 GB), нужен reverse-proxy Прод-готовность: секреты, TLS, бэкап Postgres

Проверено на версии v2.14.0, июнь 2026. На новых версиях результаты могут отличаться.

Что это

Что такое Twenty и какую задачу решает

Twenty - система управления отношениями с клиентами с открытым исходным кодом. Команда строит ее как ответ на две проблемы коммерческих CRM: данные клиентов заперты внутри платформы, а цена растет вместе с числом мест. Twenty устанавливается на собственный сервер, данные остаются в вашей PostgreSQL, а интерфейс собран в духе Notion, Airtable и Linear - таблицы, kanban, фильтры, кастомные объекты и поля.

Это инструмент для продуктовых команд, отделов продаж и фаундеров, которым нужна управляемая воронка, карточки компаний и контактов, и при этом неприемлема подписка за каждого пользователя или хранение базы клиентов у внешнего вендора. Из коробки есть кастомные объекты и поля, роли и права, простые workflow с триггерами и действиями, а также интеграция почты, календаря и файлов.

TypeScriptNestJSReactPostgreSQL 16RedisBullMQDocker Compose
Сравнение

Чем отличается от 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.

Официальный минимум RAM2 GB
Реально в простое (4 контейнера, пустая БД)~1,5 GB
Рекомендуем на команду до 20 челCPU4-RAM8-DISK100
Тариф FatmetalCPU4-RAM8-DISK100 - 1100 ₽/мес
Минимально-рабочий тарифCPU2-RAM4-DISK50 - 500 ₽/мес
Место на диске под образы~2,6 GB
i

Почему не 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.

  1. Создать VM

    Cloud Server, тариф CPU4-RAM8-DISK100, ОС Ubuntu 24.04 LTS, приложение Docker из маркетплейса. Docker и Compose ставятся через cloud-init при первом запуске.

  2. Подготовить каталог и .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
  3. Сгенерировать секреты и задать переменные

    Сгенерируйте APP_SECRET и ключ шифрования, задайте пароль Postgres, закрепите версию образа и адрес доступа.

    # в .env
    APP_SECRET=$(openssl rand -base64 32)
    PG_DATABASE_PASSWORD=задайте_свой_пароль
    SERVER_URL=http://ВАШ_IP:3000
    TAG=v2.14.0
  4. Поднять стек

    docker compose pull
    docker compose up -d

    Сервер сам прогонит миграции при первом старте. Дождитесь статуса healthy у контейнера server.

  5. Проверить

    docker compose ps
    curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3000/healthz   # ожидаем 200

    Интерфейс - на порту 3000, открывается и по http://IP:3000. Для продакшена поставьте обратный прокси с TLS (часть функций требует защищенного контекста) - об этом в разделе про безопасность.

http://ваш-домен:3000/objects/companies
Twenty CRM - список Companies на развернутом инстансе
Реальный экземпляр Twenty v2.14.0, развернутый на Fatmetal Cloud Server: раздел Companies, русский интерфейс, тестовые данные.
http://ваш-домен:3000/objects/opportunities
Twenty CRM - сделки Opportunities
Opportunities на том же инстансе: сделки с суммами, связями на компании и контакты.
Замеры

Что измерили после запуска

Цифры с тестового 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 - worker877 MiB
RAM - server611 MiB
RAM - postgres41 MiB
RAM - redis7 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, с учетом сети)
i

Главное по памяти: 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.

FAQ

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

Можно поставить без 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 ₽/мес.

Запустить Twenty CRM →
Анонсы новых разборов в Telegram-канале Новые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Если найдете баг в гайде - напишите, поправим в течение дня.

Спросить инженера в TelegramМы на связи