NNova CMSцентр знаний
От первого файла до работающего магазина

Установка Nova CMS

Выберите инструкцию по своему опыту. Для обычного хостинга — каждый шаг простыми словами. Для VPS — требования, конфигурация веб-сервера, права, cron, диагностика и безопасное обновление.

Сначала выберите свой вариант

Путь A

Обычный хостинг

Подходит, если у вас есть панель Beget, Timeweb, REG.RU, cPanel, ISPmanager или похожая. Командная строка не нужна.

  • Один установочный PHP-файл
  • Файловый менеджер в панели
  • Обычно 10–20 минут
Открыть простую инструкцию
Путь B

VPS или выделенный сервер

Подходит системному администратору с SSH-доступом и правами на настройку Nginx или Apache, PHP-FPM, cron и TLS.

  • Готовые конфигурации
  • Проверка прав и закрытых каталогов
  • Команды диагностики и возврата
Открыть техническую инструкцию
Пароль от хостинга передавать не нужноПосле одобрения заявки вы получите персональную ссылку. Установщик сам скачает подписанную сборку по HTTPS, проверит домен и целостность файлов.

Путь A. Установка для обычного пользователя

Этот раздел написан для человека, который раньше не устанавливал CMS. Выполняйте пункты по порядку и не пропускайте проверки.

Небольшой словарь

Домен

Адрес сайта, например example.ru.

Хостинг

Место, где хранятся файлы сайта.

Корневая папка

Папка, содержимое которой открывается по вашему домену. Часто называется public_html, www или httpdocs.

PHP

Программа на сервере, которая запускает Nova CMS. Нужна версия 8.2 или новее.

HTTPS / SSL

Защищённое соединение. В адресной строке должен быть замок и адрес должен начинаться с https://.

Резервная копия

Копия сайта, из которой можно восстановиться после ошибки.

1. Что подготовить заранее

  • Зарегистрированный домен.
  • Тариф хостинга с PHP 8.2 или 8.3.
  • Доступ в панель управления хостингом.
  • Работающий email, на который придёт персональная ссылка.
  • Пустая корневая папка домена.
  • Включённый бесплатный SSL-сертификат.
Если на домене уже есть сайтНе устанавливайте Nova CMS поверх него. Сначала скачайте резервную копию старого сайта или создайте отдельный поддомен, например test.example.ru.

Как проверить PHP и HTTPS

  1. Откройте в панели хостинга раздел «Сайты», «Домены» или «PHP».
  2. Выберите для домена PHP 8.2 или PHP 8.3.
  3. Включите SSL-сертификат Let's Encrypt.
  4. Откройте домен через https://. Предупреждения о небезопасном соединении быть не должно.
  5. Если нужной версии PHP или SSL нет, напишите в поддержку хостинга: «Нужны PHP 8.2+, Sodium, mbstring, DOM/XML, ZIP, cURL и HTTPS».

2. Подайте заявку и получите письмо

  1. Откройте форму заявки на лицензию.
  2. Укажите имя, рабочий email и основной домен без https://.
  3. Если нужен поддомен, добавьте его в заявку отдельно.
  4. Подтвердите email по ссылке из первого письма.
  5. После одобрения дождитесь письма с темой «Ваша Nova CMS готова — установка одним файлом».
  6. Откройте персональную ссылку и скачайте файл вида nova-installer-abc123.php.

Если письмо не пришло в течение 5–10 минут, проверьте папки «Спам», «Рассылки» и «Промоакции». Затем напишите на license@nova-cms.ru и укажите только домен и email заявки.

3. Загрузите один файл через панель хостинга

Панель хостингаСайтыВаш доменФайлыКорневая папка
  1. Войдите в панель хостинга.
  2. Откройте список сайтов и нажмите на нужный домен.
  3. Найдите строку «Корневая папка», «Document root» или «Папка сайта» и запомните путь.
  4. Откройте файловый менеджер и перейдите именно в эту папку.
  5. Если внутри лежит стандартный файл index.html от хостинга, убедитесь, что это не нужный сайт, и удалите только этот демонстрационный файл.
  6. Нажмите «Загрузить» и выберите скачанный nova-installer-….php.
  7. Дождитесь полной загрузки. Размер файла не должен быть равен нулю.
  8. Нажмите на имя файла и скопируйте его точное название.
