Удельта

Пошаговая инструкция · Самостоятельная установка

Как установить EspoCRM на сервер

Пошаговая инструкция для самостоятельной установки. Установим EspoCRM на Ubuntu 26.04: настроим контейнеры, HTTPS, пользователей и почту, проверим первую сделку и резервную копию.

Настройка CRM: карточка клиента связана с письмом, звонком и папкой сделки

Что понадобится и где выполнять команды #

Установим EspoCRM 10.0.9 — CRM для клиентов, сделок и задач. Официальный Docker-образ содержит нужный PHP; на хосте Ubuntu 26.04 PHP отдельно не устанавливаем. MariaDB хранит записи, контейнер web показывает CRM, daemon выполняет фоновые задания, например проверку почты.

Подготовьте отдельный сервер Ubuntu 26.04 LTS по общей инструкции: доступ по SSH, Docker Engine, Docker Compose и Nginx. Docker запускает приложение в контейнерах — отдельных окружениях с нужными зависимостями. Compose читает файл, в котором описаны все контейнеры и их связи. Nginx будет принимать HTTPS-запросы из браузера и передавать их приложению.

Все команды выполняйте в SSH-терминале сервера. Домен crm.example.org в примерах заменяйте своим. В DNS-панели создайте A-запись с публичным IPv4 сервера; проверьте её командой getent ahostsv4 crm.example.org. Без правильного адреса сертификат не будет выпущен. Нужны входящие порты 80/443 и SSH; базы данных снаружи не открывайте. Выбор сервера для EspoCRM поможет рассчитать ресурсы.

Перед работой выполните docker compose version: команда должна показать Compose v2. Если доступ к Docker запрещён, завершите настройку доступа из общей инструкции и заново войдите по SSH. В nano файл сохраняется клавишами Ctrl+O и Enter, редактор закрывается Ctrl+X. Примеры конфигурации записывают в файл, а не запускают как команды.

Настройка внешнего доступа использует обратный прокси Nginx и Certbot для Nginx. Приложение остаётся доступным на локальном порту; снаружи открыт его HTTPS-домен.

Шаг 1. Создайте каталог установки #

Каталог /opt/espocrm будет принадлежать вашему пользователю. Подкаталоги сохранят данные и доработки между заменами контейнера. Не монтируйте весь код /var/www/html: он приходит с образом.

Создайте каталог установки
sudo install -d -m 750 -o "$USER" -g "$(id -gn)" /opt/espocrm
cd /opt/espocrm
mkdir -p data custom client-custom

Далее выполняйте Compose-команды из /opt/espocrm. В новом SSH-сеансе сначала вернитесь сюда командой cd.

Шаг 2. Создайте пароли базы и администратора #

Команда автоматически генерирует три разных секрета и сохраняет их в .env. Этот файл Compose прочитает при запуске. Не выполняйте команду повторно после создания базы: смена строки в .env не меняет уже действующий пароль базы.

Создайте пароли базы и администратора
umask 077
printf 'DB_PASSWORD=%s\nDB_ROOT_PASSWORD=%s\nADMIN_PASSWORD=%s\n' "$(openssl rand -hex 24)" "$(openssl rand -hex 24)" "$(openssl rand -hex 24)" > .env
chmod 600 .env

Откройте nano .env и сохраните ADMIN_PASSWORD в менеджере паролей: он понадобится для первого входа. Закрыть nano без изменений можно Ctrl+X. Не пересылайте весь файл.

Шаг 3. Сохраните конфигурацию контейнеров #

Откройте nano compose.yaml и вставьте весь файл ниже. Замените crm.example.org на свой домен в ESPOCRM_SITE_URL. YAML чувствителен к отступам: используйте пробелы, не Tab. Сохраните Ctrl+O, Enter, Ctrl+X. База доступна только контейнерам, а сайт — локально на порту 8080.

