Установка и настройка окружения

Это руководство описывает полную установку Платформы на чистый сервер.

Целевое окружение: Rocky Linux 10, Nginx + PHP-FPM. Выполняйте шаги по порядку. Все команды выполняются от имени root, если не указано иное.

Во всех примерах используются следующие подстановочные значения. Замените их на свои реальные значения:

Обозначение Описание
example.com домен сайта
/var/www/example корневая директория проекта
example Linux-пользователь, от имени которого работает проект
example_db имя базы данных MySQL
example_user пользователь MySQL
db-password пароль пользователя MySQL

Шаги установки:

  1. Требования
  2. Подготовка сервера
  3. Web-сервер (Nginx)
  4. PHP 8.1 и ionCube
  5. Пул PHP-FPM
  6. MySQL
  7. Файлы приложения
  8. Настройка (.env)
  9. База данных
  10. Composer
  11. Sphinx
  12. Сервис Vue SSR
  13. Cron-менеджер
  14. Отправка почты
  15. SELinux и firewall
  16. HTTPS
  17. Завершение установки

Требования

Перед началом установки вам потребуется:

  • Дистрибутив платформы (zip-архив с последней версией).
  • Чистый сервер с Rocky Linux 10 и root-доступом.
  • Домен с A-записью, указывающей на IP-адрес сервера. Домен уже должен указывать на сервер — это требуется на шаге HTTPS.

Программный стек, устанавливаемый в этом руководстве:

Компонент Версия Назначение
Nginx последняя стабильная web-сервер
PHP (FPM) 8.1 среда выполнения приложения
ionCube Loader 15+ требуется для запуска кода платформы
MySQL 8.0 / 8.4 база данных
Sphinx 3.7.1 поисковый движок
Node.js 22 серверный рендеринг Vue (SSR)
Composer последняя PHP-зависимости
Postfix последняя отправка почты

Обязательные PHP расширения: curl, dom, fileinfo, gd, gettext, iconv, intl, json, libxml, mbstring, openssl, pcntl, pdo, pdo_mysql, posix, simplexml, spl, xmlreader, xmlwriter, zip, zlib.

Необязательные PHP расширения: imagick (улучшенные миниатюры изображений), memcached и apcu (драйверы кеша).

Обязательная настройка PHP: short_open_tag = On.

Подготовка сервера

Обновите систему и подключите репозитории пакетов (EPEL, Remi, CRB):

dnf update -y
dnf install -y epel-release
dnf config-manager --set-enabled crb
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-10.rpm
dnf install -y wget unzip tar policycoreutils-python-utils

Создайте Linux-пользователя, который будет владельцем проекта и от имени которого проект будет работать:

groupadd example
useradd -m -d /var/www/example -g example -s /bin/bash example
chmod 755 /var/www/example

Не запускайте проект от имени root или пользователя nginx. У каждого сайта должен быть свой пользователь.

Web-сервер (Nginx)

dnf install -y nginx

Создайте файл /etc/nginx/conf.d/tuning.conf с настройками, которые нужны платформе (значение client_max_body_size по умолчанию — 1 МБ, этого мало для загрузки файлов):

client_max_body_size 50m;

gzip on;
gzip_static on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css text/xml application/json application/javascript
           application/xml application/xml+rss image/svg+xml
           application/vnd.ms-fontobject font/ttf font/woff font/woff2;

Создайте конфигурацию сайта /etc/nginx/conf.d/example.com.conf. В архиве есть минимальный пример в /public_html/nginx.conf; конфигурация ниже покрывает его и добавляет кеширование, правила безопасности и обработчик PHP:

server {
  listen 80;
  listen [::]:80;

  server_name example.com;
  root /var/www/example/public_html;
  access_log /var/log/nginx/example.com-access.log;
  error_log  /var/log/nginx/example.com-error.log error;

  index index.php;

  # страницы ошибок приложения
  error_page 401 /index.php?bff=errors&errno=401;
  error_page 403 /index.php?bff=errors&errno=403;
  error_page 404 /index.php?bff=errors&errno=404;
  error_page 500 /index.php?bff=errors&errno=500;
  error_page 501 /index.php?bff=errors&errno=501;
  error_page 502 /index.php?bff=errors&errno=502;
  error_page 504 /index.php?bff=errors&errno=504;

  location = /robots.txt { access_log off; log_not_found off; try_files $uri @rewrites; }

  # запрет доступа к скрытым и резервным файлам
  location ~ /\. { deny all; access_log off; log_not_found off; }
  location ~ ~$  { deny all; access_log off; log_not_found off; }

  # статические файлы
  location ~* \.(js|css|png|jpg|jpeg|gif|ico|swf|flv|eot|ttf|woff|woff2|pdf|xls|htc)$ {
    add_header Pragma "public";
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    add_header Access-Control-Allow-Origin '*';
    access_log off;
    log_not_found off;
    expires 360d;
    try_files $uri @rewrites;
  }

  # запрет выполнения PHP в директориях загрузок
  location ~* ^/(files|styles|css|img|rss|seo)/.*\.(php|php2|php3|php4|php5)$ {
    deny all;
  }

  if ($request_uri ~ " ") { return 404; }

  # проверка домена при выпуске сертификата (шаг HTTPS)
  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }

  # обработчик PHP
  location ~* \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php-fpm/example.sock;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    include fastcgi_params;
  }

  # зона для защищенных загрузок (X-Accel-Redirect)
  location ^~ /files/partial/ {
    internal;
    alias /var/www/example/public_html/files/;
  }

  # фронт-контроллер
  location / {
    try_files $uri $uri/ @rewrites;
  }
  location @rewrites {
    rewrite ^ /index.php last;
  }
}

# редирект с www на домен без www
server {
  listen 80;
  listen [::]:80;

  server_name www.example.com;

  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }

  location / {
    return 301 http://example.com$request_uri;
  }
}

Проверьте конфигурацию и запустите Nginx:

nginx -t
systemctl enable --now nginx

PHP 8.1 и ionCube

Установите PHP 8.1 из репозитория Remi:

dnf module reset -y php
dnf module enable -y php:remi-8.1
dnf install -y php php-fpm php-cli php-pdo php-mysqlnd php-gd php-mbstring \
               php-xml php-intl php-zip php-process php-opcache

Если другая версия PHP уже была установлена из системного репозитория, сначала удалите ее: dnf remove -y php php-common php-fpm, затем повторите команды выше.

Проверьте версию и обязательные расширения:

php -v
for e in curl dom fileinfo gd gettext iconv intl json libxml mbstring openssl \
         pcntl pdo pdo_mysql posix simplexml spl xmlreader xmlwriter zip zlib; do
  php -r "exit(extension_loaded('$e') ? 0 : 1);" || echo "MISSING: $e"
done

Цикл не должен ничего вывести. Если расширение отсутствует, найдите и установите его пакет (поможет dnf provides 'php-*').

Отредактируйте /etc/php.ini и установите:

short_open_tag = On
memory_limit = 128M
post_max_size = 40M
upload_max_filesize = 40M
date.timezone = Europe/Berlin   ; укажите ваш часовой пояс
display_errors = Off
log_errors = On

ionCube Loader

Код платформы защищен ionCube и не работает без загрузчика:

cd /tmp
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
cp ioncube/ioncube_loader_lin_8.1.so /usr/lib64/php/modules/
restorecon /usr/lib64/php/modules/ioncube_loader_lin_8.1.so
echo 'zend_extension = /usr/lib64/php/modules/ioncube_loader_lin_8.1.so' > /etc/php.d/01-ioncube.ini
rm -rf /tmp/ioncube /tmp/ioncube_loaders_lin_x86-64.tar.gz

На сервере с архитектурой ARM используйте ioncube_loaders_lin_aarch64.tar.gz.