Пример адреса установщикаЕсли домен example.ru, а файл называется nova-installer-x7k2.php, откройте в браузере https://example.ru/nova-installer-x7k2.php.

4. Проверьте экран установки

Установщик покажет список условий. Зелёная галочка означает «всё готово». Красный крест означает, что сначала нужно исправить настройку.

ПроверкаЧто означаетЧто делать, если красная
PHP 8.2 или новееНа сервере выбрана подходящая версия PHP.Смените версию PHP для домена в панели.
HTTPS включёнСайт открывается через защищённое соединение.Включите бесплатный SSL и подождите 5–30 минут.
JSON, Mbstring, DOM/XML, ZIPНужные модули PHP доступны.Включите расширения в панели или обратитесь в поддержку хостинга.
SodiumСервер может проверить цифровую подпись сборки.Попросите хостинг включить расширение Sodium для PHP.
Загрузка по HTTPSСервер может получить персональную сборку.Попросите разрешить исходящие HTTPS-запросы и cURL.
Домен входит в лицензиюТекущий адрес совпадает с заявкой.Откройте установщик на правильном домене. Для www и без www оба адреса должны быть в лицензии.
Корень доступен для записиPHP может распаковать файлы CMS.Попросите поддержку хостинга выдать PHP право записи в корневую папку.
Корень сайта свободенУстановщик не перезапишет другой сайт.Очистите только демонстрационные файлы или выберите пустой поддомен.

5. Если установка не начинается

«Домен не входит в лицензию»

Проверьте адрес в строке браузера. Если лицензия выпущена для example.ru, а установщик открыт на другом поддомене, он не запустится. Напишите в поддержку и попросите добавить нужный адрес.

«Расширение Sodium недоступно»

Это не ошибка CMS. На сервере выключен модуль проверки подписи. Передайте поддержке хостинга точную фразу: «Включите PHP Sodium для моего домена на PHP 8.2/8.3».

Белая страница или ошибка 500

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

Ошибка 403

Убедитесь, что файл лежит в корневой папке домена. Ошибка 403 у адресов /data/, /backups/ и /lib/ после установки является правильной защитой.

6. Нажмите «Установить Nova CMS»

  1. Убедитесь, что все обязательные проверки зелёные.
  2. Проверьте домен над кнопкой.
  3. Поставьте галочку подтверждения установки в корневую папку.
  4. Нажмите «Установить Nova CMS» один раз и не закрывайте вкладку.
  5. Дождитесь сообщения об успешной распаковке.
  6. Прочитайте лицензионное соглашение и подтвердите согласие.
  7. Создайте отдельный пароль администратора длиной не менее 12 символов.
  8. Сохраните пароль в менеджере паролей. Не используйте пароль от хостинга.
После установкиОдноразовый установщик удалит секретный токен и откроет создание пароля. Адрес админки: https://ваш-домен.ru/admin. Логин первого администратора: admin.

7. Что заполнить перед открытием магазина

  1. Настройки: название, логотип, телефон, email, город и режим работы.
  2. Правовые тексты: реквизиты, политика конфиденциальности, cookie, оферта, оплата и возврат.
  3. Доставка: самовывоз, курьер и транспортные компании.
  4. Оплата: сначала тестовый режим, затем настоящие данные.
  5. Каталог: категории, хотя бы один тестовый товар, фотографии, остаток и цена.
  6. Резервные копии: создайте ручную копию и скачайте её.
  7. Проверка: оформите заказ с телефона и компьютера, убедитесь, что заказ появился в админке.
  • Главная, каталог, товар, корзина и оформление заказа открываются.
  • Письма приходят на настоящий email.
  • На сайте нет демонстрационных телефонов и реквизитов.
  • Адреса работают без .php.
  • Карта сайта доступна по /sitemap.xml.
  • Папки /data/ и /backups/ не открываются посетителю.
На этом простая установка законченаСледующий раздел нужен только тем, кто самостоятельно настраивает VPS. На обычном хостинге его можно не читать.

Путь B. Установка на VPS для системного администратора

