EspoCRM в бою: обновления, бэкапы, безопасность и 152-ФЗ

Сервер EspoCRM под защитным куполом с орбитами обновлений, бэкапов, 2FA и мониторинга

«Бесплатная CRM» ≠ «бесплатная эксплуатация»: считаем честно

Меня зовут Евгений Семёнов, я технический директор ITfresh. Мы занимаемся IT-аутсорсингом компаний до 50 рабочих мест в Москве, и EspoCRM — одна из систем, которые мы регулярно разворачиваем и сопровождаем у клиентов. В предыдущих статьях серии я разобрал, что это за система, как поставить её на VPS и как связать с телефонией и сайтом. Сегодня — самая недооценённая тема: что происходит с self-hosted CRM после запуска. Спойлер: она не живёт сама по себе, но и не требует выделенного администратора.

Формула, которую я повторяю на каждой встрече: open-source бесплатен как лицензия, но не как обслуживание. Когда вы платите за облачную CRM, в подписку зашиты труд девопсов вендора, его бэкапы и его дежурные инженеры. Когда вы разворачиваете систему у себя, эти обязанности никуда не исчезают — они переезжают к вам или к вашему подрядчику. Из чего состоит сопровождение на практике:

  • Обновления. Релизы EspoCRM выходят регулярно, патчи ветки — практически ежемесячно. Их надо накатывать, иначе через год вы сидите на дырявой сборке.
  • Бэкапы. База клиентов — самый ценный актив отдела продаж. Диск VPS умирает без предупреждения, и единственная защита — проверенные резервные копии.
  • Мониторинг. Место на диске, cron-задания, сертификат TLS — всё это тихо ломается, если за ним не следить.
  • Мелкие доработки. Новое поле в карточке, новая роль для стажёра, подкрутить шаблон письма — рутина, которая возникает раз в месяц-два.

Теперь цифра, ради которой пишется весь раздел. По нашей статистике сопровождение типовой инсталляции EspoCRM на компанию до 50 рабочих мест занимает 1–3 часа инженера в месяц. Не ставка администратора, не полдня в неделю — часы. Час уходит на обновление и проверку бэкапов, остальное — на мелкие просьбы пользователей. Именно поэтому self-hosted экономика сходится: труд есть, но его мало.

Когда можно «поставить и забыть». Если у вас 5–10 пользователей, нет интеграций и есть свой айтишник, который раз в месяц потратит вечер, — живите без договора сопровождения, этой статьи вам хватит как регламента. Договор нужен, когда CRM стала критичной для выручки: простой в полдня уже стоит денег, а восстановление из бэкапа некому даже начать.

Обновления: релизы выходят ежемесячно — и это хорошо

Частые релизы — признак живого проекта, а не головная боль. Актуальная ветка на момент публикации — 9.3: сама версия вышла 5 февраля 2026 года, свежий патч 9.3.10 — 2 июля 2026-го. Патчи ветки выходят регулярно, и в них едут не только фиксы, но и заплатки безопасности — поэтому «обновимся когда-нибудь» я считаю плохой стратегией.

Веб-интерфейс или CLI: как правильно накатывать

Технически апгрейд доступен из веб-админки (Administration → Upgrade), но официальная документация прямо не рекомендует этот путь: обновление выполняется одним веб-процессом, и обрыв соединения или таймаут PHP посреди процесса оставит систему в полусобранном состоянии. Мы всегда обновляем из консоли:

cd /var/www/espocrm
sudo -u www-data php command.php upgrade

Команда сама находит подходящие пакеты обновления, скачивает их и последовательно применяет. Запускать её стоит внутри screen или tmux — если SSH-сессия оборвётся, процесс доживёт до конца без вас. Семантика версий у Espo честная: патч (третья цифра) безопасен, минорный переход может задеть совместимость, мажорный — почти наверняка задевает, и бэкап перед ним обязателен. Пропускать по несколько версий разработчик не советует: чем длиннее прыжок, тем менее гладко он проходит. Ещё один довод обновляться ежемесячно, а не раз в год.

Наш регламент апгрейда

