Linux · Docker · HTTPS

Установка CRM7
на ваш сервер

Пошаговая инструкция для технических специалистов: от чистого Ubuntu/Debian до рабочего входа в CRM7 по HTTPS. Без лицензионных ключей и скрытых шагов.

  • Docker Compose
  • MariaDB
  • Caddy и Let's Encrypt
Production · self-hosted

Инструкция рассчитана на Ubuntu 22.04/24.04 или Debian 12+. Нужны root или пользователь с sudo, домен и открытые порты 80/443. CRM7 будет работать в Docker; данные и конфигурация останутся на вашем сервере.

Перед началом сделайте снимок сервера. Дальше мы устанавливаем Docker, создаём базу и меняем конфигурацию. На чистом сервере это безопасно; на рабочем — сначала проверьте, что порты 80/443 свободны.

Требования

01

Сервер

2 vCPU, 4 ГБ RAM, 20 ГБ диска. Для базы и вложений лучше 40 ГБ.

02

Домен

A-запись на IP сервера. Например, crm.example.com.

03

Доступ

SSH, sudo, свободные порты 80 и 443.

Если сервер за NAT или балансировщиком — пробросьте 80/443 на него. Внутренний порт CRM7 (8080) наружу не публикуем.

1. Домен и сервер

  1. Проверьте DNS

    Домен должен указывать на публичный IP сервера. Проверьте с локальной машины:

    getent hosts crm.example.com

    В ответе должен быть IP вашего сервера. Если пусто — подождите обновления DNS.

  2. Подключитесь по SSH

    Все дальнейшие команды выполняются на сервере.

    ssh root@crm.example.com
  3. Обновите систему

    apt update
    apt upgrade -y

2. Docker и Compose

Установите Docker Engine и плагин Compose из официального репозитория. Команды ниже — для Ubuntu/Debian с apt.

apt install -y ca-certificates curl gnupg git
install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" \
  > /etc/apt/sources.list.d/docker.list

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

systemctl enable --now docker
docker --version
docker compose version

Debian: замените ubuntu на debian в URL репозитория Docker. Для других дистрибутивов используйте официальную инструкцию Docker.

3. Каталог проекта

Клонируйте публичный репозиторий. В нём есть пример конфигурации, миграции и скрипт установки начальных пользователей.

mkdir -p /opt/crm7
git clone https://github.com/siteix-ru/crm7.git /opt/crm7
cd /opt/crm7

Создайте каталоги для конфигурации, файлов и базы:

mkdir -p config storage var data/db
cp api/config/.env.example config/.env
chmod 600 config/.env

4. compose.yaml

Создайте файл compose.yaml в корне проекта. Это описание четырёх контейнеров: веб-интерфейс, PHP API, cron и MariaDB.

name: crm7

services:
  web:
    image: ghcr.io/siteix-ru/crm7-web:${CRM7_VERSION}
    restart: unless-stopped
    depends_on: [php]
    ports:
      - "127.0.0.1:8080:80"
    networks: [internal]

  php:
    image: ghcr.io/siteix-ru/crm7-app:${CRM7_VERSION}
    restart: unless-stopped
    environment:
      CRM7_ENV: production
      CRM7_VERSION: ${CRM7_VERSION}
    volumes:
      - ./config:/var/www/html/api/config
      - ./storage:/var/www/html/api/storage
      - ./var:/var/www/html/api/var
    networks:
      internal:
        aliases:
          - crm7-php
    depends_on: [db]

  cron:
    image: ghcr.io/siteix-ru/crm7-app:${CRM7_VERSION}
    restart: unless-stopped
    command: sh -c 'while true; do php /var/www/html/api/bin/cron.php; sleep 60; done'
    volumes:
      - ./config:/var/www/html/api/config
      - ./storage:/var/www/html/api/storage
      - ./var:/var/www/html/api/var
    networks: [internal]
    depends_on: [db]

  db:
    image: mariadb:11
    restart: unless-stopped
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MARIADB_DATABASE: ${DB_NAME}
      MARIADB_USER: ${DB_USER}
      MARIADB_PASSWORD: ${DB_PASS}
    volumes:
      - ./data/db:/var/lib/mysql
    networks: [internal]

networks:
  internal:
docker compose config -q

Команда не запускает контейнеры — только проверяет синтаксис compose-файла.

5. Переменные окружения

Сначала создайте .env для Docker Compose. Пароли сгенерируйте командами openssl rand -hex 24; не используйте примеры из документации.

CRM7_VERSION=1.4.2
DB_NAME=crm7
DB_USER=crm_app
DB_PASS=ЗАМЕНИТЕ_НА_СЛУЧАЙНЫЙ_ПАРОЛЬ
DB_ROOT_PASS=ЗАМЕНИТЕ_НА_ДРУГОЙ_СЛУЧАЙНЫЙ_ПАРОЛЬ
chmod 600 .env