Ниже приведён рабочий контрольный список для Debian/Ubuntu и типовой конфигурации PHP-FPM. Имена пользователя, домена, пути и сокета PHP замените на свои.

1. Требования и архитектура

КомпонентМинимумРекомендуется
PHP8.28.3 FPM, production
Обязательные расширенияjson, mbstring, sodium, openssl, curl, fileinfo, zipДополнительно gd для WebP и intl для IDN
memory_limit128M256M или больше для Excel и backup
upload_max_filesize12M32M или по размеру каталога
Веб-серверApache 2.4 или NginxNginx + PHP-FPM, TLS 1.2/1.3
Диск300 МБОт 2 ГБ с учётом фото и семи копий
База данныхНе требуетсяJSON хранится в закрытом каталоге data
apt update apt install -y nginx php8.3-fpm php8.3-cli php8.3-mbstring php8.3-curl \ php8.3-zip php8.3-gd php8.3-intl unzip certbot python3-certbot-nginx php -r 'foreach (["json","mbstring","sodium","openssl","curl","fileinfo","zip"] as $e) echo $e,": ",extension_loaded($e)?"OK":"MISSING",PHP_EOL;'

Размещение

Пример далее использует домен shop.example.ru, корень /var/www/shop.example.ru, группу веб-сервера www-data и сокет /run/php/php8.3-fpm.sock. CMS должна находиться непосредственно в document root, а не в публичной подпапке другой системы.

2. Подготовка домена и каталога

install -d -o deploy -g www-data -m 0750 /var/www/shop.example.ru # Загрузите персональный nova-installer-....php в этот каталог. ls -la /var/www/shop.example.ru php -v php -m | grep -Ei 'mbstring|sodium|curl|fileinfo|zip'

DNS A/AAAA должен указывать на сервер до выпуска сертификата. Убедитесь, что порт 80 доступен для ACME-проверки, а 443 — для посетителей.

3A. Конфигурация Nginx

Эта схема не исполняет произвольные PHP-файлы по URL. Все динамические запросы передаются в router.php, а служебные каталоги и типы файлов закрыты.

Сертификат выпускается до включения HTTPS-блокаСначала включите временный VirtualHost только на порту 80, проверьте DNS и выпустите сертификат. Если сразу включить конфигурацию с путями к ещё несуществующим сертификатам, nginx -t завершится ошибкой.
server { listen 80; server_name shop.example.ru www.shop.example.ru; root /var/www/shop.example.ru; location /.well-known/acme-challenge/ { try_files $uri =404; } location / { return 200 "TLS preparation\n"; } } nginx -t && systemctl reload nginx certbot certonly --webroot -w /var/www/shop.example.ru \ -d shop.example.ru -d www.shop.example.ru

После появления файлов в /etc/letsencrypt/live/shop.example.ru/ замените временный блок полной конфигурацией ниже, снова выполните nginx -t и перезагрузите Nginx.