Проверьте — вывод должен содержать строку “with the ionCube PHP Loader”:

php -v

Пул PHP-FPM

Приложение работает в собственном пуле PHP-FPM. Процесс пула работает от имени пользователя проекта (example), поэтому приложение может записывать в свои файлы без дополнительных прав. Nginx обращается к пулу через unix-сокет.

Создайте /etc/php-fpm.d/example.conf:

[example]
user = example
group = nginx

listen = /var/run/php-fpm/example.sock
listen.owner = example
listen.group = nginx
listen.mode = 0660

pm = dynamic
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 25
pm.max_requests = 200

chdir = /

php_admin_value[open_basedir] = /var/www/example:/tmp/
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f noreply@example.com
php_admin_value[upload_tmp_dir] = /var/www/example/tmp
php_admin_value[session.save_path] = /var/www/example/tmp
php_admin_value[display_errors] = stderr
php_admin_value[log_errors] = On

Примечания:

  • pm.max_children ограничивает количество одновременно работающих PHP-процессов. Подбирайте значение по доступной памяти (примерно 50–100 МБ на процесс).
  • open_basedir ограничивает доступ PHP к файлам директорией проекта.
  • sendmail_path задает адрес отправителя исходящей почты — укажите ваш домен в адресе noreply@.
  • Путь к сокету должен совпадать с fastcgi_pass в конфигурации сайта Nginx.

Запустите PHP-FPM:

systemctl enable --now php-fpm

MySQL

dnf install -y mysql-server

Rocky Linux 10 предоставляет MySQL 8.4. Также подойдет любая сборка, совместимая с MySQL 8.0.

Создайте /etc/my.cnf.d/zz-platform.cnf:

[mysqld]
# платформа не поддерживает строгий режим SQL
sql_mode =
max_allowed_packet = 128M
# требуется для подключения индексатора Sphinx (только для MySQL 8.4, на 8.0 удалите эту строку)
mysql_native_password = ON

Запустите MySQL и установите пароль root:

systemctl enable --now mysqld
mysql_secure_installation

Убедитесь, что строгий режим выключен — запрос должен вернуть пустое значение:

mysql -u root -p -e "SELECT @@sql_mode;"

Файлы приложения

Распакуйте дистрибутив в корень проекта так, чтобы файл bff.php оказался непосредственно в /var/www/example:

cd /var/www/example
unzip /path/to/platform_archive.zip

Установите владельца и права:

chown -R example:example /var/www/example
find /var/www/example -type d -exec chmod 755 {} +
find /var/www/example -type f -exec chmod 644 {} +

mkdir -p /var/www/example/tmp
chown example:nginx /var/www/example/tmp
chmod 775 /var/www/example/tmp

Директория tmp используется для загрузок и PHP-сессий (см. конфигурацию пула выше).

Так как пул PHP-FPM работает от имени владельца файлов (example), директориям приложения не нужны права на запись для группы или для всех. Директории, в которые приложение пишет во время работы:

На сервере с включенным SELinux этим директориям также нужны метки SELinux — см. SELinux и firewall.

Настройка (.env)

Основные настройки окружения находятся в файле .env в корне проекта. Файл системных настроек /config/sys.php читает их, поэтому при стандартной установке достаточно редактировать только .env.

cd /var/www/example
cp .env.example .env
chown example:example .env
chmod 600 .env

Сгенерируйте уникальный ключ шифрования для этой установки:

echo "CRYPT_KEY=base64:$(openssl rand -base64 32)"

Заполните .env (добавьте строки, которых нет в .env.example):