Сохраните конфигурацию контейнеров
services:
  db:
    image: mariadb:11.4
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: espocrm
      MARIADB_USER: espocrm
      MARIADB_PASSWORD: ${DB_PASSWORD:?}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:?}
    volumes:
      - database:/var/lib/mysql
    healthcheck:
      test: [CMD, healthcheck.sh, --connect, --innodb_initialized]
      interval: 10s
      timeout: 5s
      retries: 10
  web:
    image: espocrm/espocrm:10.0.9
    restart: unless-stopped
    environment:
      ESPOCRM_DATABASE_HOST: db
      ESPOCRM_DATABASE_NAME: espocrm
      ESPOCRM_DATABASE_USER: espocrm
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASSWORD:?}
      ESPOCRM_ADMIN_USERNAME: crm-admin
      ESPOCRM_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?}
      ESPOCRM_SITE_URL: https://crm.example.org
    ports:
      - 127.0.0.1:8080:80
    volumes: &crm-files
      - ./data:/var/www/html/data
      - ./custom:/var/www/html/custom
      - ./client-custom:/var/www/html/client/custom
    depends_on:
      db:
        condition: service_healthy
  daemon:
    image: espocrm/espocrm:10.0.9
    restart: unless-stopped
    entrypoint: docker-daemon.sh
    volumes: *crm-files
    depends_on:
      - web
volumes:
  database:

Оба контейнера CRM используют 10.0.9 и общие каталоги. Символ &crm-files и строка *crm-files позволяют повторно использовать один список файлов; удалять их не нужно.

Шаг 4. Проверьте Compose #

Проверка читает .env и compose.yaml, но ещё не запускает приложение. --quiet не выводит подставленные пароли.

Проверьте Compose
docker compose config --quiet

При успехе вывода нет. Если ошибка указывает на отступ или отсутствующую переменную, исправьте соответствующий файл и повторите проверку.

Шаг 5. Скачайте образы выбранных версий #

Загрузим MariaDB и официальный образ EspoCRM. Web и daemon используют один образ, поэтому Docker не скачивает его дважды.

Скачайте образы выбранных версий
docker compose pull

Все загрузки должны завершиться успешно. Не продолжайте при denied, not found или незавершённой загрузке.

Шаг 6. Запустите CRM #

Compose сначала дождётся готовности MariaDB, затем запустит приложение и фоновые задания. Первый запуск создаёт базу и администратора crm-admin.

Запустите CRM
docker compose up -d

Инициализация занимает время. Не запускайте повторную установку, пока не посмотрели состояние и журналы в следующем шаге.

Шаг 7. Проверьте все три сервиса #

Посмотрим, что база, web и daemon работают. Статус Restarting означает, что сервис не может нормально запуститься; его нужно проверить до подключения домена.

Проверьте все три сервиса
docker compose ps
docker compose logs --tail=60 web daemon

Ожидается работа всех сервисов, у базы — healthy. Если журнал сообщает об ошибке записи в data/custom, разберите права каталогов; не выдавайте 777 всему проекту.

Шаг 8. Проверьте локальный адрес CRM #

curl проверяет ответ без браузера и Nginx. Адрес 127.0.0.1 доступен только на самом сервере, поэтому порт 8080 не нужно открывать в сетевом экране.

Проверьте локальный адрес CRM
curl -I http://127.0.0.1:8080

200 или перенаправление на вход допустимы. Если Connection refused или 500, вернитесь к журналам web и базы.

Шаг 9. Сохраните сайт Nginx #

Установите Nginx и Certbot по подготовке Ubuntu, если ещё не установили. Откройте sudo nano /etc/nginx/sites-available/espocrm и вставьте файл ниже. Замените все домены своими. Nginx передаёт приложению домен, адрес клиента и протокол; Upgrade и Connection сохраняют WebSocket. До получения сертификата условие $scheme блокирует обычные HTTP-запросы кодом 403, чтобы вход не происходил без шифрования.

Файл /etc/nginx/sites-available/espocrm
map $http_upgrade $espocrm_connection_upgrade {
    default upgrade;
    "" close;
}

server {
    listen 80;
    server_name crm.example.org;
    client_max_body_size 100m;
    location / {
        if ($scheme = http) { return 403; }
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $espocrm_connection_upgrade;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_buffering off;
    }
}

Сохраните Ctrl+O, Enter, Ctrl+X. В файле пока нет путей к сертификатам: Nginx сможет проверить его до выпуска HTTPS.

Шаг 10. Подключите сайт и проверьте HTTP #

Ссылка подключает сохранённый сайт. nginx -t проверяет все настройки сервера; && разрешает перечитать их только при успешной проверке. curl проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.

