EspoCRM
CRM на своем сервере: лиды, сделки, почта, кампании и клиентский портал без платы за пользователя. Проверили установку 10.0.11 на Fatmetal Cloud Server; замеры ресурсов и скриншоты сохранили от 10.0.8.
Вердикт
- отделам продаж, которым нужны лиды, сделки и переписка вместо подписки за каждое место
- командам, которые хотят связать клиентские карточки, почту и обращения поддержки в одной CRM
- тем, кому нужны свои сущности, поля и связи из админки плюс REST API
- если отчеты и BPM нужны бесплатно и сразу - это платный Advanced Pack
- если от CRM ждут «все в одном» как у Битрикс24: задачи, чаты, телефония, сайты
- если некому обслуживать четыре контейнера и патчи несколько раз в месяц
Что изменилось с прошлого разбора
В сентябре инструкция была рассчитана на 10.0.8. В 10.0.9 исправлены имена в уведомлениях назначений и очистка персональных данных в массивах; в 10.0.10/10.0.11 - ошибка Kanban со скрытым статусом.
В 10.0.9 закрыта уязвимость базы знаний с повышением прав. Образ 10.0.11-apache включает PHP 8.4.27 с исправлением PHP2Shell: подробности - в таблице уязвимостей.
Состав серверов и требования не изменились. Для перехода сохраняйте данные и обновляйте все три контейнера приложения по командам ниже.
Что это и какую задачу решает
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 в год.
Собственная установка оплачивается за сервер, а не за учетные записи. Нагрузка зависит от объема данных и фоновых задач.
Где расчет неполный. В облаке включены все расширения, в ядре нет отчетов, 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 |
Тех-стек: четыре контейнера, а не один
Бэкенд образа 10.0.11-apache - PHP 8.4.27 с собственным ORM и REST API, фронтенд - SPA на фреймворке вендора. База - MySQL 8.0+, MariaDB 10.3+ или PostgreSQL 15+; официальный compose идет с MariaDB, этот путь самый проторенный.
| Сервис | Образ / entrypoint | За что отвечает |
|---|---|---|
| espocrm | espocrm/espocrm:10.0.11-apache | веб-приложение и REST API, порт 80 |
| espocrm-daemon | тот же образ, docker-daemon.sh | планировщик: прием и отправка почты, рассылки, напоминания, workflow |
| espocrm-websocket | тот же образ, docker-websocket.sh, ZeroMQ | живые обновления интерфейса, порт 8080 внутри |
| espocrm-db | mariadb:11.4 | база данных |
Порядок старта держится на 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». Цифры ниже сняты на 10.0.8 в сентябре.
| Официальный минимум 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, вложения живут на диске. Число одновременных пользователей по потреблению в простое не определяется.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий сервис на своем домене, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес
Развертывание на Fatmetal Cloud Server
Чистая Ubuntu, четыре контейнера и Caddy. Все команды ниже выполняются в одной root-сессии.
Установите Docker и Caddy
Возьмите Ubuntu 24.04 LTS на CPU2-RAM4-DISK50. Войдите через SSH и выполните
sudo -i: следующие команды вводятся от root.apt-get update apt-get install -y ca-certificates curl openssl caddy curl -fsSL https://get.docker.com -o /tmp/get-docker.sh env -u VERSION sh /tmp/get-docker.shЗадайте домен и пароли
Направьте A-запись своего домена на сервер; вместо
ваш-доменв обоих файлах укажите это имя. Откройте входящие TCP-порты 80, 443 и 8081.mkdir -p /opt/espocrm && cd /opt/espocrm cat > .env <<EOF SITE_DOMAIN=ваш-домен DB_ROOT_PASSWORD=$(openssl rand -hex 24) DB_PASSWORD=$(openssl rand -hex 24) ADMIN_PASSWORD=$(openssl rand -hex 18) EOF chmod 600 .envЗапишите Compose с закрепленной версией
Три сервиса приложения используют один образ 10.0.11-apache. MariaDB остается на ветке 11.4. Данные и настройки хранятся в именованных томах.
cat > docker-compose.yml <<'EOF' x-app: &app image: espocrm/espocrm:10.0.11-apache restart: unless-stopped 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: unless-stopped 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 timeout: 5s retries: 12 start_period: 60s 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}" ESPOCRM_CONFIG_USE_WEB_SOCKET: "true" ESPOCRM_CONFIG_WEB_SOCKET_URL: "wss://${SITE_DOMAIN}:8081" ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBMISSION_DSN: "tcp://espocrm-websocket:7777" ports: ["127.0.0.1:8080:80"] depends_on: {espocrm-db: {condition: service_healthy}} healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost/ >/dev/null && bin/command app-check"] start_period: 90s interval: 10s retries: 12 espocrm-daemon: <<: *app entrypoint: docker-daemon.sh depends_on: {espocrm: {condition: service_healthy}} espocrm-websocket: <<: *app entrypoint: docker-websocket.sh environment: {ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBSCRIBER_DSN: "tcp://*:7777"} ports: ["127.0.0.1:18081:8080"] depends_on: {espocrm: {condition: service_healthy}} volumes: {espocrm-db: {}, espocrm-data: {}, espocrm-custom: {}, espocrm-custom-client: {}} EOFВключите HTTPS
Caddy получает сертификат автоматически. Вебсокет снаружи занимает 8081, а внутри сервера - 18081: так порты не конфликтуют.
cat > /etc/caddy/Caddyfile <<'EOF' ваш-домен { reverse_proxy 127.0.0.1:8080 } ваш-домен:8081 { reverse_proxy 127.0.0.1:18081 } EOF systemctl restart caddyСкачайте образы и запустите CRM
Дождитесь возврата команды. Во всех трех выводах должна стоять PHP 8.4.27; в ветке 8.4 более ранняя версия уязвима.
docker compose pull docker compose up -d --wait --wait-timeout 600 docker compose exec -T espocrm php -v </dev/null docker compose exec -T espocrm-daemon php -v </dev/null docker compose exec -T espocrm-websocket php -v </dev/null curl -fI https://ваш-домен/Войдите администратором
Откройте
https://ваш-домен/, логинadmin. Пароль создан на втором шаге; прочитайте его на сервере:grep '^ADMIN_PASSWORD=' /opt/espocrm/.env
Что измерили после запуска
Замеры 11 сентября 2026, EspoCRM 10.0.8, без нагрузки. Они характеризуют прежнюю версию; инструкция выше проверена на 10.0.11.
Стенд
| Дата / сервер | 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 |
| Образы на диске | ~1.53 GB (три контейнера делят один образ) |
| Отклик главной страницы по HTTPS | ~200 мс |
| Вход администратора | подтвержден через REST API, полный ACL |
Установка проверена на 10.0.11, 27 октября 2026. Замеры и скриншоты - 10.0.8, 11 сентября 2026.
Где может сломаться
Реальные грабли с этого стенда плюс дефолты документации, с которыми нельзя выходить наружу.
Причина. Первая инициализация MariaDB заняла больше стандартных трех проверок. База успела стать healthy уже после отказа Compose.
Решение. Сохраните start_period: 60s в проверке БД, как в инструкции, затем выполните docker compose up -d --wait --wait-timeout 600.
Причина. 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.
Безопасность и обновления
Перед обновлением остановите запись в CRM и сохраните базу, вложения, конфигурацию и собственные поля. Эти команды соответствуют именам сервисов и томов из инструкции.
cd /opt/espocrm
mkdir -p backups && chmod 700 backups
docker compose stop espocrm espocrm-daemon espocrm-websocket
docker compose exec -T espocrm-db sh -c 'exec mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" --single-transaction espocrm' | gzip > backups/db.sql.gz
docker compose run --rm --no-deps --entrypoint tar -v "$PWD/backups:/backup" espocrm -czf /backup/files.tgz -C /var/www/html data custom client/custom
cp .env docker-compose.yml backups/
Поменяйте тег старой установки на 10.0.11-apache, скачайте образ заново и пересоздайте все три контейнера приложения. Одного обновления CRM из панели недостаточно для исправления PHP.
sed -i -E 's#espocrm/espocrm:[0-9.]+-apache#espocrm/espocrm:10.0.11-apache#g' docker-compose.yml
docker compose pull
docker compose up -d --wait --wait-timeout 600
docker compose exec -T espocrm php -v </dev/null
docker compose exec -T espocrm-daemon php -v </dev/null
docker compose exec -T espocrm-websocket php -v </dev/null
Для восстановления используйте тот же Compose и файл .env, с которыми сделана копия. Если заменяли их, верните из каталога backups до запуска:
cd /opt/espocrm
docker compose stop espocrm espocrm-daemon espocrm-websocket
gzip -dc backups/db.sql.gz | docker compose exec -T espocrm-db sh -c 'exec mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" espocrm'
docker compose run --rm --no-deps --entrypoint tar -v "$PWD/backups:/backup" espocrm -xzf /backup/files.tgz -C /var/www/html
docker compose up -d --wait --wait-timeout 600
Храните копию вне сервера: архив содержит настройки и секреты. Для диагностики используйте docker compose logs --tail=100 espocrm; роли настройте до приглашения сотрудников.
Уязвимости прошлых версий
Образ из инструкции закрывает перечисленные high/critical; текущий тег образа в карточке также содержит исправленный PHP. Ранее созданные контейнеры обновите по командам выше.
| Уязвимость | Уровень | Затронуто | Исправлено | Риск для владельца |
|---|---|---|---|---|
| CVE-2026-109618 | critical, 9.2 | PHP 8.4 до 8.4.27 | PHP 8.4.27 | Код на сервере без входа при ошибке памяти. |
| CVE-2026-109619 | critical, 9.2 | PHP 8.4 до 8.4.27 | PHP 8.4.27 | Код на сервере без входа через состояние между запросами. |
| CVE-2026-47168 | critical | EspoCRM ≤9.3.6 | 9.3.7 | Администратор может выполнить код через экспорт. |
| CVE-2026-33656 | critical | EspoCRM ≤9.3.3 | 9.3.4 | Администратор может записать исполняемый файл через формулы. |
| GHSA-j6q5-9jwj-9p8q | high, 7.3 | ≤10.0.8 / ≤9.3.10 | 10.0.9 / 9.3.11 | Клик по ссылке в базе знаний позволяет создать администратора. |
| GHSA-6pjq-v35w-jmjh | high, 7.5 | ≤10.0.7 / ≤9.3.10 | 10.0.8 / 9.3.11 | Запросы без входа могут занять все веб-процессы. |
| GHSA-4qv5-q4g7-hp5r | high | ≤10.0.7 / ≤9.3.10 | 10.0.8 / 9.3.11 | Клик по SVG позволяет действовать от имени администратора. |
| CVE-2026-105833 | high | ≤10.0.4 / ≤9.3.10 | 10.0.5 / 9.3.11 | Пользователь может прочитать чужой пароль IMAP. |
| CVE-2026-53574 | high | 8.1.0-9.3.7 | 9.3.8 | Пользователь может извлечь данные через SQL-инъекцию. |
| CVE-2026-33733 | high | EspoCRM ≤9.3.3 | 9.3.4 | Администратор может менять файлы вне каталога шаблонов. |
PHP2Shell исправлен 21 октября также в PHP 8.2.35, 8.3.36 и 8.5.12. В нашей схеме нужна исправленная ветка 8.4. Ошибки ветки 9.3 в таблице адресованы тем, кто обновляется с более старой установки.
Связь с другими стеками
- Обратный прокси - Caddy (как здесь) или Traefik: у документации EspoCRM есть рецепт и для него.
- Почта - docker-mailserver для своих ящиков и отправки кампаний; ресурсы почтового сервера считайте отдельно от CRM.
- Twenty CRM - соседний разбор: CRM на TypeScript с Notion-подобными таблицами; перед выбором сравните состав бесплатного ядра.
- Поддержка - при большом потоке обращений тикеты лучше вести в 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 становится частью вашего сервиса для внешних пользователей, обязательства по раскрытию кода читаются с юристом. Для внутреннего использования ограничений нет.
Недоверенные сотрудники создают PDF-шаблоны
В 10.0.11 остается CVE-2026-113643, medium: редактор PDF-шаблона может получить чужое изображение по известному ID. Исправление заявлено в 10.1.0; до него выдавайте это право только доверенным людям.
Частые вопросы
Можно поставить без 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. Переписка и связи автоматически не переносятся.
Есть ли русский интерфейс?
Русский есть в списке языков. В настройках можно выбрать ru_RU; сохраненные скриншоты 10.0.8 показывают английский интерфейс.
Какие ограничения лицензии?
AGPL-3.0: использовать в компании и ставить клиентам можно без лимитов. Условия изменения и распространения кода приведены в AGPL-3.0.
Итог
EspoCRM заменяет оплату за рабочие места расходами на сервер и его обслуживание. Для продаж, почты и обращений есть бесплатное ядро; отчеты, BPM и счета покупаются отдельно. Установка 10.0.11 сохраняет прежнюю схему из четырех контейнеров и обновляет уязвимый PHP.
Рекомендуемая конфигурация для установки:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe
Не хотите устанавливать вручную?
Запустите EspoCRM на этой конфигурации автоматически - от 990 ₽/мес.
Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.