HOST_NAME=example.com
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_DATABASE=example_db
MYSQL_USER=example_user
MYSQL_PASSWORD=db-password
CRYPT_KEY=base64:...   # значение, сгенерированное выше
SPHINX_ENABLED=1
SPHINX_HOST=127.0.0.1
SPHINX_PORT=9306
SPHINX_VERSION=3.7.1
VUE_SSR_HOST=127.0.0.1
VUE_SSR_PORT=13715
VUE_SSR_WORKERS=0
  • HOST_NAME — домен проекта, без www и без протокола.
  • Значения MYSQL_* должны совпадать с базой данных, создаваемой на следующем шаге.
  • CRYPT_KEY используется для шифрования данных в базе. Установите его один раз, до первого запуска, и никогда не меняйте — после смены ключа уже зашифрованные данные станут нечитаемыми. Храните копию ключа вместе с резервными копиями.
  • SPHINX_VERSION должна совпадать с установленной версией Sphinx (в этом руководстве — 3.7.1). Остальные значения SPHINX_* и VUE_SSR_* соответствуют сервисам, настраиваемым далее в этом руководстве; оставьте значения по умолчанию.

Настройки, которых нет в .env (название сайта и другие), редактируются в /config/sys.php или в админ-панели. См. настройки и подключение к базе данных.

База данных

Создайте базу данных и пользователя:

mysql -u root -p
CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'example_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'db-password';
GRANT ALL PRIVILEGES ON example_db.* TO 'example_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Примечания:

  • Требуется кодировка utf8mb4.
  • mysql_native_password требуется потому, что индексатор Sphinx подключается к базе данных с клиентской библиотекой, которая не поддерживает более новый метод caching_sha2_password. На MySQL 8.4 для этого нужна настройка mysql_native_password = ON в конфигурации сервера (установлена на шаге MySQL).

Импортируйте начальные данные из архива. Файл категорий зависит от языка — импортируйте файл, соответствующий языку вашего сайта (en или ru):

cd /var/www/example
mysql -u example_user -p example_db < install/install.sql
mysql -u example_user -p example_db < install/install.categories.ru.sql
mysql -u example_user -p example_db < install/install.regions.sql

Composer

Установите Composer:

cd /tmp
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php

Установите внешние библиотеки. Composer запускается в поддиректории /bff проекта, от имени пользователя проекта (не запускайте от root):

cd /var/www/example/bff
sudo -u example /usr/local/bin/composer install --no-dev

Если Composer останавливается с ошибкой памяти, запустите его так: sudo -u example php -d memory_limit=1024M /usr/local/bin/composer install --no-dev.

Sphinx

Sphinx обеспечивает поиск на сайте. В этом руководстве устанавливается версия 3.7.1. См. также отдельную страницу о настройке Sphinx.

Установите бинарные файлы и создайте пользователя sphinx (он добавляется в группу example, чтобы индексатор мог записывать индексные файлы проекта):

groupadd sphinx
useradd -r -g sphinx -G example -d /var/lib/sphinx -s /sbin/nologin sphinx

