Автоматическая установка

Автоматический способ: один скрипт из личного кабинета подготавливает весь сервер (веб-стек Apache + PHP, база данных, инструменты безопасности, cron). Дальше — развернуть панель, выпустить SSL и ввести лицензию. Работает на Ubuntu/Debian: на свежем VPS настраивает всё с нуля, на уже настроенном сервере — только аддитивно (профиль «Настроенный сервер», шаг 01). Все команды ниже — по порядку, просто листайте сверху вниз. На свежем VPS подходит каждый шаг подряд; если сервер уже настроен или на нём стоит хостинг-панель, часть работы скрипт намеренно оставляет вам — что именно, он пишет в конце своей работы (разбор вывода — в шаге 01).

Значения-заглушки в командах замените на свои: monitor.example.com — ваш домен; 203.0.113.10 — реальный IP сервера; /var/www/monitor — корень панели (где лежат public/, assets/, config.php); пароль БД придумайте свой.
Полный набор («Полная защита») рассчитан на свежий VPS. На чистой Ubuntu/Debian он настраивает систему безопасности с нуля — Fail2ban (jail.local), root-crontab, правила UFW, конфиг Apache. Если сервер уже настроен (рабочая панель, сайты, почта, свои jail'ы) — выбирайте профиль «Настроенный сервер»: он вносит только аддитивные изменения и не трогает ваш файрвол, Fail2ban, почту, SSH и sysctl. При обнаружении хостинг-панели скрипт переключается на этот режим сам. Перед первым запуском можно включить сухой прогон (галочка в кабинете) — он покажет, что будет сделано, ничего не меняя. На рабочем сервере на всякий случай сделайте снимок (snapshot).

01. Команда автонастройки из кабинета

Команду вы берёте в своём личном кабинете my.arciveo.com → раздел «Настройка сервера» (доступен после оформления Arcivéo Security Monitor). Она привязана к вашему аккаунту и содержит персональный токен.

Скрипт подготавливает весь сервер: веб-стек (Apache + PHP), базу данных, инструменты для SSL, полный набор средств защиты и cron-задания (Lynis, SMART, debsums, Logwatch, ежедневный отчёт, обновление ipsum).

1) Выберите уровень защиты (в кабинете, перед копированием команды):

  • Полная защита (рекомендуется) — UFW (фаервол), Fail2ban, CrowdSec + bouncer, ipsum (блок-лист IP), Suricata (IDS/IPS), Falco, ModSecurity + OWASP CRS (WAF), PSAD, mod_evasive (анти-DoS), AIDE (целостность файлов), debsums, ClamAV + maldet (антивирус), Auditd, AppArmor, Monit, Lynis (аудит), Logwatch, автообновления безопасности.
  • Облегчённая — для VPS с малым объёмом ОЗУ: базовый набор без тяжёлых компонентов.
  • Настроенный сервер (хостинг-панель) — для уже работающего сервера с панелью (HestiaCP и т.п.), сайтами и почтой: только аддитивные изменения (доустановка инструментов, cron, sudo-правила), а файрвол, Fail2ban, почта, SSH и sysctl остаются как есть. На сервере с панелью скрипт выбирает этот режим сам.
Сухой прогон. В кабинете можно поставить галочку «Сухой прогон» — тогда команда только покажет, что скрипт установит и изменит, и завершится, ничего не тронув. Полезно на уже настроенном сервере: сперва прогон, потом реальный запуск без галочки.

2) Выполните на сервере под root команду из кабинета — она выглядит так:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
Команду держите в секрете — она привязана к вашему аккаунту. Ссылка имеет ограниченный срок действия; если она истекла, нажмите в кабинете «Получить новую ссылку».
После автонастройки веб-сервер — Apache + PHP-FPM, а инструменты безопасности и cron-задания уже установлены и работают «из коробки».