server { listen 80; server_name shop.example.ru www.shop.example.ru; root /var/www/shop.example.ru; location /.well-known/acme-challenge/ { try_files $uri =404; } location / { return 301 https://shop.example.ru$request_uri; } } server { listen 443 ssl http2; server_name shop.example.ru www.shop.example.ru; root /var/www/shop.example.ru; index disabled; server_tokens off; client_max_body_size 32m; ssl_certificate /etc/letsencrypt/live/shop.example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/shop.example.ru/privkey.pem; location ~ ^/(?:data|lib|templates|cache|backups|scripts|exports|deploy|dist)(?:/|$) { return 404; } location ~ /\.(?!well-known/) { return 404; } location ~* ^/(?:README|LICENSE|SECURITY)(?:\.[^/]+)?$ { return 404; } location ~* \.(?:php|phtml|phar|inc|json|ndjson|log|lock|ini|env|bak|backup|old|orig|save|swp|sql|sqlite|db|yml|yaml|toml|dist|map|sh)$ { return 404; } location /assets/ { try_files $uri =404; add_header X-Content-Type-Options nosniff always; expires 7d; } location = /sitemap.xml { try_files $uri =404; } location = / { try_files /__nova_front_controller__ @novacms; } location / { try_files $uri @novacms; } location @novacms { include fastcgi_params; fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root/router.php; fastcgi_param SCRIPT_NAME /router.php; fastcgi_param HTTP_PROXY ""; } }
nginx -t systemctl reload nginx systemctl status php8.3-fpm --no-pager

3B. Конфигурация Apache

Предпочтительный вариант — правила в VirtualHost и AllowOverride None. На обычном shared-хостинге допускается штатный .htaccess при включённых mod_rewrite и AllowOverride All.

<VirtualHost *:443> ServerName shop.example.ru ServerAlias www.shop.example.ru DocumentRoot "/var/www/shop.example.ru" ServerSignature Off SSLEngine on SSLCertificateFile /etc/letsencrypt/live/shop.example.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/shop.example.ru/privkey.pem <Directory "/var/www/shop.example.ru"> AllowOverride None Options -Indexes -MultiViews DirectoryIndex disabled Require all granted RewriteEngine On RewriteRule (^|/)\. - [F,END,NC] RewriteRule ^(?:data|lib|templates|cache|backups|scripts|exports|deploy|dist)(?:/|$) - [F,END,NC] RewriteRule ^$ router.php [QSA,END] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ router.php [QSA,END] </Directory> <DirectoryMatch "^/var/www/shop.example.ru/(?:data|lib|templates|cache|backups|scripts|exports|deploy|dist)(?:/|$)"> Require all denied </DirectoryMatch> </VirtualHost>

Полные примеры поставляются в deploy/nginx-novamarket.conf.example и deploy/apache-vhost.conf.example. Перед применением сравните их с конфигурацией текущей версии.

4. Владельцы, права и закрытые данные

Программный код не должен быть доступен для записи веб-процессу. На время однофайловой установки document root должен быть записываемым PHP; после установки ужесточите права и оставьте запись только для рабочих каталогов.

chown -R deploy:www-data /var/www/shop.example.ru find /var/www/shop.example.ru -type d -exec chmod 0750 {} \; find /var/www/shop.example.ru -type f -exec chmod 0640 {} \; # Только рабочие каталоги доступны группе PHP для записи: for dir in data cache backups assets/uploads; do chown -R deploy:www-data "/var/www/shop.example.ru/$dir" chmod -R g+rwX "/var/www/shop.example.ru/$dir" done # Конфигурация и секреты — максимально строго: chmod 0640 /var/www/shop.example.ru/config.php 2>/dev/null || true chmod 0640 /var/www/shop.example.ru/data/.app_secret 2>/dev/null || true
Не используйте 777Если запись не работает, исправьте владельца и группу процесса PHP-FPM. Рекурсивный chmod 777 скрывает причину и ослабляет сервер.

PHP-FPM

В pool-конфигурации используйте отдельного системного пользователя сайта при размещении нескольких клиентов на одном VPS. Ограничьте open_basedir только после полного теста импорта, backup и обновлений. В production установите display_errors=Off, log_errors=On, корректный date.timezone и лимиты загрузки.

5. TLS и первый запуск

certbot certificates certbot renew --dry-run curl -I https://shop.example.ru/
  1. Откройте персональный установщик по HTTPS.
  2. Проверьте Sodium, ZIP, исходящий HTTPS, домен и write-access.
  3. Установите CMS и создайте пароль администратора.
  4. Удалите оставшиеся временные установочные файлы, если они не удалились автоматически.
  5. Ужесточите права согласно предыдущему разделу.
  6. Проверьте, что прямой запрос к произвольному .php не исполняется.

6. Cron, backup, поиск и worker обновлений

Используйте PHP CLI той же основной версии и абсолютные пути. Пользователь cron должен иметь только необходимые права. Worker обновлений на защищённой VPS-схеме запускается от root, если программный код принадлежит root и недоступен PHP для записи.

0 23 * * * /usr/bin/php /var/www/shop.example.ru/scripts/backup-cron.php >> /var/log/nova-backup.log 2>&1 */20 * * * * /usr/bin/php /var/www/shop.example.ru/scripts/rebuild-search-index.php >> /var/log/nova-search.log 2>&1 * * * * * /usr/bin/flock -n /run/nova-update.lock /usr/bin/php /var/www/shop.example.ru/scripts/cms-update-worker.php >> /var/log/nova-update.log 2>&1 * * * * * /usr/bin/flock -n /run/nova-shop-mail.lock /usr/bin/php /var/www/shop.example.ru/scripts/shop-mail-worker.php >> /var/log/nova-shop-mail.log 2>&1

Проверьте часовой пояс сервера командой timedatectl. После создания задания запустите каждый скрипт вручную один раз и проверьте код возврата и журнал.

7. Диагностика после установки

php -l /var/www/shop.example.ru/router.php nginx -t systemctl is-active nginx php8.3-fpm curl -sSIk https://shop.example.ru/ curl -sSIk https://shop.example.ru/catalog curl -sSIk https://shop.example.ru/data/products.json curl -sSIk https://shop.example.ru/backups/ curl -sSIk https://shop.example.ru/router.php curl -sS https://shop.example.ru/sitemap.xml | head
СимптомВероятная причинаПроверка
403 на всём сайтеНеверный document root или права traversal.Проверьте namei -l /var/www/shop.example.ru и error log.
404 на ЧПУЗапрос не попадает в router.php.Проверьте try_files, mod_rewrite и отключённый MultiViews.
500PHP exception, расширение или права записи.Смотрите журнал PHP-FPM и Nginx/Apache, затем php -m.
502PHP-FPM не запущен или указан другой сокет.systemctl status php8.3-fpm и ls -l /run/php/.
Установщик не скачивает сборкуНет cURL/DNS/исходящего 443 или неверное время.curl -Iv https://nova-cms.ru/, timedatectl.
Красный доменHost не включён в лицензию или запрос проходит через неверный proxy.Проверьте Host, canonical redirect и список доменов заявки.

Обязательные HTTP-проверки

  • Главная и ЧПУ отвечают 200.
  • HTTP перенаправляется на HTTPS постоянным редиректом.
  • /data/, /backups/, /lib/, /scripts/ и прямой /router.php не раскрываются.
  • Админка не кэшируется общим proxy/CDN.
  • Cookie имеют Secure, HttpOnly и подходящий SameSite.
  • Загрузка изображений, импорт Excel и создание backup проходят без ошибок.
  • Тестовый заказ появляется в админке, а тестовая оплата корректно сообщает статус.

8. Контроль перед публикацией

  • SSH по ключам; вход root по паролю отключён после настройки.
  • Установлены обновления °C и включено автоматическое получение security-updates.
  • Firewall открывает только необходимые порты.
  • Секреты и лицензия не находятся в Git и публичных backup.
  • Резервная копия хранится не только на том же сервере.
  • Настроены ротация журналов и контроль свободного места.
  • Реальные платёжные ключи вводятся только в админке по HTTPS.
  • Правовые тексты и реквизиты заменены данными владельца сайта.

9. Безопасное обновление

  1. Скачайте внешнюю резервную копию или snapshot VPS.
  2. В админке откройте «Обновления CMS» и нажмите «Проверить обновления».
  3. Прочитайте версию, изменения и результат проверки подписи.
  4. Запустите установку вручную. Автоматически без подтверждения она не начинается.
  5. CMS создаст полную резервную копию и отдельную точку возврата программных файлов.
  6. Пакет не имеет права заменять data, assets/uploads, backups, config.php и лицензию.
  7. После обновления проверьте PHP-логи, главную, админку, каталог, заказ, оплату, cron и sitemap.
Данные магазина сохраняютсяТовары, категории, заказы, настройки, лицензия и загруженные изображения исключены из разрешённых путей программного релиза.

10. Возврат предыдущей версии

  1. Если админка открывается, выберите последнюю точку возврата в разделе обновлений.
  2. Если админка недоступна, переведите сайт в maintenance mode средствами веб-сервера.
  3. Восстановите программные файлы из точки возврата или предрелизного архива.
  4. Не заменяйте свежий каталог data старой копией без отдельного решения: в нём находятся новые заказы.
  5. Проверьте владельца, права и конфигурацию PHP-FPM.
  6. Запустите диагностику из предыдущего раздела и только затем снимайте maintenance mode.
Разделяйте откат программы и восстановление данныхВозврат программной версии не должен удалять заказы, появившиеся после backup. Полное восстановление данных выполняйте только после оценки потерь и создания копии текущего состояния.