Порядок, который мы отработали на десятках обновлений: сначала свежий бэкап базы и файлов, затем прогон апгрейда на тестовой копии (разворачиваем вчерашний бэкап на отдельной VM — заодно это и есть проверка восстановимости), затем прод в нерабочее время с включённым Maintenance Mode и выключенным cron. После апгрейда — smoke-чек-лист: логин, открытие карточки, отправка тестового письма, создание задачи, проверка планировщика. Пять минут кликов ловят 90% проблем до того, как их утром найдут менеджеры.

Кастомизации: почему мы никогда не правим ядро

Главный секрет безболезненных апгрейдов — дисциплина кастомизации. Всё, что сделано штатными средствами — поля и сущности через Entity Manager, раскладки через Layout Manager, формулы, настройки в каталоге custom, — переживает обновления без последствий: апгрейд заменяет ядро, не трогая ваш слой. А вот правки файлов ядра погибают при первом же обновлении, поэтому у нас железное правило: в application и client лезть запрещено, любая доработка — только через custom или расширение. Откат, если что-то пошло не так, тоже штатный: восстановить файлы прежней версии из бэкапа, удалить каталоги application, html, public и vendor, положить старые на место и выполнить rebuild.

Лицензия при переезде со старых веток

Если вы обновляете инсталляцию многолетней давности, учтите юридический нюанс: начиная с версии 8.1 (декабрь 2023 года) EspoCRM распространяется под AGPLv3 вместо прежней GPLv3. Для внутреннего использования в компании ничего не меняется — ограничение касается только сценария, когда вы дорабатываете систему и продаёте доступ к ней наружу как сервис. Но если у вас есть форки или вы встраивали Espo в собственный продукт, перед прыжком с 7.x или 8.0 стоит показать этот пункт юристу.

Бэкапы по схеме 3-2-1: скрипты, шифрование и тест восстановления

Бэкап — это не «на всякий случай», это единственное, что отделяет сбой диска от катастрофы бизнеса. Начнём с состава: что именно надо копировать в EspoCRM.

  • Дамп базы данных — сами клиенты, сделки, письма, история. Это ядро бэкапа, копируем ежедневно.
  • Каталог data — вложения, загруженные файлы, кэши. Растёт быстрее всего.
  • Каталог custom (и client/custom) — все ваши сущности, поля и доработки.
  • Файл конфигурации — параметры подключения и ключи инсталляции.

Базу снимаем без остановки сервиса — MariaDB умеет консистентный дамп на лету:

mariadb-dump --single-transaction --quick \
  --routines espocrm | gzip > /backup/espocrm-db-$(date +%F).sql.gz

Флаг --single-transaction даёт согласованный снимок InnoDB-таблиц без блокировки: менеджеры продолжают работать, пока идёт дамп. Полный ночной скрипт у нас выглядит примерно так (упрощённая версия без вычистки секретов):

#!/bin/bash
set -euo pipefail
D=/backup/espocrm; TS=$(date +%F)
mariadb-dump --single-transaction --quick espocrm | gzip > "$D/db-$TS.sql.gz"
tar czf "$D/files-$TS.tar.gz" -C /var/www/espocrm data custom client/custom config.php
gpg --batch --yes -e -r backup@itfresh.ru "$D/db-$TS.sql.gz"
rsync -a "$D/" backup2:/vol/espocrm/   # вторая площадка
find "$D" -mtime +30 -delete           # ротация 30 дней

Дампы с персональными данными мы шифруем GPG до отправки на внешние хранилища: резервная копия клиентской базы, лежащая открытым текстом в чужом объектном хранилище, — сама по себе инцидент с ПДн.

Правило 3-2-1 и квартальный тест

Схема хранения классическая: три копии данных, на двух разных типах носителей, одна — вне площадки. У нас это локальный диск VPS (быстрое восстановление), второй сервер в другом дата-центре (rsync ночью) и объектное S3-совместимое хранилище (недельные полные архивы). БД — ежедневно, файлы — еженедельно полностью плюс ежедневные инкременты.

И главное правило, которое я вбиваю каждому клиенту: бэкап без проверки восстановления — это лотерея. Раз в квартал мы разворачиваем копию на чистой VM и убеждаемся, что CRM поднимается и данные на месте. Именно эта привычка однажды спасла клиента: у его VPS деградировал диск, хостер развёл руками, а мы за 40 минут подняли CRM на новом сервере из вчерашнего дампа — отдел продаж потерял меньше часа работы и ни одной сделки. Сорок минут — не удача, а результат того, что процедура была отрепетирована.