3) Прочитайте вывод в конце — там сказано, что осталось на вас. Скрипт заканчивает работу блоком проверок и списком «Дальше — установка панели». Часть шагов он намеренно не делает: что именно, зависит от выбранного профиля и от того, что он нашёл на сервере. Сверьтесь со списком ниже — выполнять нужно только те пункты, строки которых появились в вашем выводе.

  • Control panel detected (…) — сайт создаётся средствами самой хостинг-панели, vhost скрипт не делает. Шаг 03, ветка «Сервер с хостинг-панелью».
  • No vhost created (no domain given) — профиль «Настроенный сервер» без домена: vhost без имени стал бы сайтом по умолчанию и перехватывал бы ваши же сайты, поэтому он не создан. Шаг 03, ветка «Создать vhost вручную».
  • sudo rules NOT written — скрипт не смог определить, под каким аккаунтом работает панель. Это обычная ситуация: файлы панели заливаются уже после автонастройки, и определять было ещё не по чему. Без этих правил модули не увидят системные данные. Шаг 04, блок «sudo для веб-сервера».
  • ! Nginx does not read .htaccess — перед Apache стоит Nginx, и вписать запрет в его конфиг автоматически не вышло. Сделайте это обязательно: иначе data/, keys/, database/ и config.php отдаются наружу в обход .htaccess. Шаг 03, блок «Если перед Apache стоит Nginx».
  • UFW installed but inactive — файрвол установлен, но выключен: на настроенном сервере скрипт не включает его сам, чтобы не отрезать вам доступ. Включите его сами, обязательно разрешив свой SSH-порт:
    sudo ufw allow OpenSSH # нестандартный порт SSH: sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running — запустите: sudo systemctl enable --now fail2ban.
  • Database server present … but not running — запустите СУБД до шага 04: sudo systemctl enable --now mariadb (или mysql — смотря что стоит).
  • Certbot skipped — issue SSL in … — сертификат выдаётся выключателем Let's Encrypt в хостинг-панели; шаг 06 вам не нужен.
Если в блоке проверок всё в порядке, последняя строка — All checks passed. Пункты с ! требуют внимания; подробности пишутся в лог, его путь скрипт печатает в самом конце (Log: …).

02. Домен и DNS

Чтобы открывать панель по адресу вроде monitor.example.com и получить бесплатный SSL, домен должен указывать на сервер. В панели управления DNS (у регистратора или хостера) создайте A-запись:

Тип: A Имя: monitor (поддомен → monitor.example.com) или @ (корень домена → example.com) Значение: 203.0.113.10 ← IP вашего сервера TTL: 3600

Через несколько минут (иногда до часа) проверьте, что домен указывает на сервер:

dig +short monitor.example.com # должен вернуть ваш IP # или, если dig нет: getent hosts monitor.example.com
SSL-сертификат (шаг 06) выдаётся только на домен — поэтому DNS должен указывать на сервер до выпуска сертификата.

03. Залить файлы панели

Обычный случай (свежий VPS). Автонастройка уже создала каталог панели /var/www/monitor и настроила сайт Apache (DocumentRoot на корень панели, PHP-FPM, AllowOverride для .htaccess). В выводе скрипта это строка vhost … → DocumentRoot …. Отдельно создавать каталог и vhost не нужно — просто залейте файлы и выставьте права.
Два случая, когда vhost НЕ создан — скрипт прямо сообщает об этом в конце работы. Тогда сначала выполните нужную ветку ниже, и только потом заливайте файлы.

Ветка «Сервер с хостинг-панелью» (в выводе: Control panel detected (…)). Сайтами на таком сервере распоряжается панель, и свой vhost скрипт не создаёт намеренно — он был бы затёрт при первой же пересборке конфигов панелью. Порядок такой:

  1. Заведите веб-домен в панели хостинга (HestiaCP и т.п.) — её DocumentRoot остаётся как есть.
  2. Залейте дистрибутив целиком в public_html этого домена: рядом с index.php, api/, assets/ должны лежать и служебные config.php, includes/, data/, tmp/, logs/, keys/, cron/, database/. Ничего выше веб-корня выносить не нужно: служебные папки закрыты файлом .htaccess из дистрибутива, а под Nginx — запретом, который скрипт вписал в конфиг домена.
  3. SSL выпускается выключателем Let's Encrypt в самой панели — шаг 06 пропустите.
  4. Дальше — права (ниже на этом шаге), база (шаг 04) и config.php (шаг 05). Пути в командах замените на /home/аккаунт/web/домен/public_html, а владельца — на пользователя этого домена вместо www-data.

Ветка «Создать vhost вручную» (в выводе: No vhost created (no domain given)). Такое бывает только на профиле «Настроенный сервер», когда домен не был передан. Проще всего — просто перезапустить команду из кабинета, указав домен:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo bash -s -- monitor.example.com

Повторный запуск безопасен: уже сделанное не дублируется. Если же vhost нужно создать руками — вот тот же конфиг, что пишет установщик:

sudo mkdir -p /var/www/monitor # Сокет PHP-FPM определяем автоматически — версия PHP на серверах разная. PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) sudo tee /etc/apache2/sites-available/arciveo-monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/arciveo-monitor_error.log CustomLog ${APACHE_LOG_DIR}/arciveo-monitor_requests.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/arciveo-monitor.conf sudo a2ensite arciveo-monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2
ServerName здесь обязателен. Vhost без имени становится сайтом Apache по умолчанию и начинает отвечать за чужие домены на этом же сервере. По той же причине не отключайте 000-default.conf на настроенном сервере: этот сайт мог быть переделан под чей-то рабочий — на свежем VPS установщик его убирает сам, здесь этого делать не нужно.
Если перед Apache стоит Nginx (в выводе: ! Nginx does not read .htaccess). Nginx отдаёт статические файлы прямо с диска и .htaccess не читает — служебные папки окажутся открыты наружу, хотя Apache их корректно закрывает. Скрипт заранее подготовил файл с запретами; его нужно подключить в блоке server{} вашего сайта и перезагрузить Nginx:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # Проверка: должно вернуть 403, а не содержимое файла curl -sI https://monitor.example.com/config.php | head -1
Файлы панели (архив дистрибутива) скачиваются после покупки в кабинете my.arciveo.com → «Загрузки». Распакуйте архив перед загрузкой на сервер.

Залейте содержимое дистрибутива в /var/www/monitor (чтобы внутри оказались public/, assets/, config.php и т.д.) — по SFTP/SCP (FileZilla / WinSCP) или командой scp с локального компьютера:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Чтобы в vhost сразу прописался ваш домен (ServerName), его передают в команду автонастройки ещё на шаге 01: … | sudo bash -s -- monitor.example.com (или указывают домен в поле «Домен панели» в кабинете). Если домен не передали — панель отвечает на любой хост и по IP, а ServerName пропишет certbot при выпуске SSL (шаг 06); переустанавливать ничего не нужно.
Выставьте права на файлы — это обязательный шаг. Если заливали под root или по SFTP, файлы принадлежат root, и веб-сервер (www-data) не сможет их прочитать — панель откроется пустой или с ошибкой 403 (в логе: .htaccess unreadable / directory not executable). Команда ниже это чинит:
# Нормализуем права всего вебрута: каталог, созданный root, недоступен # веб-серверу (www-data) — без этого панель отдаёт пустую страницу или 403. cd /var/www/monitor # Рабочие папки создаём ДО chown — иначе новые каталоги останутся root:root # и при chmod 750 веб-сервер (www-data) не сможет в них писать. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

Откройте себе заливку файлов по SFTP. После команды выше все файлы принадлежат www-data, а FileZilla / WinSCP подключаются под вашим пользователем — при загрузке появится ошибка SSH_FX_PERMISSION_DENIED (Permission denied). Выберите один из двух вариантов.

Вариант A — ACL только для вашего пользователя (рекомендуется). Право записи получаете только вы; веб-сервер по-прежнему не может переписать код панели:

sudo apt install -y acl # Право записи вашему пользователю на весь каталог панели: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # То же правило по умолчанию — для файлов и папок, созданных позже: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Вариант B — через группу www-data. Проще, но право записи в файлы панели получает и веб-сервер: при уязвимости в PHP код можно будет подменить. Порядок команд важен — config.php и рабочие папки закрываются последними:

sudo usermod -aG www-data deploy # Запись группе + setgid (бит 2): файлы, залитые по SFTP, остаются # в группе www-data — иначе панель не сможет их перезаписать. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
После варианта B переподключитесь в FileZilla (Сервер → Отключиться, затем войти заново) — новая группа применяется только при новом входе, до этого прав всё равно не будет. Проверка: id deploy — в списке групп должна появиться www-data; ls -ld /var/www/monitor — права drwxrwsr-x, буква s вместо x означает, что setgid установлен.

04. База данных

Создайте базу и пользователя, затем импортируйте схему. Блок с БД вставляется в терминал целиком (sudo mysql входит root по unix-сокету — пароль root не нужен). monitor_db и monitor_user — имена для примера, можете задать любые свои; запомните имя базы, пользователя и пароль — впишете их в config.php на следующем шаге:

# 1. База данных. Имя базы, пользователь и пароль задаются ОДИН раз ниже и подставляются во все строки. # Блок вставляется в терминал ЦЕЛИКОМ; sudo mysql входит root по unix-сокету # (пароль root не нужен). НЕ используйте интерактивный `sudo mysql -u root -p` # с копипастом — при вставке SQL-строки уйдут в запрос пароля и пропадут. DBNAME='monitor_db' # ← имя базы, можно оставить DBUSER='monitor_user' # ← пользователь БД, можно оставить DBPASS='CHOOSE_A_PASSWORD' # ← пароль, задайте свой sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS $DBNAME CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON $DBNAME.* TO '$DBUSER'@'localhost'; FLUSH PRIVILEGES; SQL # Проверка (должна показать $DBNAME): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # Эти же три значения впишите в config.php → DB_NAME, DB_USER, DB_PASS.
Обычно схему импортировать не нужно — панель сама создаёт таблицы и учётку admin при первом заходе в браузер (из database/db.sql), если БД пустая.

Если таблицы не создались (панель показывает ошибку подключения к БД или пустой экран вместо формы входа) — импортируйте схему вручную. Команда выполняется в корне панели, значения берутся из блока выше:

# Импорт схемы: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # Проверка — должен появиться список таблиц: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
Если переменные $DBNAME / $DBUSER / $DBPASS уже «забылись» (новая сессия терминала) — подставьте значения в команду руками или задайте их заново теми же тремя строками из блока выше.
sudo для веб-сервера. Обычно правила уже записаны автонастройкой, и модули видят системные данные сразу. Но если в выводе скрипта была строка sudo rules NOT written — определить аккаунт панели было не по чему (файлы ещё не залиты), и правила не созданы. Без них разделы вроде фаервола, Fail2ban и CrowdSec останутся пустыми. Теперь, когда файлы на месте, запустите команду из кабинета ещё раз, назвав аккаунт явно:
curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo ARCIVEO_USER=www-data bash -s -- monitor.example.com
www-data замените на пользователя, под которым работает PHP вашего сайта (на хостинг-панели это обычно владелец домена). Посмотреть его можно так:
ps -o user= -C php-fpm8.3 | sort -u # версию подставьте свою # или: ps aux | grep -m3 '[p]hp-fpm'
Проверка после перезапуска: файл /etc/sudoers.d/monitor существует и в нём есть строки с вашим пользователем.

05. Настройка config.php

config.php в корне панели (/var/www/monitor/config.php) — единственный файл, который нужно отредактировать руками. Все настройки панели заданы в нём константами define(). Откройте его в редакторе:

sudo nano /var/www/monitor/config.php

Подставьте свои значения в подсвеченные места; остальное оставьте как есть:

// --- База данных (из шага 04) --- define('DB_HOST', 'localhost'); // оставить define('DB_NAME', 'db_name'); // что создали в шаге 04 define('DB_USER', 'user'); // что создали в шаге 04 define('DB_PASS', 'db_password'); // что задали в шаге 04 define('DB_CHARSET', 'utf8mb4'); // оставить // --- Приложение --- define('APP_URL', 'https://monitor.example.com'); // адрес панели, без слэша в конце define('TIMEZONE', 'Europe/Kyiv'); // ваш часовой пояс // --- Время сессии --- define('SESSION_LIFETIME', 28800); // простой до повторного входа, сек (28800 = 8 ч)

Что менять:

  • DB_NAME, DB_USER, DB_PASS — ровно те же имя базы, пользователь и пароль, что вы задали при создании БД в шаге 04 (если оставили примеры — monitor_db / monitor_user). DB_HOST и DB_CHARSET не трогайте.
  • APP_URL — полный адрес панели с https://, без слэша в конце и без www. Должен совпадать с доменом, на который активируете лицензию (шаг 07), иначе ключ будет отклонён.
  • TIMEZONE — ваш часовой пояс (список — timedatectl list-timezones). Влияет только на то, как панель показывает даты; на время запуска cron-заданий не влияет (там действует пояс системы).
  • SESSION_LIFETIME — через сколько секунд бездействия панель попросит войти заново (по умолчанию 8 часов). Напр. 3600 = 1 час, 86400 = сутки.
  • Блок логирования ошибок (display_errors, log_errors, error_log) — оставьте по умолчанию.

Сохраните файл (Ctrl+O, Enter, затем Ctrl+X) и перезапустите PHP-FPM — иначе из-за OPcache изменения не применятся:

sudo systemctl restart php*-fpm
config.php — секретный файл (в нём пароль БД). Он лежит в корне панели, который и есть веб-корень, но закрыт: права 640 (выставлены в шаге 03) и явный запрет в корневом .htaccess. Не выкладывайте его в публичные репозитории и не передавайте в поддержку с реальным паролем.
Подробный разбор всех параметров — в FAQ: «Файл config.php — все настройки панели».

