EspoCRM
Open source CRM на своем сервере, которая не считает деньги по головам: лиды, сделки, воронка, почта, кампании и клиентский портал в бесплатном AGPL-ядре. Версия 10.0.8 на Fatmetal Cloud Server: четыре контейнера, ~207 MB RAM в простое - и расчет своей CRM на VPS против подписки за каждого сотрудника.
Вердикт
- командам на 5-50 человек, у которых счет за Битрикс24 / amoCRM растет с каждым сотрудником
- тем, кому по 152-ФЗ клиентская база и почта должны лежать на своем сервере
- тем, кому нужен каркас: свои сущности, поля и связи из админки плюс REST API без квот
- если отчеты и BPM нужны бесплатно и сразу - это платный Advanced Pack
- если от CRM ждут «все в одном» как у Битрикс24: задачи, чаты, телефония, сайты
- если некому обслуживать четыре контейнера и патчи несколько раз в месяц
Что это и какую задачу решает
EspoCRM - CRM с открытым кодом, которую с 2014 года ведет одноименная компания. Ядро закрывает контур продаж: лиды, контакты, компании, сделки с воронкой и канбаном, задачи, звонки, календарь.
Там же почта с привязкой писем к записям, обращения в поддержку, клиентский портал, база знаний, кампании с рассылками и web-to-lead формы. Все под AGPL-3.0, без лимита на пользователей и записи.
Вторая сторона продукта - конструктор: сущности, поля, связи и формы создаются из админки без кода. По сути это коробочная CRM, только без лицензии за коробку.
Сценарий: заменить подписку за каждого сотрудника у Битрикс24, amoCRM или облака вендора на фиксированную сумму за VPS - и увидеть, что при этом теряется.
Своя CRM на VPS против подписки за пользователя
Разница не в тарифе, а в форме счета: линейно по числу людей или фиксированно за сервер.
У облачных CRM цена растет со штатом: amoCRM и облако EspoCRM берут за пользователя, Битрикс24 - пакетами с потолком по сотрудникам. Рублевые цены Битрикс24 и amoCRM меняются часто, здесь не приводятся.
| Параметр | EspoCRM на своем VPS | Облако EspoCRM | Битрикс24 / amoCRM |
|---|---|---|---|
| Модель цены | фиксированно за сервер, пользователи не ограничены | €12.90 / €22 / €59 за пользователя в месяц, минимум 3 / 5 / 10 | пакет на компанию с лимитом / за пользователя |
| Порог входа | CPU2-RAM4-DISK50 - 500 руб/мес | от €38.70/мес (Basic, 3 пользователя) | бесплатный тариф с урезанными лимитами |
| Где данные и почта | на вашем сервере в РФ | площадки вендора в США и Германии | облако вендора |
| Отчеты, BPM, счета | платные паки вендора | все расширения включены | в составе тарифа |
| Кто обновляет и бэкапит | вы | вендор | вендор |
Расчет на 10 и 25 сотрудников
Облако EspoCRM на 10 пользователях - €129/мес на Basic и €220/мес на Enterprise. На 25 пользователях Enterprise - €550/мес, около €6600 в год.
Salesforce на той же десятке (Core, $195 за пользователя) - $1950/мес. Self-host ставит против этого один сервер: CPU2-RAM4-DISK50 за 500 руб/мес закрывает и 3, и 30 пользователей.
Где расчет неполный. В облаке включены все расширения, в ядре нет отчетов, BPM и счетов. Если они нужны, к VPS добавляется покупка паков (цены вендор отдает только через корзину) и труд администратора: обновления, бэкапы, TLS, почта.
Что бесплатно, а за что вендор просит денег
Фичелист на сайте описывает облако со всеми расширениями. Чистый образ дает меньше.
Модель EspoCRM - open core, и граница проходит ближе к ядру, чем у многих OSS-вендоров. У Битрикс24 и amoCRM отчеты и автоматизация входят в тариф, здесь продаются отдельно.
Компания, выбравшая продукт по списку с сайта и поставившая образ с Docker Hub, получит меньше, чем ожидала. Это риск закупки, а не техники.
| Блок | В AGPL-ядре (бесплатно) | Платное расширение |
|---|---|---|
| Продажи | лиды, контакты, компании, сделки, воронка, канбан | - |
| Активности | задачи, звонки, встречи, календарь, напоминания | Meeting Scheduler |
| Почта и маркетинг | ящики IMAP/SMTP, кампании, рассылки, web-to-lead | интеграции MailChimp, Google, Outlook |
| Поддержка | обращения, клиентский портал, база знаний | VoIP |
| Отчеты и автоматизация | только дашлеты и формулы в полях | Advanced Pack: отчеты, BPM (BPMN 2.0), workflow |
| Товары и деньги | нет | Sales Pack: товары, прайс-листы, счета, заказы, склад |
| Проекты | нет | Project Management: проекты, вехи, Gantt |
| Конструктор | сущности, поля, связи, layout-ы, формулы, роли, REST API | - |
| AI | нет | Intelligence |
Права на код у вендора (контрибьюторы подписывают CLA), фонда нет: ничто не мешает перенести функцию из ядра в пак. Облако в США и Германии - оплата паков из РФ может быть затруднена, выясняйте до покупки.
Тех-стек: четыре контейнера, а не один
Бэкенд - PHP 8.3 с собственным ORM и REST API, фронтенд - SPA на фреймворке вендора. База - MySQL 8.0+, MariaDB 10.3+ или PostgreSQL 15+; официальный compose идет с MariaDB, этот путь самый проторенный.
| Сервис | Образ / entrypoint | За что отвечает | RAM на стенде |
|---|---|---|---|
| espocrm | espocrm/espocrm:10.0.8-apache | веб-приложение и REST API, порт 80 | ~77.5 MB |
| espocrm-daemon | тот же образ, docker-daemon.sh | планировщик: прием и отправка почты, рассылки, напоминания, workflow | ~21.5 MB |
| espocrm-websocket | тот же образ, docker-websocket.sh, ZeroMQ | живые обновления интерфейса, порт 8080 внутри | ~21.9 MB |
| espocrm-db | mariadb:11.4 | база данных | ~120.3 MB |
Порядок старта держится на healthcheck-ах: приложение ждет здоровую БД, daemon и websocket ждут здоровое приложение (bin/command app-check).
Типичная ошибка - поднять только espocrm и БД. Интерфейс откроется, но письма не заберутся, кампании не уйдут, напоминания не сработают: все это делает daemon. Без websocket интерфейс просто не обновляется в реальном времени.
Данные разнесены по четырем томам: база, espocrm-data (вложения, конфиг), espocrm-custom и espocrm-custom-client (кастомизации). На этом держится обновление сменой тега без потери настроек.
Конструктор CRM: сущности и поля из админки
Entity Manager создает новые сущности («Объект недвижимости», «Заявка на ремонт») и связи между ними. Field Manager добавляет поля любого типа, Layout Manager решает, что видно в списке и карточке.
Формулы считают поля при сохранении, роли режут доступ до уровня поля. Все изменения лежат в томе espocrm-custom и переживают обновление образа.
REST API покрывает те же сущности без квот. Демо-данные на стенде созданы через POST /api/v1/Lead и POST /api/v1/Opportunity - тот же путь годится для миграции из другой CRM или связки с сайтом и 1С.
Минимальная конфигурация
Апстрим требований к железу не публикует, только «предпочитайте VPS». Цифры ниже - наш замер.
| Официальный минимум RAM | не опубликован |
| Реально в простое (4 контейнера) | ~207 MB |
| Рекомендованный memory_limit PHP | 256M на процесс |
| Образы на диске | 1.08 GB + 455 MB = ~1.53 GB |
| Занято на диске после установки (с ОС) | 4.1 GB |
| Тариф Fatmetal | CPU2-RAM4-DISK50 - 500 руб/мес |
Почему CPU2-RAM4-DISK50 при 207 MB в простое. Запас нужен росту: MariaDB забирает память под буферы, PHP-процесс под нагрузкой доходит до 256 MB, вложения живут на диске. Команде до 30-50 человек 4 GB хватает с запасом.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal. Заказываете сервер, за пару минут получаете рабочую CRM на своем домене с валидным TLS: четыре контейнера связаны, пароли сменены, файл с доступами лежит на сервере.
Рекомендуемая конфигурация: CPU2-RAM4-DISK50
Развертывание на Fatmetal
Fatmetal Cloud Server + Ubuntu 24.04 + Docker, наружу через Caddy с автоматическим TLS. От старта до подтвержденного входа - около 12 минут.
Создать сервер
Тариф CPU2-RAM4-DISK50, Ubuntu 24.04 LTS, приложение Docker из маркетплейса. Без него Docker Engine и compose-плагин из официального apt-репозитория ставятся за ~40 секунд. A-запись домена направьте на IP заранее.
Сгенерировать секреты в .env
В примере документации стоят
admin_passwordиdatabase_password- с ними наружу выходить нельзя.mkdir -p ~/espocrm && cd ~/espocrm cat > .env <<EOF SITE_DOMAIN=crm.example.ru DB_ROOT_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=') DB_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=') ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -d '/+=') EOF chmod 600 .envСобрать docker-compose.yml
Compose из документации с четырьмя правками: теги закреплены, пароли из
.env, порты только на loopback, URL сайта и вебсокета с https/wss. Общие поля трех контейнеров приложения вынесены в якорь.x-app: &app image: espocrm/espocrm:10.0.8-apache restart: always volumes: - espocrm-data:/var/www/html/data - espocrm-custom:/var/www/html/custom - espocrm-custom-client:/var/www/html/client/custom services: espocrm-db: image: mariadb:11.4 restart: always command: --max-allowed-packet=64MB environment: MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MARIADB_DATABASE: espocrm MARIADB_USER: espocrm MARIADB_PASSWORD: ${DB_PASSWORD} volumes: ["espocrm-db:/var/lib/mysql"] healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 10s espocrm: <<: *app environment: ESPOCRM_DATABASE_PLATFORM: Mysql ESPOCRM_DATABASE_HOST: espocrm-db ESPOCRM_DATABASE_USER: espocrm ESPOCRM_DATABASE_PASSWORD: ${DB_PASSWORD} ESPOCRM_ADMIN_USERNAME: admin ESPOCRM_ADMIN_PASSWORD: ${ADMIN_PASSWORD} ESPOCRM_SITE_URL: "https://${SITE_DOMAIN}" ports: ["127.0.0.1:8080:80"] depends_on: {espocrm-db: {condition: service_healthy}} healthcheck: test: ["CMD", "bin/command", "app-check"] start_period: 90s interval: 20s espocrm-daemon: <<: *app entrypoint: docker-daemon.sh depends_on: {espocrm: {condition: service_healthy}} espocrm-websocket: <<: *app entrypoint: docker-websocket.sh environment: ESPOCRM_CONFIG_USE_WEB_SOCKET: "true" ESPOCRM_CONFIG_WEB_SOCKET_URL: "wss://${SITE_DOMAIN}:8081" ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBSCRIBER_DSN: "tcp://*:7777" ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBMISSION_DSN: "tcp://espocrm-websocket:7777" ports: ["127.0.0.1:18081:8080"] depends_on: {espocrm: {condition: service_healthy}} volumes: {espocrm-db: {}, espocrm-data: {}, espocrm-custom: {}, espocrm-custom-client: {}}Поставить Caddy и включить TLS
Caddy из apt-репозитория Cloudsmith. Два server-блока: сайт на 443 и вебсокет на 8081, оба с Let's Encrypt. В файрволе открыты 80, 443 и 8081.
sudo tee /etc/caddy/Caddyfile >/dev/null <<'EOF' crm.example.ru { reverse_proxy 127.0.0.1:8080 } crm.example.ru:8081 { reverse_proxy 127.0.0.1:18081 } EOF sudo systemctl restart caddyПоднять стек и дождаться healthy
docker compose pull # ~25 с на два образа docker compose up -d watch docker compose ps # ~65 с до четырех healthyespocrm30-40 секунд создает схему и администратора, потом стартуют daemon и websocket. Вход:admin, пароль из.env.
Что измерили после запуска
Цифры со свежей установки, без нагрузки. Апстрим таких данных не публикует.
Стенд
| Дата / сервер | 2026-09-11, Fatmetal Cloud Server 2 vCPU / 4 GB / 20 GB |
| ОС / Docker | Ubuntu 24.04 LTS, Docker 29.8.0, Compose v5.5.1 |
| Версия | EspoCRM 10.0.8 (10.0.8-apache), MariaDB 11.4, TLS - Caddy |
Результаты
| Скачивание образов (1.08 GB + 455 MB) | ~25 с |
| docker compose up до четырех healthy | ~65 с |
| Всего от чистой ОС до HTTPS и входа | ~12 мин (с двумя правками по ходу) |
| RAM в простое, 4 контейнера | ~207 MB |
| RAM: espocrm / daemon / websocket / db | 77.5 / 21.5 / 21.9 / 120.3 MB |
| Образы на диске | ~1.53 GB (три контейнера делят один образ) |
| Отклик главной страницы по HTTPS | ~200 мс |
| Вход администратора | подтвержден через REST API, полный ACL |
Главное: самая тяжелая часть стека - не PHP, а MariaDB (~120 MB). Приложение с daemon и websocket укладывается в ~120 MB. На 4 GB остается больше 3.5 GB под рост базы, кэш и вложения.
Проверено на версии 10.0.8, сентябрь 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли с этого стенда плюс дефолты документации, с которыми нельзя выходить наружу.
Причина. Compose из документации публикует вебсокет на хостовый 8081, тот же порт снаружи занимает Caddy. Если прокси стартовал первым, espocrm-websocket падает на bind.
Решение. Контейнер на 127.0.0.1:18081:8080, публичный :8081 оставить прокси, в ESPOCRM_CONFIG_WEB_SOCKET_URL - wss://домен:8081. Затем docker compose up -d.
Причина. При создании лида через REST API в enum-поле source передано значение Trade Show из старых примеров; в 10.0.8 его нет в списке. API отвечает 400.
Решение. Перед импортом читать списки через GET /api/v1/Metadata или не передавать поле. При миграции из Битрикс24 / amoCRM справочники сначала привести к спискам EspoCRM.
Пароли из примера документации. Скопированный «как есть» compose дает CRM с известным всему интернету паролем администратора. Менять до первого up: пароль применяется при инициализации, потом только из интерфейса.
ESPOCRM_SITE_URL остался http://localhost:8080. Ссылки в письмах, web-to-lead формы и редиректы ведут на localhost. Ставить реальный домен с https до первого запуска.
Плавающие теги. В документации espocrm/espocrm и mariadb:latest без версии. Релизы выходят несколько раз в месяц, а мажор MariaDB по latest может потребовать миграции. Закреплять оба тега.
Безопасность и обновления
Релизы и исправления - на странице релизов GitHub. Обновление - смена тега и пересоздание контейнеров: миграции применяются при старте, кастомизации в томах сохраняются.
sed -i 's/10.0.8-apache/10.0.9-apache/g' docker-compose.yml
docker compose pull && docker compose up -d
docker compose ps # все четыре снова healthy
Бэкап - дамп базы плюс тома с данными и кастомизациями. Перед обновлением - обязательно:
docker compose exec espocrm-db mariadb-dump -uroot -p"$DB_ROOT_PASSWORD" --single-transaction espocrm \
| gzip > espocrm-$(date +%F).sql.gz
docker run --rm -v espocrm-data:/data -v $PWD:/backup alpine \
tar czf /backup/espocrm-data-$(date +%F).tgz -C /data . # то же для espocrm-custom
Что закрыть перед продом:
- TLS через Caddy или Traefik, порты контейнеров только на 127.0.0.1;
- свои пароли администратора, БД и root MariaDB, файл
.envс правами 600 и вне git; - двухфакторная аутентификация для администраторов (Administration, раздел Authentication);
- роли и команды до выдачи доступа сотрудникам;
- SMTP и IMAP через российского провайдера или свой почтовый сервер, иначе рассылки уйдут в спам;
- бэкап по cron с выносом за пределы сервера и проверенным восстановлением.
Связь с другими стеками
- Обратный прокси - Caddy (как здесь) или Traefik: у документации EspoCRM есть рецепт и для него.
- Почта - docker-mailserver для своих ящиков и отправки кампаний; на одном CPU2-RAM4-DISK50 с CRM - только для небольшой команды.
- Twenty CRM - соседний разбор: CRM на TypeScript с Notion-подобными таблицами; EspoCRM старше, богаче по функциям и легче по RAM.
- Поддержка - при большом потоке обращений тикеты лучше вести в Zammad или Chatwoot.
- Мониторинг - Uptime Kuma на
/api/v1/App/user: ожидаемый 401 - признак живого API.
Когда это НЕ ваш выбор
Отчеты и BPM нужны бесплатно и сразу
В ядре только дашлеты и формулы в полях. Конструктор отчетов и бизнес-процессы - Advanced Pack, его цена и оплата из РФ выясняются отдельно. Считайте пак до переезда.
От CRM ждут «все в одном» как у Битрикс24
Задачи по проектам, корпоративный чат, телефония, конструктор сайтов - этого в EspoCRM нет или это платные расширения. Остальное собирается из других продуктов.
Некому обслуживать
Четыре контейнера, патчи несколько раз в месяц, бэкапы, TLS, почта. Без человека, который на это подписан, self-host через полгода становится непропатченной CRM с перепиской внутри. Тогда подписка - оплата чужого админа.
Продукт встраивается в закрытый SaaS
AGPL-3.0 - сетевой copyleft: если EspoCRM становится частью вашего сервиса для внешних пользователей, обязательства по раскрытию кода читаются с юристом. Для внутреннего использования ограничений нет.
Частые вопросы
Можно поставить без Docker?
Да, есть ручная установка (PHP 8.3-8.5, Apache или Nginx). Но для прода документация рекомендует Docker Compose: cron и websocket там уже разведены по контейнерам.
Как обновлять?
Сменить тег в compose, docker compose pull && docker compose up -d. Миграции применяются при старте, кастомизации в томах сохраняются. Перед этим - дамп базы.
Как переехать с Битрикс24 или amoCRM?
В ядре есть импорт из CSV для любой сущности и REST API. Сначала привести справочники (источник лида, стадия сделки) к спискам EspoCRM. Переписка и связи автоматически не переносятся.
Есть ли русский интерфейс?
Русский есть в списке языков. Качество перевода на стенде не оценивалось - интерфейс на скриншотах английский.
Какие ограничения лицензии?
AGPL-3.0: использовать в компании и ставить клиентам можно без лимитов. Раскрывать код нужно только при отдаче измененной версии по сети внешним пользователям.
Итог
EspoCRM 10.0.8 стартует за ~65 секунд, занимает ~207 MB RAM в простое и закрывает продажи, почту, кампании и поддержку для команды любого размера на CPU2-RAM4-DISK50 за 500 руб/мес - против €129-€550 в месяц за облако вендора. Цена экономии - четыре контейнера на вашем обслуживании и платные паки, если нужны отчеты, BPM или счета.
Этот стек у нас запущен на конфигурации 2 vCPU / 4 GB RAM (аналог тарифа CPU2-RAM4-DISK50). Нашли баг в гайде - напишите, поправим в течение дня.