cd /tmp
wget https://sphinxsearch.com/files/sphinx-3.7.1-da9f8a4-linux-amd64.tar.gz
tar xzf sphinx-3.7.1-da9f8a4-linux-amd64.tar.gz
cp sphinx-3.7.1/bin/* /usr/bin/

mkdir -p /etc/sphinx /var/lib/sphinx /var/log/sphinx
chown sphinx:sphinx /var/lib/sphinx /var/log/sphinx

mkdir -p /var/www/example/files/sphinx
chown example:example /var/www/example/files/sphinx
chmod 775 /var/www/example/files/sphinx

На сервере с архитектурой ARM используйте архив linux-aarch64.

Сгенерируйте конфигурацию Sphinx проекта (создает /var/www/example/config/sphinx.conf; выполняйте команду повторно при изменении настроек подключения к базе данных):

cd /var/www/example/public_html
sudo -u example php index.php bff=sphinx

Создайте системную конфигурацию. Скопируйте шаблон, поставляемый с платформой, и укажите в нем проект:

cp /var/www/example/config/sphinx.conf.global /etc/sphinx/sphinx.conf
chmod 755 /etc/sphinx/sphinx.conf

Отредактируйте /etc/sphinx/sphinx.conf — в блоке files=(...) оставьте одну строку с реальным путем к конфигурации проекта:

files=(
"/var/www/example/config/sphinx.conf"
)

Этот файл — скрипт: Sphinx выполняет его и читает вывод как конфигурацию. Это позволяет одному экземпляру Sphinx обслуживать несколько проектов.

Выполните первоначальную индексацию (должна завершиться без ошибок):

sudo -u sphinx indexer --config /etc/sphinx/sphinx.conf --all

Создайте systemd-сервис /etc/systemd/system/searchd.service:

[Unit]
Description=Sphinx search engine (searchd)
After=network.target

[Service]
Type=forking
PIDFile=/var/run/sphinx/searchd.pid
User=sphinx
Group=sphinx
RuntimeDirectory=sphinx
ExecStart=/usr/bin/searchd --config /etc/sphinx/sphinx.conf
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now searchd

Настройте ротацию индексов — скопируйте скрипт, поставляемый с платформой, и запускайте его из cron каждые 5 минут от имени пользователя sphinx:

cp /var/www/example/config/sphinx_rotate.sh /etc/sphinx/
chown sphinx:sphinx /etc/sphinx/sphinx_rotate.sh
chmod 755 /etc/sphinx/sphinx_rotate.sh
crontab -u sphinx -e
*/5 * * * * /etc/sphinx/sphinx_rotate.sh /var/www/example

Включите Sphinx как поисковый движок объявлений:

cd /var/www/example/public_html
sudo -u example php index.php bff=config key=listings.search.engine value=sphinx

Сервис Vue SSR

Платформа рендерит некоторые части страниц на сервере с помощью Vue (SSR). Для этого нужны Node.js 22 и фоновый сервис.

Установите Node.js 22:

curl -fsSL https://rpm.nodesource.com/setup_22.x | bash -
dnf install -y nodejs

Установите JavaScript-зависимости (от имени пользователя проекта, включая dev-зависимости — они нужны для запуска SSR):

cd /var/www/example
sudo -u example npm install

Создайте systemd-сервис /etc/systemd/system/bffssr.service:

[Unit]
Description=BFF Vue SSR
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/npm run ssr
WorkingDirectory=/var/www/example
User=example
Group=example
StandardInput=null
StandardOutput=journal
StandardError=journal
Restart=always

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now bffssr

Убедитесь, что сервис слушает порт, указанный в .env (VUE_SSR_PORT, по умолчанию 13715):

ss -tlnp | grep 13715

Cron-менеджер

Cron-менеджер выполняет все фоновые задачи приложения. Настройте его запуск каждую минуту от имени пользователя проекта (не от root):

dnf install -y cronie
systemctl enable --now crond
crontab -u example -e
* * * * * /usr/bin/php -q /var/www/example/public_html/index.php bff=cron-manager

Примечания:

  • Расширение pcntl должно быть доступно в режиме CLI (установлено ранее с пакетом php-process) — cron-менеджер использует его для параллельного выполнения задач.
  • Выполняемые задачи записываются в лог-файл /files/logs/cron.log внутри проекта.

Отправка почты

Приложение отправляет почту через локальную программу sendmail. Ее предоставляет Postfix:

dnf install -y postfix
systemctl enable --now postfix

Установите адреса, используемые приложением:

cd /var/www/example/public_html
sudo -u example php index.php bff=config key=mail.noreply value=noreply@example.com
sudo -u example php index.php bff=config key=mail.admin value=admin@example.com

Чтобы письма попадали во входящие (а не в спам), создайте для домена следующие DNS-записи:

  • SPF — TXT-запись: v=spf1 a mx ~all
  • DKIM — подписывайте исходящую почту через OpenDKIM и опубликуйте публичный ключ в TXT-записи
  • DMARC — TXT-запись _dmarc.example.com: v=DMARC1; p=none;
  • PTR — попросите хостинг-провайдера установить обратную DNS-запись (PTR) IP-адреса сервера на имя хоста сервера