Подключите сайт и проверьте HTTP
sudo ln -sfn /etc/nginx/sites-available/espocrm /etc/nginx/sites-enabled/espocrm
sudo nginx -t && sudo systemctl reload nginx
curl -I http://crm.example.org/

Ожидается successful от nginx -t и HTTP 403 для обычного запроса: до HTTPS это намеренная блокировка. DNS должен указывать на сервер, TCP 80/443 — быть доступен у провайдера. Ничего не вводите в форму входа по HTTP.

Шаг 11. Получите сертификат и включите HTTPS #

Каждое имя из команды должно указывать на этот сервер. Certbot проверит домены, сам добавит сертификат в сайт Nginx и включит перенаправление HTTP → HTTPS. Укажите свою почту при запросе и подтвердите условия Let’s Encrypt. Это отдельное действие после успешной проверки HTTP.

Получите сертификат и включите HTTPS
sudo /snap/bin/certbot --nginx -d crm.example.org --redirect

Certbot сообщил об успешной установке. Откройте HTTPS-адрес со своего компьютера: браузер не должен предупреждать о сертификате. Для закрытой панели используйте разрешённый IP. При ошибке исправьте DNS, в том числе AAAA, либо доступ к TCP 80; не повторяйте запросы выпуска подряд.

Шаг 12. Проверьте продление сертификата #

Certbot из snap создаёт службу автоматического продления. Dry-run выполняет пробное продление: настоящие сертификаты не заменяются. Затем проверьте, что таймер планирует следующий запуск. Сохраняйте доступ к TCP 80 для следующих проверок домена.

Проверьте продление сертификата
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all 'snap.certbot.renew*'

Пробное продление успешно, у таймера есть следующий запуск. Если тест не прошёл, проверьте /var/log/letsencrypt/letsencrypt.log; сначала исправьте причину. После этого можно создавать учётную запись и приглашать пользователей.

Шаг 13. Войдите и настройте учётную запись #

В браузере используйте логин crm-admin и ADMIN_PASSWORD из .env. Измените пароль в профиле, задайте рабочий email администратора и сохраните новые данные входа. Пароль администратора в уже созданной базе не заменяется простым редактированием ADMIN_PASSWORD.

Выйдите и войдите с новым паролем. Проверьте, что выбранный email доступен вам для дальнейших уведомлений.

Шаг 14. Настройте язык, время и валюту #

В административных настройках выберите язык команды, часовой пояс и рабочую валюту. Эти настройки влияют на отображение дат встреч и сумм сделок. Создайте одну тестовую встречу с понятным временем.

Откройте встречу и убедитесь, что время соответствует вашему часовому поясу. Поправьте это до импорта рабочих данных.

Шаг 15. Создайте сотрудника с ограниченными правами #

В администрации создайте роль для сотрудника, разрешив нужные действия с клиентами и сделками. Затем создайте отдельную учётную запись и назначьте эту роль. Административный доступ не нужен каждому менеджеру.

Войдите под сотрудником в другом браузере. Он должен видеть доступные записи и не должен получать лишние административные возможности.

Шаг 16. Настройте отправку писем #

В административных настройках исходящей почты заполните SMTP-сервер, порт, режим шифрования, логин и пароль по данным провайдера. SMTP отвечает за отправку. Укажите разрешённый email отправителя и отправьте тестовое письмо.

Проверьте получение письма и папку «Спам». Если SMTP отклоняет отправителя, исправьте email или разрешения у провайдера; повторяйте тест до успеха.

Шаг 17. Подключите входящую почту при необходимости #

Если CRM должна получать письма, создайте почтовую учётную запись и заполните IMAP-данные провайдера. IMAP позволяет читать почтовый ящик. Для первой проверки используйте отдельный тестовый ящик и отправьте туда письмо с другого адреса.

Письмо должно появиться в CRM после работы фонового задания. Если исходящие письма работают, а входящие нет, отдельно проверьте IMAP и контейнер daemon.

Шаг 18. Пройдите первую сделку от начала до конца #

Создайте тестового клиента, контакт и сделку с небольшой суммой. Назначьте сделку сотруднику, добавьте задачу и небольшое вложение. Затем войдите как этот сотрудник и переведите сделку в другой этап.

Записи, задача, этап и вложение должны сохраняться после обновления страницы. Проверьте, что другой пользователь видит ровно то, что ему разрешает роль.