Схема бэкапа 3-2-1 для EspoCRM: сервер CRM и три хранилища — локальный диск, второй сервер, облако вне площадки

Харденинг веб-периметра: TLS, fail2ban, 2FA и вариант «только через VPN»

CRM, торчащая в интернет, — это дверь в клиентскую базу. Ниже — слои защиты, которые мы накатываем на каждую инсталляцию, от обязательного минимума до параноидального контура.

TLS и автопродление сертификатов

Только HTTPS, только актуальные версии TLS (1.2/1.3), старые протоколы и слабые шифры выключены, HSTS включён — браузер сотрудника после первого визита просто откажется ходить в CRM по нешифрованному каналу. Сертификаты — Let's Encrypt с автопродлением, и здесь живёт классическая грабля: certbot продлевает сертификат через проверку на порту 80, а если nginx настроен строго и на :80 ничего не отвечает или редирект сделан криво, продление тихо ломается. Симптом обнаруживается через 90 дней в виде красного замка у всего отдела продаж. Поэтому срок сертификата у нас под мониторингом, а не на честном слове.

fail2ban против перебора паролей

Форму логина в открытой инсталляции начинают брутфорсить боты в первые же сутки — это видно по access-логу. Лечится штатно: fail2ban читает лог веб-сервера и банит IP после нескольких неудачных попыток входа. Примерная связка jail и фильтра:

# /etc/fail2ban/jail.d/espocrm.conf
[espocrm]
enabled  = true
port     = http,https
filter   = espocrm
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 10m
bantime  = 1h

# /etc/fail2ban/filter.d/espocrm.conf
[Definition]
failregex = ^<HOST> .* "POST /api/v1/App/user.*" 401

Пять неверных паролей за десять минут — час бана. Легитимный сотрудник столько подряд не ошибается, а словарная атака умирает на взлёте.

2FA, ограничение по IP и VPN-контур

Встроенную двухфакторную аутентификацию по TOTP (одноразовые коды из приложения) мы включаем всем администраторам обязательно, менеджерам — настойчиво рекомендуем. Пароль утекает легко — код из приложения без телефона не утекает. Следующий слой — ограничение доступа к админке по IP офиса на уровне веб-сервера: даже с украденным паролем админа снаружи в настройки не попасть.

А для клиентов, которые не хотят светить CRM в интернет вообще, мы строим контур «только через VPN»: система слушает только внутренний интерфейс, а сотрудники ходят в неё через WireGuard-туннель до офисного роутера. Снаружи не существует ни формы логина, ни самого сайта — сканерам и ботам просто нечего перебирать. Удалёнка при этом работает: WireGuard-клиент есть под все платформы, а на современных офисных роутерах туннель поднимается штатными средствами. Из минусов — чуть больше поддержки: новый сотрудник получает не ссылку, а конфиг туннеля.

Слои защиты EspoCRM: кольца TLS, fail2ban, 2FA, роли и VPN вокруг ядра CRM

Роли и права внутри CRM: минимальные привилегии на практике

Периметр — это полдела: не менее важно, что сотрудник может сделать внутри системы. Здесь EspoCRM даёт всё нужное бесплатно, надо только не полениться настроить.

Базовый принцип — минимальные привилегии. В ролях Espo у каждого действия есть область видимости: свои записи (own), записи команды (team) или все (all). Типовая настройка отдела продаж: менеджер видит и редактирует свои сделки и сделки своей команды, руководитель отдела — всё по отделу, и только директор с админом видят базу целиком. Так увольнение одного менеджера не превращается в утечку всей клиентской базы — он физически не мог её выгрузить.

Второй инструмент — Field Level Security: права на уровне отдельных полей. Классика — суммы договоров и комментарии руководства в карточке компании видят только руководители, а стажёры даже не знают, что такие поля существуют. Настраивается в той же роли, парой кликов.

Третий — аудит. Лента Stream пишет историю изменений по записи: кто поменял стадию сделки, кто удалил контакт, кто переназначил клиента. Когда прилетает вопрос «куда делся контакт Иванова», разбор занимает минуту, а не день перекрёстных допросов. Для чувствительных сущностей мы включаем аудит изменений по ключевым полям сразу при внедрении.