Настройка OpenDKIM выходит за рамки этого руководства, но для рабочих сайтов она настоятельно рекомендуется.

SELinux и firewall

SELinux

Проверьте режим:

getenforce

Если результат — Enforcing, разрешите web-приложению запись в его рабочие директории, а также сетевые подключения (PHP подключается к Sphinx и к сервису SSR) и отправку почты:

for d in files tmp config custom plugins themes bff/vendor \
         public_html/files public_html/custom public_html/plugins public_html/themes; do
  semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/example/$d(/.*)?"
done
restorecon -R /var/www/example

setsebool -P httpd_can_sendmail on
setsebool -P httpd_can_network_connect on

Firewall

Откройте web-порты и порт почты:

firewall-cmd --permanent --add-service=http --add-service=https --add-service=smtp
firewall-cmd --reload

HTTPS

Выпустите бесплатный сертификат Let’s Encrypt с помощью certbot. Домен (и поддомен www) уже должны указывать на этот сервер, а HTTP-сайт из шага Nginx должен быть доступен — certbot проверяет домен через location /.well-known/acme-challenge/.

dnf install -y certbot
certbot certonly -m admin@example.com --agree-tos --webroot \
  -w /var/www/example/public_html \
  -d example.com -d www.example.com \
  --deploy-hook "systemctl reload nginx"

Включите автоматическое продление:

systemctl enable --now certbot-renew.timer

Обновите /etc/nginx/conf.d/example.com.conf. Серверы на порту 80 теперь только перенаправляют на HTTPS, а конфигурация сайта переносится в сервер на порту 443:

server {
  listen 80;
  listen [::]:80;

  server_name example.com www.example.com;
  root /var/www/example/public_html;

  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }

  location / {
    return 301 https://example.com$request_uri;
  }
}

# редирект с www на домен без www
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;

  server_name www.example.com;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_protocols TLSv1.2 TLSv1.3;

  location / {
    return 301 https://example.com$request_uri;
  }
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_protocols TLSv1.2 TLSv1.3;
  add_header Strict-Transport-Security 'max-age=31536000';

  # ... сюда переносится вся конфигурация сайта из HTTP-примера:
  # server_name, root, логи, index, error_page, все блоки location
}
nginx -t && systemctl reload nginx

Переключите приложение в режим работы только по HTTPS:

cd /var/www/example/public_html
sudo -u example php index.php bff=config key=https.only value=1
sudo -u example php index.php bff=config key=https.redirect value=1

Эти же настройки доступны в админ-панели в разделе настроек сайта.

Если у вас сертификат другого поставщика, разместите цепочку сертификатов и ключ на сервере и укажите пути к ним в строках ssl_certificate / ssl_certificate_key; остальная конфигурация не меняется.

Завершение установки

Проверьте, что все сервисы работают:

systemctl --no-pager status nginx php-fpm mysqld searchd bffssr crond postfix

Откройте https://example.com — сайт должен загрузиться. Затем откройте админ-панель: https://example.com/admin/.

Логин администратора — admin. Чтобы установить пароль администратора:

  • Создайте файл /files/admin_password_recovery.txt (в корне проекта), содержащий новый пароль администратора.
  • Авторизуйтесь в админ-панели с логином admin и паролем из файла.
  • После успешной авторизации пароль сохраняется, а файл автоматически удаляется.

Под администратором подразумевается пользователь из группы “Главный администратор” (идентификатор пользователя #1). Эта же процедура восстанавливает доступ, если пароль утерян.

Состояние системы

Для проверки корректности настроек сервера и окружения перейдите в раздел “Настройки сайта / Состояние системы” в админ-панели и выполните проверку, нажав кнопку “Проверить повторно”. Исправьте ошибки, о которых сообщает проверка — пока есть критические ошибки, установка обновлений платформы недоступна.