Шаг 19. Убедитесь, что фоновые задания выполняются #

Откройте в администрации список заданий и проверьте их статус/время последнего выполнения. Фоновые задания выполняет daemon независимо от посещения страницы. В терминале при необходимости посмотрите его журнал.

Убедитесь, что фоновые задания выполняются
docker compose logs --tail=80 daemon

Не должно быть повторяющейся ошибки доступа к конфигурации или базе. Проверка почты и другие задания должны запускаться; один работающий интерфейс этого не доказывает.

Шаг 20. Создайте дамп базы #

Предупредите сотрудников о перерыве. Остановим web и daemon, чтобы база и вложения не менялись. Переменную CRM_BACKUP используем и на следующем шаге в том же терминале. При ошибке сразу верните приложение через docker compose up -d web daemon.

Создайте дамп базы
umask 077
CRM_BACKUP="$HOME/espocrm-backup-$(date +%F-%H%M)"
mkdir -p "$CRM_BACKUP"
docker compose stop web daemon
docker compose exec -T db sh -c 'exec mariadb-dump --single-transaction -uespocrm -p"$MARIADB_PASSWORD" espocrm' > "$CRM_BACKUP/database.sql"

mariadb-dump должен завершиться без ошибки. При отказе входа проверьте пароль и имя базы, не считая пустой database.sql успешной копией.

Шаг 21. Добавьте файлы и верните работу #

Архив включает вложения, доработки и секреты подключения. После создания включим CRM снова и проверим размер копии.

Добавьте файлы и верните работу
sudo tar -czpf "$CRM_BACKUP/files.tar.gz" data custom client-custom compose.yaml .env
docker compose up -d web daemon
ls -lh "$CRM_BACKUP"

Оба файла должны быть ненулевыми; сайт и тестовое вложение должны открываться. Перенесите копию через SFTP в закрытое хранилище вне сервера.

Шаг 22. Проверьте восстановление на отдельной машине #

Подготовьте изолированную установку с теми же версиями, верните .env и архив каталогов, импортируйте SQL по официальному порядку. Не восстанавливайте пробную копию поверх рабочей CRM. На тестовой машине отключите отправку рабочих писем.

После восстановления должны работать старый клиент, сделка, роли и скачивание вложения. Только такой тест подтверждает, что копия пригодна для возврата данных.

Если возникла ошибка или пора обновляться #

Команды Compose работают из каталога /opt/espocrm. Посмотрите состояние через docker compose ps --all и последние сообщения через docker compose logs --tail=100 web daemon db. Не запускайте всю установку заново при первой ошибке: сначала найдите конкретный сервис и сообщение. 502 в браузере обычно означает, что Nginx не может получить ответ приложения; сначала проверьте локальный адрес из инструкции.

При обновлении меняйте образ одновременно у web и daemon, сохраняя каталоги data, custom и client/custom. Сначала проверьте совместимость установленных расширений с выбранной версией. Подробности — в официальном обновлении.

Перед обновлением сохраните свежую полную копию, выберите конкретный релиз и прочитайте его примечания. Проверяйте обновление на отдельной машине с восстановленной копией. Если меняется схема базы, возврат одного старого образа не заменяет возврат совместимого дампа. Менять основную версию базы отдельным тегом без процедуры переноса данных нельзя.

Настройки внешнего доступа храните вместе с копией приложения: /etc/nginx/sites-available/espocrm и /etc/letsencrypt содержат сайт и сертификаты с закрытыми ключами. Архивируйте их с sudo в закрытое хранилище. После восстановления подключите сайт через sites-enabled, выполните sudo nginx -t, затем перечитайте Nginx. Для ошибки 502 сначала проверьте локальное приложение и /var/log/nginx/error.log; для сертификата — /var/log/letsencrypt/letsencrypt.log и таймер продления.

Обсудить установку и настройку

Материал был полезен?

Сообщить об ошибке или задать вопрос редакции

Сообщение увидит редакция. Не указывайте пароли и личные данные. Текст удаляется через 180 дней.

О материале

ИнфраструктураРуководствоЗадача: установитьУровень: практикаEspoCRM

Последнее обновление:

Обсуждение

Комментарии проходят подтверждение адреса и проверку редакцией.