Инструкция рассчитана на Ubuntu 22.04/24.04 или Debian 12+. Нужны
root или пользователь с sudo, домен и открытые
порты 80/443. CRM7 будет работать в Docker;
данные и конфигурация останутся на вашем сервере.
Перед началом сделайте снимок сервера. Дальше мы устанавливаем Docker, создаём базу и меняем конфигурацию. На чистом сервере это безопасно; на рабочем — сначала проверьте, что порты 80/443 свободны.
Требования
Сервер
2 vCPU, 4 ГБ RAM, 20 ГБ диска. Для базы и вложений лучше 40 ГБ.
Домен
A-запись на IP сервера. Например, crm.example.com.
Доступ
SSH, sudo, свободные порты 80 и 443.
Если сервер за NAT или балансировщиком — пробросьте 80/443 на него.
Внутренний порт CRM7 (8080) наружу не публикуем.
1. Домен и сервер
-
Проверьте DNS
Домен должен указывать на публичный IP сервера. Проверьте с локальной машины:
getent hosts crm.example.comВ ответе должен быть IP вашего сервера. Если пусто — подождите обновления DNS.
-
Подключитесь по SSH
Все дальнейшие команды выполняются на сервере.
ssh root@crm.example.com -
Обновите систему
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.
6. Запуск и миграции
-
Запустите базу
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 -
Примените миграции
docker compose run --rm php php bin/migrate.php -
Создайте первого пользователя
Скрипт создаст администратора и несколько служебных учётных записей. Задайте сильный пароль; после первого входа смените его и отключите лишние аккаунты.
docker compose run --rm php \ php bin/seed-dev.php --password='СИЛЬНЫЙ_ПАРОЛЬ' -
Поднимите приложение
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. Первый вход и безопасность
- войдите как
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.