Сценарий увольнения менеджера — отработайте его до того, как он случится. Наш чек-лист: немедленно деактивировать учётную запись (не удалять — история и связи должны остаться); массово передать его записи преемнику штатным переназначением; сменить пароли общих почтовых ящиков, к которым он имел доступ; проверить, не был ли его личный ящик подключён к CRM; убрать его из VPN-конфигов, если у вас закрытый контур. Полчаса по списку — и расставание проходит без драм.

Мониторинг и топ-3 инцидента из нашей практики

Всё, что не мониторится, ломается тихо и обнаруживается в понедельник утром звонком «у нас CRM не открывается». Наш стандартный набор проверок для инсталляции EspoCRM:

  • Доступность HTTPS — внешняя проверка, что система отвечает и сертификат валиден;
  • Место на диске — вложения писем растут незаметно и быстрее всего;
  • Выполнение cron-заданий — на планировщике в Espo держится почта, напоминания и вся фоновая работа;
  • Размер таблиц БД — аномальный рост служебных таблиц это ранний симптом проблем;
  • Срок сертификата TLS — та самая грабля автопродления из раздела про харденинг.

Алерты уходят инженерам в Telegram: от срабатывания до реакции проходят минуты, а не «до следующего планового визита». Теперь три инцидента, которые мы разбирали чаще всего, — в формате «симптом → причина → лечение»:

СимптомПричинаЛечение
CRM резко «встала»: ошибки при сохранении, письма не уходят, в логах жалобы на записьПереполнился диск — годами копившиеся вложения входящей почты съели разделСрочно расчистить кэши и старые логи, расширить диск VPS; системно — алерт на 80% заполнения и регламентная чистка вложений
После обновления сервера напоминания молчат, почта не забирается, отчёты «зависли»Апгрейд PHP на новую ветку: cron зовёт старый бинарник или несовместимое расширение, фоновые задания падают на стартеПроверить, каким PHP выполняется cron-строка, поставить нужные расширения, перезапустить зависшие задания; тестовую копию обновлять первой
Система тормозит всё сильнее, служебная таблица очереди заданий распухла до гигабайтСломан cron: задания ставятся в очередь, но никто их не выполняет — очередь растёт бесконечноПочинить cron-строку (после переездов её теряют чаще всего), вычистить накопленную очередь, поставить мониторинг на факт выполнения заданий

Общий вывод из всех трёх: инциденты почти никогда не «внезапны» — за неделю до падения метрики уже кричали. Мониторинг превращает аварию в плановую задачу на полчаса.

152-ФЗ и персональные данные: что self-hosted решает, а что нет

Сразу дисклеймер: мы инженеры, а не юристы. Всё ниже — технический взгляд на комплаенс, а не юридическая консультация; политику обработки ПДн и договорную часть согласуйте с профильным специалистом.

Теперь по существу. База CRM — это фамилии, телефоны, почта и история общения с людьми, то есть обработка персональных данных по 152-ФЗ со всеми вытекающими. И здесь self-hosted даёт осязаемое преимущество: требование локализации ПДн граждан РФ решается просто выбором российской площадки. Наши клиентские серверы стоят в дата-центре МТС — российское юрлицо, российская юрисдикция, физическое расположение баз известно с точностью до стойки. Сравните с зарубежным SaaS, где на вопрос регулятора «где физически лежит база» ответить внятно бывает затруднительно.

Технические меры защиты, которые требует закон, закрываются тем самым харденингом из этой статьи: разграничение доступа — роли и Field Level Security, защита каналов — TLS, журналирование — аудит Stream и логи сервера, защита от несанкционированного доступа — fail2ban, 2FA и VPN-контур, сохранность — бэкапы с шифрованием. То есть добросовестная эксплуатация и комплаенс — это во многом один и тот же список работ.

Что остаётся на стороне организации. Self-hosted не делает вас автоматически «белыми» перед регулятором. Оргмеры никто не отменял: политика обработки ПДн, согласия субъектов, приказ о назначении ответственного, уведомление Роскомнадзора о начале обработки, если вы под это подпадаете. Это документы и процессы, а не серверные настройки — и это работа вашего юриста или профильного консультанта, не сисадмина.

Итоговая позиция такая: с собственным сервером в российском ЦОД разговор с регулятором аргументировать заметно проще, чем с зарубежным облаком, — но разговор всё равно надо готовить.

Производительность на дистанции: когда 2 vCPU перестаёт хватать