06. Выпустить SSL (HTTPS)

Панель работает только по HTTPS. Сессия входа использует защищённую cookie, а WebAuthn (2FA) по стандарту работает лишь на HTTPS. По http:// вы не сможете войти.
На сервере с хостинг-панелью этот шаг не нужен (в выводе скрипта: Certbot skipped — issue SSL in …). Сертификат выдаётся выключателем Let's Encrypt на веб-домене в самой панели — так его продлением тоже занимается панель.

certbot и плагин для Apache уже установлены автонастройкой. DNS домена уже должен указывать на сервер (шаг 02). Выпуск в одну команду:

sudo certbot --apache -d monitor.example.com

Если панель должна открываться ещё и с www. — перечислите оба имени в одной команде, иначе на втором адресе браузер покажет предупреждение о сертификате:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
Второе имя добавляйте, только если на него тоже есть A-запись, указывающая на этот сервер (шаг 02). Иначе Let's Encrypt не сможет его проверить и не выдаст сертификат целиком — включая основной домен.
Что certbot спросит:
  1. Enter email address — ваш e-mail (туда придут уведомления об истечении сертификата).
  2. Terms of Service … (Y)es/(N)o — Y.
  3. Share email with the EFF … (Y)es/(N)o — на ваше усмотрение.
Дальше certbot сам выпустит сертификат, пропишет <VirtualHost *:443>, настроит редирект http→https и автопродление. В конце — Successfully enabled HTTPS.
Если выпуск падает — проверьте, что dig +short monitor.example.com возвращает IP сервера и открыты порты 80/443 (sudo ufw allow 80,443/tcp).

После выпуска: https://monitor.example.com открывается с замком, http:// редиректит на https://.

07. Вход и первичная настройка

Откройте https://monitor.example.com, войдите admin / useradmin и пройдите чеклист:

  1. Сменить пароль admin — раздел «Пользователи» в меню.
  2. Включить WebAuthn (2FA) — «Ключи WebAuthn» → зарегистрировать ключ/passkey (требует HTTPS). Зарегистрируйте сразу два: при потере единственного ключа вход по нему будет невозможен. Подробнее.
  3. Ограничить доступ по IP — «Настройки» → «Ограничение доступа по IP» (впишите свой IP перед включением, иначе закроете себе доступ).
  4. Ввести лицензию — код активации ARCIVEO-… из кабинета активируйте на свой домен и вставьте ключ в «Настройки» → «Лицензия». Подробнее.
  5. Настроить уведомления — Telegram и/или Email в «Настройки». Подробнее.
  6. Удалить установщик public/start_db.php, если он остался: он позволяет без авторизации пересоздать базу. Пока файл лежит в корне панели или в public/, панель предупреждает о нём красным баннером.
  7. Запустить первые проверки вручную — иначе часть разделов будет пустой до ночи (см. блок ниже).
Почему «Аудит Lynis» и «Logwatch» сразу пустые. Автонастройка поставила инструменты и завела cron-задания, но не запускала сами проверки — они пойдут по расписанию: Lynis в 03:00, Logwatch в 06:00, debsums в 04:30, ClamAV в 01:30. До этого момента разделы честно показывают, что отчётов ещё нет. Чтобы не ждать сутки, прогоните их один раз руками:
# Аудит Lynis — первый отчёт (несколько минут): sudo /usr/local/bin/lynis-scan.sh # Отчёт Logwatch за сутки: sudo /usr/local/bin/logwatch_daily.sh # Целостность пакетов (debsums) — на большом сервере идёт долго: sudo /usr/local/bin/debsums-scan.sh
Lynis можно запустить и прямо из панели — кнопка «Запустить аудит» на странице «Аудит Lynis»: она выполняет тот же скрипт в фоне и сама обновляет отчёт. Дальше всё идёт по расписанию, вручную запускать больше не нужно.
Первый антивирусный скан (sudo /usr/local/bin/clamav-scan.sh) сильно нагружает диск и процессор и может идти час и больше — на рабочем сервере лучше дождаться ночного запуска в 01:30. Разделы «Диски (SMART)», «Производительность» и «Обновления безопасности» наполняются сами: каждые 30 минут, 5 минут и раз в час соответственно.
Готово. Справочник по каждому инструменту — в FAQ.
Нужно разместить на этом сервере ещё один сайт со своим доменом — см. FAQ: «Второй сайт на этом сервере (ещё один домен)».