Затем откройте config/.env и заполните параметры приложения. DB_PASS должен совпадать с .env выше.

APP_ENV=production
APP_URL=https://crm.example.com
API_BASE_PATH=/api/v2
CORS_ORIGIN=https://crm.example.com

DB_HOST=db
DB_PORT=3306
DB_NAME=crm7
DB_USER=crm_app
DB_PASS=ЗАМЕНИТЕ_НА_ТОТ_ЖЕ_ПАРОЛЬ

TOKEN_TTL_DAYS=30
LOG_DIR=
APP_TIMEZONE=Europe/Moscow
APP_KEY=ЗАМЕНИТЕ_НА_64_СИМВОЛА_ИЗ_OPENSSL
LEGACY_VENDOR=
openssl rand -hex 32   # APP_KEY
openssl rand -hex 24   # DB_PASS
openssl rand -hex 24   # DB_ROOT_PASS

APP_KEY и пароли — секреты. Не коммитьте их в Git, не отправляйте в чат и не храните в репозитории. config/.env должен быть доступен только владельцу.

APP_URL и CORS_ORIGIN должны совпадать с адресом, по которому открывается CRM7. Если домен другой — замените оба значения и перезапустите php.

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

6. Запуск и миграции

  1. Запустите базу

    docker compose up -d db
    docker compose exec -T db sh -c \
      'until mariadb-admin ping -uroot -p"$MARIADB_ROOT_PASSWORD" --silent; do sleep 1; done'
    docker compose ps
  2. Примените миграции

    docker compose run --rm php php bin/migrate.php
  3. Создайте первого пользователя

    Скрипт создаст администратора и несколько служебных учётных записей. Задайте сильный пароль; после первого входа смените его и отключите лишние аккаунты.

    docker compose run --rm php \
      php bin/seed-dev.php --password='СИЛЬНЫЙ_ПАРОЛЬ'
  4. Поднимите приложение

    docker compose up -d
    docker compose ps

    Проверьте локальный health:

    curl -fsS http://127.0.0.1:8080/api/v2/health

    Ожидаемый ответ: {"ok":true,...}.

7. HTTPS и домен

Наружу публикуем только reverse proxy на 80/443. Сам CRM7 слушает 127.0.0.1:8080. Ниже — пример для Caddy на хосте.

crm.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8080
}

Добавьте блок в /etc/caddy/Caddyfile, проверьте конфигурацию и перезагрузите Caddy:

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

Caddy автоматически выпустит сертификат Let's Encrypt, если DNS уже указывает на сервер и порты 80/443 открыты. Если используете nginx — проксируйте https://crm.example.com на http://127.0.0.1:8080 и настройте сертификат через certbot.

Проверьте firewall. Откройте 80/443 и не открывайте 8080 наружу: ufw allow 80/tcp && ufw allow 443/tcp.

8. Проверка после установки

  • https://crm.example.com открывает экран входа;
  • https://crm.example.com/api/v2/health возвращает ok;
  • вход под администратором работает;
  • создаётся тестовая заявка и клиент;
  • docker compose ps — все четыре контейнера Up;
  • в логах нет повторяющихся ошибок.
docker compose ps
docker compose logs --tail=50 web php cron db

9. Первый вход и безопасность

Экран входа CRM7 после установки
Экран входа. Логин администратора создаётся на шаге 6.
  • войдите как admin с паролем из шага 6;
  • сразу смените пароль администратора;
  • отключите или удалите служебные учётные записи, созданные seed-dev;
  • создайте реальных пользователей и роли;
  • настройте резервное копирование базы и каталога storage/;
  • не храните config/.env в Git.

seed-dev — временный шаг. Он создаёт admin, administrator, manager, manager2 и client. Для production оставьте только нужные учётные записи и смените пароли.

10. Обновления и обслуживание

Обновления и резервное копирование вынесены в отдельную бесплатную базу знаний. Там есть инструкции для админки и консоли, скриншоты и разбор ошибок.

Открыть инструкции по обновлению →

  • перед обновлением делайте дамп базы;
  • не запускайте два обновления одновременно;
  • после обновления проверяйте /api/v2/health;
  • храните config/.env и backup отдельно от сервера.

Если что-то не так

Порт 80/443 занят

Остановите другой веб-сервер или освободите порт. Проверьте: ss -ltnp | grep -E ':80|:443'.

Не проходит health

Проверьте docker compose ps, логи php и db, а также config/.env: хост базы должен быть db, а пароль — совпадать с compose.

Не выпускается сертификат

Проверьте A-запись, доступность портов 80/443 и логи Caddy. Домен должен открываться снаружи до запуска Caddy.

Ошибка миграции

Не удаляйте базу. Проверьте, что контейнер db здоров, а config/.env указывает на правильную базу. Пришлите лог миграции.

Нужна помощь с установкой? Это техническая инструкция, но если что-то не сходится — напишите нам: crm7.ru/#contact.