Свежепоставленная Espo на 2 vCPU и 4 ГБ памяти летает. Вопрос в том, что будет через два года, когда в базе сотни тысяч записей, десятки гигабайт почты и полсотни активных пользователей. Признаки, что сервер пора расширять или тюнить: списки открываются по несколько секунд, отчёты считаются минутами, поиск «задумывается», а утренний пик логинов кладёт систему в задумчивость.

Прежде чем покупать железо, проходимся по настройкам — чаще всего узкое место там:

  • Индексы на кастомные поля. Поля, созданные через Entity Manager, по которым менеджеры фильтруют списки, должны быть проиндексированы — иначе каждый фильтр это полный проход по таблице. Самая частая причина «CRM стала тормозить» на выросшей базе.
  • Opcache PHP. Должен быть включён с адекватным объёмом памяти — без него PHP перекомпилирует код на каждый запрос.
  • innodb_buffer_pool_size. Дефолт MariaDB рассчитан на калькулятор, а не на CRM. Поднимаем до 50–60% памяти сервера БД, чтобы рабочий набор данных жил в оперативке, а не читался с диска.
  • Регулярная чистка. Отработавшие записи очереди заданий, старые логи и почтовые вложения многолетней давности — всё это раздувает базу и бэкапы. Чистка раз в квартал входит в наш регламент.

Если после тюнинга всё равно тесно — вертикальный рост: у любого нормального хостера VPS расширяется до 8–16 vCPU и десятков гигабайт памяти за минуты и небольшую доплату. На нашей целевой аудитории — компании до 50 рабочих мест — этого пути хватает с запасом. Шардинг, кластеры БД и горизонтальное масштабирование на этих объёмах не нужны вовсе; если подрядчик предлагает вам кластер «для надёжности» на 30 пользователей — он продаёт вам свою почасовку, а не решение.

Итог: регламент сопровождения одним списком

Сведу всю статью в одну таблицу — это фактически наш внутренний регламент сопровождения EspoCRM, по которому работают инженеры ITfresh. Забирайте как есть.

ПериодичностьРаботы
Ежедневно (автоматически)Бэкап БД с шифрованием и отправкой на вторую площадку; инкремент файлов; мониторинг HTTPS, диска, cron-заданий и очереди — алерты в Telegram
ЕженедельноПолный бэкап файлов (data, custom, конфиг); просмотр логов ошибок и банов fail2ban; контроль роста диска и таблиц БД
ЕжемесячноОбновление до свежего патча: бэкап → тестовая копия → прод в нерабочее время → smoke-чек-лист; ревизия учёток (уволенные, неиспользуемые, права)
ЕжеквартальноТестовое восстановление из бэкапа на чистой VM; чистка очереди заданий, логов и старых вложений; проверка индексов и производительности; ревизия ролей и Field Level Security

Что из этого клиент может делать сам? Честный ответ: всё — если есть кому. Ежедневный блок автоматизируется скриптами один раз и дальше требует только реакции на алерты. Ежемесячные обновления и квартальные восстановления — это те самые 1–3 часа инженера, и вот их я советую отдать тому, кто делает это на потоке: цена ошибки в апгрейде или невосстановимом бэкапе несопоставима со стоимостью абонентки.

На этом эксплуатационная часть серии закрыта: у вас есть регламент обновлений, схема бэкапов 3-2-1, слои харденинга и список типовых инцидентов с лечением. Осталась финальная статья — живой кейс: как мы внедряли EspoCRM бухгалтерской фирме, с цифрами, граблями и результатом в сделках. А если ждать её некогда и вам нужен тот, кто возьмёт вашу CRM на сопровождение уже сейчас, — контакты ниже.

Возьмём вашу self-hosted CRM на сопровождение

ITfresh — IT-аутсорсинг для компаний до 50 рабочих мест в Москве. Обновления, бэкапы по схеме 3-2-1, мониторинг и защита EspoCRM — 1–3 часа инженера в месяц в рамках абонентки. Собственные серверы в дата-центре МТС, 15+ лет опыта. Telegram: @ITfresh_Boss, телефон: +7 903 729-62-41

📞 Связаться с нами
#EspoCRM #self-hosted #бэкапы #безопасность #152-ФЗ #fail2ban #мониторинг #CRM
Комментарии 0

Оставить комментарий

загрузка...

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.