LuckyStackдокументация · 0.1

LuckyStack

Готовый веб- и почтовый сервер на nginx, PHP и ISPConfig. Ставится мастером на чистый Debian или Ubuntu, дальше обслуживается из панели или командой luckyctl.

Установка на чистый сервер, от root
curl -L https://github.com/Leden4ik/luckystack/archive/refs/heads/main.tar.gz | tar xz
cd luckystack-main
bash server-setup.sh

Исходный код и выпуски: github.com/Leden4ik/luckystack

ISPConfig хорошая панель, но после её установки сервер ещё далёк от готового. nginx из пакетов без HTTP/3 и Brotli, почта принимает пароли открытым текстом, firewall не настроен, бэкапа нет, а обновление панели затирает ручные правки. LuckyStack закрывает всё это: собирает nginx, ставит PHP нескольких версий, почту с антиспамом, защиту, бэкапы и уведомления, а в ISPConfig добавляет группу пунктов меню Дополнения, из которой всё это видно и можно обслуживать.

Я делал его для своих серверов и обкатываю на них же. Каждое изменение сначала проходит тестовый сервер и только потом попадает на рабочий.

Мастер с умолчаниями

Можно пройти одним Enter: имя сервера, порт SSH и профиль подставляются сами. Сбой на этапе не губит установку, её можно продолжить.

Панель вместо SSH

Версии, проверки, обновление, откат, бэкапы, баны и уведомления в ISPConfig.

Обновления без страха

Перед ядром бэкап, после ядра наши правки накладываются заново, nginx и вебмейл откатываются одной командой.

Что получается на сервере

ЧастьЧто стоитОткуда
Веб-серверnginx с HTTP/3, Brotli, zstd и OpenSSL 3.5 LTS. Полноценный Apache будет в следующем выпускесборка
PHPНесколько версий FPM сразу, от 7.4 до 8.5, версия выбирается у каждого сайтаSury
БазыMariaDB последней LTS, Redis. По желанию PostgreSQLmariadb.org
ПочтаPostfix и Dovecot, Rspamd и ClamAV, вебмейл Roundcube, DKIM, SPF и DMARCapt / roundcube.net
ПанельISPConfig 3.3 и группа Дополнения: 10 наших пунктов менюispconfig.org
ЗащитаCrowdSec с ufw, fail2ban, харденинг SSH, ядра и PHP, проверка на вредоносный кодapt
СертификатыLet's Encrypt для сайтов, панели и почты, продление самоacme.sh
СопровождениеЕжедневный бэкап, уведомления на почту и в Telegram, проверка здоровьясвои скрипты
Начало

Быстрый старт

От пустого сервера до работающей панели. Дольше всего идёт сборка nginx, остальное ставится из пакетов.

  1. Подготовьте имя сервера

    Выберите полное имя, например server.example.com, и создайте у регистратора A-запись на IP сервера. По этому имени будет открываться панель, на него выпускается сертификат и с него уходит почта. Проверить, что запись уже работает:

    # на своём компьютере
    dig +short server.example.com
    203.0.113.10
  2. Зайдите на сервер по SSH ключом

    Мастер предложит закрыть вход по паролю, поэтому ключ лучше положить заранее. Если ключа нет, создайте его командой ssh-keygen -t ed25519 и передайте на сервер через ssh-copy-id root@203.0.113.10.

  3. Запустите установку
    curl -L https://github.com/Leden4ik/luckystack/archive/refs/heads/main.tar.gz | tar xz
    cd luckystack-main
    bash server-setup.sh

    Команды скачивают код с GitHub и запускают мастер. Перед этим его можно спокойно прочитать: это обычные bash-скрипты. При первом запуске установщик копирует себя в /opt/luckystack, ставит команду luckyctl и дальше работает уже оттуда, скачанную папку можно удалить.

  4. Ответьте на вопросы мастера

    Почти везде можно просто нажимать Enter, значение по умолчанию подходит большинству. Подробно про каждый вопрос в разделе Мастер установки.

  5. Откройте панель

    В конце мастер покажет адрес панели и пароль администратора, а копию доступов положит в /root/server-access.txt. Панель открывается по имени сервера, порт выбирается в мастере, по умолчанию 8080:

    https://server.example.com:8080

    Если вы меняли SSH или включили firewall, мастер попросит подтвердить, что доступ к серверу не потерян: откройте второе окно, зайдите по SSH и выполните touch /run/luckystack-net-ok. Без подтверждения через 5 минут SSH и firewall сами вернутся к прежним настройкам.

    Первым делом включите двухфакторный вход для admin и проверьте раздел Дополнения: там видно, что сервер в порядке.

  6. Проверьте сервер
    luckyctl check

    Должно получиться без ошибок. Предупреждения нормальны для свежего сервера, например про отсутствие копии бэкапа на другом сервере. Как выглядит вывод, показано в разделе luckyctl check.

Начало

Требования

Нужен чистый сервер: свежая установка ОС, без панелей и без сайтов. На занятый сервер мастер не пойдёт, для него есть отдельный режим подключения.

ЧтоМинимумКомментарий
ОСDebian 12 или 13, Ubuntu 22.04 или 24.04На всех четырёх проверено установкой с нуля, перезагрузкой, сайтами, почтой и восстановлением из бэкапа
Память2 ГБС ClamAV лучше 4 ГБ. На малой памяти мастер сам предложит swap или отказаться от ClamAV
Диск20 ГБПлюс место под сайты, почту и бэкапы
Сетьпубличный IPv4IPv6 подхватывается сам, если на сервере есть глобальный адрес и маршрут
Порт 25открыт у хостераНужен только если ставите почту. Многие хостеры закрывают его по умолчанию, проверьте заранее
ДоступrootЧерез sudo тоже можно
Установка

Мастер установки

Мастер задаёт вопросы по порядку, записывает ответы в файл настроек и только потом начинает ставить. До последнего подтверждения на сервере ничего не меняется.

Как выглядит вопрос

Каждый вопрос это рамка с вариантами. В квадратных скобках стоит вариант по умолчанию, он выбирается по Enter.

root@server: luckyctl install
┌─ Какую версию nginx собирать ────────────────────────────────────────────────┐
│ 1) stable — проверенная стабильная (рекомендуется)                           │
│ 2) mainline — новее, свежие возможности (чуть менее обкатана)                │
└──────────────────────────────────────────────────────────────────────────────┘
Ваш выбор [1]: 1

┌─ Какой OpenSSL собирать с nginx ─────────────────────────────────────────────┐
│ 1) 3.5 LTS — поддержка до апреля 2030 (рекомендуется)                        │
│ 2) 4.1 — самая новая, поддержка до ноября 2027                               │
│ 3) 4.0 — поддержка до мая 2027                                               │
└──────────────────────────────────────────────────────────────────────────────┘
Ваш выбор [1]: ▍

Настоящий вывод мастера на тестовом сервере.

Какие вопросы будут

Вопросы идут группами. Если какая-то часть не выбрана, вопросы про неё не задаются.

ВопросПо умолчаниюЧто выбрать
Имя сервера и часовой поясиз системыПолное имя с A-записью. Если хостер уже выставил имя, мастер подставит его сам. Часовой пояс ставится сразу везде: система, PHP, MariaDB, ISPConfig
Профиль установкиВеб + почтаМинимальный, Веб + почта, Полный или Свой. Профиль просто заранее отмечает компоненты, их можно поправить
Какую версию nginx собиратьstablemainline новее, но реже нужен
Набор возможностей nginxРекомендуемыйHTTP/3, Brotli, zstd и ускорения. Полный добавляет статистику трафика, Свой позволяет отметить модули вручную
Какой OpenSSL собирать3.5 LTS3.5 поддерживается до 2030 года, это лучший выбор для сервера, который не хочется трогать
Версии PHP8.3 и версия системыМожно отметить несколько, и какая из них будет по умолчанию. Добавить ещё одну потом можно командой luckyctl add-php
Компоненты серверапо профилюПочта, антиспам, DNS, FTP, phpMyAdmin, PostgreSQL, Node.js
Защита от атакCrowdSec + ufwCrowdSec с общими списками атакующих плюс ufw с закрытыми по умолчанию портами
Порт панели8080Любой свободный порт. Панель открывается только по имени сервера, по голому IP закрыта
Доступ к панели по IPпустоСвои постоянные IP через пробел. Пусто значит панель открыта всем, так делать не стоит
Порт SSHтекущийEnter оставляет тот порт, на котором SSH работает сейчас. Если поменять, смена произойдёт в самом конце, под защитой от потери доступа
Версия ISPConfignightlyСвежая сборка, надёжно ставится на новых PHP. Stable это официальный релиз, на новых PHP его автоустановка иногда не доходит до конца
Откуда ставить Roundcubeс сайта разработчиковТак приходит свежая версия, и её можно откатить. Из пакетов Debian старее, но обновляется вместе с системой
Бэкап и уведомлениябэкап в 03:30Каталог, сколько дней хранить, почта и Telegram для уведомлений

Итог перед установкой

После вопросов мастер сохраняет ответы в /etc/luckystack/setup.conf, показывает сводку и спрашивает, начинать ли установку. Если ответить нет, на сервере ничего не меняется: запустите luckyctl install ещё раз и поправьте нужный ответ.

Установка

Этапы

Установка идёт по этапам. Каждый завершённый этап отмечается, поэтому при сбое продолжить можно с того места, где остановились.

ЭтапТипЧто делает
preflightвсегдаИмя хоста, время, /etc/hosts, базовые пакеты, swap при нехватке памяти
databaseвсегдаMariaDB и Redis. Существующий пароль root не сбрасывается
webserverвсегдаСборка nginx из исходников
phpвсегдаPHP-FPM выбранных версий, OPcache, безопасные настройки
nodejsпо выборуNode.js LTS
phpmyadminпо выборуphpMyAdmin или Adminer, доступ только по имени сервера и списку IP
postgresqlпо выборуPostgreSQL рядом с MariaDB
mailпо выборуPostfix и Dovecot, вход только по TLS
rspamdпо выборуRspamd и ClamAV
dnsпо выборуBIND9 и шаблон зоны с SPF, DMARC и CAA
ftpпо выборуPureFTPd, только с шифрованием
sslвсегдаКлиент Let's Encrypt
securityпо выборуFirewall, fail2ban, харденинг SSH и ядра, автообновления безопасности
monitпо выборуMonit, перезапуск упавших служб
webmailпо выборуRoundcube
ispconfigвсегдаПанель ISPConfig и группа Дополнения
hostcertпо выборуНастоящий сертификат на имя сервера для панели и почты
rcpluginsпо выборуПлагины Roundcube: смена пароля, автоответ, фильтры прямо из почты
maildeliverпо выборуTLS для исходящей почты и подсказки по DNS-записям
mailsniпо выборуСвой сертификат почты у каждого домена
tuningпо выборуНастройка MariaDB, PHP и Postfix под память и процессор
backupпо выборуЕжедневный бэкап баз и конфигов
malwareпо выборуrkhunter и сканер вредоносного кода с письмом при находке

Если этап упал

Мастер пишет, на каком этапе остановился, и где смотреть журнал. Исправьте причину и продолжите:

luckyctl install --resume          # продолжить с первого незавершённого этапа
luckyctl install --only php        # выполнить ровно один этап
luckyctl install --from security   # начать с этапа и идти до конца

Если сборка nginx раз за разом падает, помогает чистая сборка без остатков прошлых попыток: luckyctl install --clean-build --only webserver.

Установка

Установка без вопросов

Если серверов несколько, ответы удобно записать в файл один раз. Сначала поставьте код без мастера командой bash server-setup.sh --install-code, затем положите setup.conf в /etc/luckystack/ (права 600) и запустите установку с ключом --unattended. Всё, чего нет в файле, берётся по умолчанию, пароли генерируются и сохраняются туда же.

# /etc/luckystack/setup.conf
SERVER_FQDN='server.example.com'
TIMEZONE='Europe/Moscow'
WEBSERVER='nginx'
NGINX_CHANNEL='stable'
OPENSSL_BRANCH='3.5'
PHP_VERSIONS='8.2 8.4 8.5'
PHP_DEFAULT='8.4'
FIREWALL='crowdsec'
CROWDSEC_WITH_UFW='y'
SSH_PORT='2222'
SSH_ALLOW_IPS='198.51.100.7 198.51.100.8'
ISPCONFIG_ADMIN_IPS='198.51.100.7 198.51.100.8'
ISPCONFIG_PANEL_PORT='3333'
BACKUP_TIME='03:30'
BACKUP_RETENTION_DAYS='14'
NOTIFY_EMAIL='admin@example.org'
luckyctl install --unattended

Полный список настроек в разделе Настройки setup.conf.

Работа с сервером

Команда luckyctl

Всё, что делается с сервером из консоли, делается одной командой. Её можно вызывать из любого каталога, справка по любой подкоманде открывается через luckyctl help <команда>.

Без команды luckyctl открывает главное меню с теми же действиями.

КомандаЧто делает
installМастер установки. С --resume, --only, --from, --unattended, --reconfigure, --clean-build
statusЧто установлено, каких версий и что ждёт обновления
checkПроверка здоровья: службы, порты, сертификаты, бэкапы, безопасность
log 100Последние строки журнала установщика
pathsГде лежат код, настройки, состояние и журнал
updateОбновить пакеты и заново наложить наши настройки. Ядро только по подтверждению
rollback nginxВернуть прошлую сборку nginx. Повтор отменяет откат
rollback roundcubeВернуть прошлую версию Roundcube вместе со схемой базы
rollback luckystackВернуть прошлый выпуск самого LuckyStack
backupСделать бэкап сейчас, backup list покажет снимки
restoreВосстановить из снимка: базы, конфиги, сайты, почту
add-php 8.5Добавить версию PHP, она сразу появится в списке у сайтов
remove-phpУдалить версию PHP. Не даст удалить ту, на которой есть сайты
timezone Europe/MoscowСменить часовой пояс везде: система, PHP, MariaDB, ISPConfig, cron
adoptПодключить бэкап, уведомления и защиту к серверу, собранному вручную
diagnosticsСобрать архив для разбора проблемы, без паролей и ключей
uninstallУдалить компоненты. Данные остаются, с --purge удаляются вместе с ними
self-updateПоставить последний выпуск LuckyStack с GitHub, прошлый остаётся для отката
versionКакая версия стоит, откуда взята, есть ли новая и что в ней изменилось

luckyctl status

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

root@server: luckyctl status
════════════════════════════════════════════════════════════════════════════════
             Состояние системы — установленные компоненты и версии
════════════════════════════════════════════════════════════════════════════════
┌─ ОС ─────────────────────────────────────────────────────────────────────────┐
│   Debian GNU/Linux 12 (bookworm)                                             │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Веб-сервер ─────────────────────────────────────────────────────────────────┐
│   nginx: 1.30.6 · active                                                     │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ PHP ────────────────────────────────────────────────────────────────────────┐
│   php7.4: PHP 7.4.33 · active                                                │
│   php8.2: PHP 8.2.35 · active                                                │
│   php8.4: PHP 8.4.27 · active                                                │
│   php8.5: PHP 8.5.12 · active                                                │
│   default php → PHP 8.4.27                                                   │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Базы данных ────────────────────────────────────────────────────────────────┐
│   MariaDB: 12.3.3-MariaDB · active                                           │
│   Redis: 7.0.15 · active                                                     │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Почта / антиспам ───────────────────────────────────────────────────────────┐
│   Postfix: 3.7.11 · active                                                   │
│   Dovecot: 2.3.19.1 · active                                                 │
│   Rspamd: 4.2.3 · active                                                     │
│   ClamAV: 1.4.6 · active                                                     │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Безопасность ───────────────────────────────────────────────────────────────┐
│   CrowdSec: v1.8.2 · active                                                  │
│   UFW: active                                                                │
│   fail2ban: 2 · active                                                       │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Обновления ─────────────────────────────────────────────────────────────────┐
│   Пакетов apt к обновлению: 0                                                │
│   ISPConfig: 3.3dev (nightly) → есть сборка от 2026-11-07                    │
└──────────────────────────────────────────────────────────────────────────────┘

Сокращено: убраны блоки со службами и админками БД.

luckyctl check

Проверяет сервер по пунктам и в конце пишет итог. ✓ значит всё хорошо, ! стоит посмотреть, ✗ что-то сломано. Та же проверка раз в шесть часов идёт в фоне, и когда появляется новая проблема, приходит уведомление.

root@server: luckyctl check
════════════════════════════════════════════════════════════════════════════════
                           Проверка здоровья сервера
════════════════════════════════════════════════════════════════════════════════
┌─ Сервисы ────────────────────────────────────────────────────────────────────┐
│   ✓ nginx (nginx): active                                                    │
│   ✓ MariaDB (mariadb): active                                                │
│   ✓ PHP-FPM 8.4 (php8.4-fpm): active                                         │
│   ✓ Postfix (postfix): active                                                │
│   ✓ CrowdSec (crowdsec): active                                              │
│   ✓ конфигурация nginx валидна (nginx -t)                                    │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Сетевые порты (LISTEN) ─────────────────────────────────────────────────────┐
│   ✓ порт 443 (web) слушается                                                 │
│   ✓ HTTP/3: nginx слушает UDP/443 (QUIC)                                     │
│   ✓ HTTP/3: UDP/443 открыт в ufw                                             │
│   ✓ чувствительные сервисы (БД/кэш) не торчат наружу (только localhost)     │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ TLS-сертификаты ────────────────────────────────────────────────────────────┐
│   ✓ панель ISPConfig: валиден (87 дн.) (Let's Encrypt)                      │
│   ✓ LE server.example.com: валиден (87 дн.)                                  │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Безопасность и бэкапы ──────────────────────────────────────────────────────┐
│   ✓ ufw включён и переживёт перезагрузку                                     │
│   ! SSH: вход по паролю разрешён (надёжнее только по ключу)                  │
│   ✓ серверный бэкап (БД и конфиги) по расписанию                             │
│   ! бэкапы только на этом диске, копии вне сервера нет                       │
│   ! почта (/var/vmail) в бэкап не входит                                     │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ Итог ───────────────────────────────────────────────────────────────────────┐
│   OK: 41   ВНИМАНИЕ: 5   ОШИБКА: 0                                           │
└──────────────────────────────────────────────────────────────────────────────┘
[!] Есть предупреждения (5) — посмотрите пункты с !.

Сокращено: из 46 пунктов показана часть. Код выхода 0, если ошибок нет, поэтому команду можно вызывать из своего мониторинга.

Работа с сервером

Панель Дополнения

Всё, что LuckyStack добавляет в ISPConfig, собрано в одной группе меню. Родные пункты ISPConfig остаются на своих местах, так что всегда видно, где своё, а где из коробки. Группа хранится в отдельном каталоге меню, поэтому обновление ISPConfig её не стирает.

Путь: System›Дополнения

Обслуживание сервера

Версии, проверки, обновление по пунктам, откат и настройки сборки nginx. Подробно ниже.

Уведомления

Почта и Telegram, какие события присылать, тихие часы, кнопка тестового сообщения.

Бэкап / Восстановление

Список снимков, бэкап по кнопке и восстановление выбранной части: базы, конфиги, сайты, почта.

Firewall IP-rules

Какие порты с каких адресов открыты. Заменяет родной Firewall ISPConfig, который умеет только открыть порт всем.

Блок-лист

Закрыть адрес или подсеть целиком, с комментарием, зачем.

Доверенные IP

Адреса, которые никогда не банятся ни CrowdSec, ни fail2ban. Свой офис, мониторинг.

CrowdSec

Кто сейчас забанен, за что и откуда, снятие бана одной кнопкой.

Fail2ban

Состояние jail'ов, список банов, разбан.

Node.js и Composer

Версии, обновление Composer, проверка зависимостей сайтов на известные уязвимости.

Заморозка vhost

Галочка в форме сайта. Ручные правки конфига nginx не пропадут, когда ISPConfig перегенерирует сайт.

Обслуживание сервера

Главная страница группы. Четыре вкладки, переключайте их прямо на примере ниже.

https://server.example.com:3333/index.php#admin/ss_maint.php
ISPConfigHomeClientSitesEmailDNSSystemToolsMonitor
System
CP Users
Server Config
Additional PHP Versions
Дополнения
Обслуживание сервера
Уведомления
Бэкап / Восстановление
Firewall IP-rules
Блок-лист
Доверенные IP
CrowdSec
Fail2ban
Node.js
Composer
Обслуживание сервера
ОС
Debian GNU/Linux 12 (bookworm), ядро 6.1.0-54
nginx
1.30.6, OpenSSL 3.5.9
MariaDB
12.3.3
ISPConfig
3.3dev (БД 107)
Roundcube
1.6.20
PHP
7.4, 8.2, 8.4, 8.5 · по умолчанию 8.4
Работает
1 день 15 часов
Проверки безопасности
!Нет двухфакторного входа у администраторов: admin. Включается в Tools › User Settings
✓PHP 8.5 поддерживается до 2029-12-31 (сайтов: 1)
✓OpenSSL 3.5.9 поддерживается до 2030-04-08
✓nginx: ограничения systemd, оценка 4.9 из 10
✓Все shell-пользователи ISPConfig в jail
!Файлов сайтов с записью для всех: 5Исправить права
Проверка здоровья
OK 41Внимание 5Ошибка 02026-11-07 12:46
!SSH: вход по паролю разрешён (надёжнее только по ключу)
!бэкапы только на этом диске, копии вне сервера нетНастроить
!почта (/var/vmail) в бэкап не входитВключить

Версии обновляются раз в 10 минут, проверка здоровья раз в 6 часов. Кнопки Обновить и Проверить сейчас запускают сбор вне очереди.

Пример экранаМакет страницы, собранный по данным тестового сервера. Настоящая страница выглядит в стиле ISPConfig, состав и тексты те же.

Как панель меняет сервер

Сама панель ISPConfig работает не от root и ничего на сервере не меняет. Когда вы нажимаете кнопку, панель записывает задание в таблицу. В течение минуты его забирает служебный скрипт, который работает от root, и выполняет только то, что есть в его коротком списке разрешённых действий.

  • Перед запуском установщика скрипт проверяет, что его файлы принадлежат root и никто другой не может их менять. Иначе задание отклоняется.
  • Если установщик уже работает, второе задание не стартует.
  • Перед обновлением nginx или ISPConfig делается бэкап. Если он не удался, обновление не начинается.
  • Каждое задание пишет свой журнал, его видно в панели, и итог приходит в уведомлениях.

Заморозка vhost

ISPConfig хранит конфиг сайта у себя и перезаписывает файл в /etc/nginx/sites-available при каждом сохранении сайта. Если вы правили конфиг руками, правки пропадают. Галочка Не обновлять vhost в форме сайта это исправляет: после перегенерации на место кладётся ваш вариант.

Путь: Sites›Website›Options›Не обновлять vhost

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

Работа с сервером

Обновления

Обновление из панели и командой luckyctl update идёт по одному пути. По умолчанию обновляются пакеты и наши настройки, ядро не трогается.

Шаг 1Бэкап

Только если выбрано ядро. Не удался бэкап, обновление не начинается.

Шаг 2Ядро

Сборка nginx, апдейтер ISPConfig. Новый nginx сначала проверяет ваш конфиг.

Шаг 3Наши правки

Всё, что затёр апдейтер ISPConfig, накладывается заново.

Шаг 4Отчёт

Итог в Telegram и на почту, журнал в панели.

Что обновляется всегда

  • Пакеты системы через apt.
  • Автообновления безопасности, sysctl, fail2ban, права на конфиги.
  • Шаблоны ISPConfig: HTTP/2, TLS 1.3 и HTTP/3 для панели и сайтов.
  • Ограничение доступа по IP: панель только по имени сервера, phpMyAdmin только со своих адресов.
  • Все панели группы Дополнения и регистрация версий PHP в ISPConfig.

Каждый пункт можно запускать сколько угодно раз. Если всё уже на месте, он так и напишет и ничего не тронет.

Ядро только по запросу

Пересборка nginx и обновление ISPConfig делаются только если вы их отметили в панели или подтвердили в консоли. Пароль root MariaDB и основные конфиги служб при обновлении не трогаются.

luckyctl update                     # спросит про каждую часть ядра
luckyctl update --dry-run           # показать план, ничего не меняя
luckyctl update nginx ispconfig     # обновить ядро без вопросов

Пример журнала обновления

Дополнения › Обслуживание сервера › задание 156
                           Режим обновления / патчей
[i] Ядро — nginx (пересборка) и ISPConfig (офиц. апдейтер) — обновляется ТОЛЬКО по явному запросу.
[i] Пароль root MariaDB и базовые конфиги служб НЕ трогаются.
[→] Обновление: Модернизация vhost панели/apps (http2/http3)
[i] vhost панели/apps уже современны (http2 on; + TLSv1.3) — изменений нет.
[i] UFW: UDP для QUIC/HTTP3 — панель 3333 только с 198.51.100.7 198.51.100.8, apps 3331 всем.
[→] Обновление: Регистрация версий PHP в ISPConfig
[✓] Версии PHP в ISPConfig: добавлено 0, синхронизировано 4.
[→] Обновление: Расширение firewall ISPConfig (IP-ограничения портов)
[i] В панель Firewall засеяно правил-источников: 5 (SSH/панель/MySQL). Существующие не тронуты.
[✓] Firewall ISPConfig расширен: модуль «Firewall IP-rules» (отдельные поля) + плагин (before.rules).
[→] Обновление: Заморозка vhost (галочка «Не обновлять vhost»)
[✓] Заморозка vhost развёрнута: галочка у сайта + плагин (restore frozen-vhost после регенерации).
[→] Обновление: Панель CrowdSec (активные баны + снятие)
[✓] Панель CrowdSec развёрнута (меню «Дополнения» → CrowdSec; кэш решений + очередь снятия + cron).
[→] Обновление: Composer (глобально)
[i] Composer уже установлен: Composer version 2.11.1 2026-10-30 14:52:10
...

Настоящий журнал задания из панели, сокращён. [→] начало шага, [✓] сделано, [i] пояснение, [!] предупреждение, [✗] ошибка.

Сбой одного шага не обрывает остальныеЕсли, например, не скачалась новая версия Roundcube, остальные шаги всё равно выполнятся, а в итоге будет написано, какой шаг не прошёл. Его можно повторить отдельно.
Работа с сервером

Откат

При каждом обновлении nginx и Roundcube прошлая версия остаётся рядом. Вернуть её можно кнопкой на вкладке Обновление или командой. Повторный откат возвращает новую версию обратно.

nginx

Прошлая сборка лежит как /usr/sbin/nginx.backup. Перед подменой она проверяет ваш текущий конфиг, и если не принимает его, откат отменяется, а nginx остаётся как был.

root@server: luckyctl rollback nginx
[→] Откат nginx: nginx/1.30.6 OpenSSL 3.5.9 → nginx/1.30.6 OpenSSL 4.1.0
[✓] nginx: откат выполнен, работает nginx/1.30.6 OpenSSL 4.1.0. Прошлая сборка теперь nginx/1.30.6 OpenSSL 3.5.9

Roundcube

Перед обновлением вебмейла сохраняются прошлый каталог, схема и дамп его базы. Если новая версия меняла схему, при откате база возвращается из дампа. Если после отката страница входа не открывается, всё возвращается на новую версию само.

root@server: luckyctl rollback roundcube
[→] Откат Roundcube 1.7.5 → 1.6.20
[✓] Roundcube: откат на 1.6.20 выполнен. Следующий --update снова предложит новую версию этой ветки.

ISPConfig и базы

У ISPConfig нет второй копии рядом, поэтому перед его обновлением делается полный бэкап баз и конфигов. Вернуться можно через восстановление из снимка, сделанного перед обновлением.

Защита и данные

Безопасность

То, что обычно включают после первого взлома, здесь включено сразу. Ниже по частям, что именно и почему.

Сеть и firewall

  • ufw закрывает все порты, кроме тех, что нужны выбранным службам. SSH и панель можно открыть только для своих IP.
  • CrowdSec читает журналы nginx, SSH и почты, банит перебор паролей и сканеры и получает общий список атакующих.
  • fail2ban дополнительно следит за SSH, почтой, FTP, панелью ISPConfig, Roundcube и входом в MariaDB.
  • Адреса из списка Доверенные IP никогда не банятся, чтобы случайно не закрыть себе доступ.
  • Чтобы не потерять сервер при правке SSH или firewall, рискованные изменения откатываются сами, если за несколько минут вы не подтвердили, что доступ остался.

Доступ

  • Панель открывается только по имени сервера. Запрос по IP получает пустой ответ, так сканеры не видят, что здесь ISPConfig.
  • На 443 по IP или чужому имени соединение обрывается ещё до сертификата, так по нему не узнать, какие сайты на сервере. На 80 по IP можно выбрать: стартовая страница сервера, переадресация на его имя или пустой ответ.
  • SSH: вход только по ключу (по желанию), без проброса портов и агента, свой порт.
  • Почта и FTP принимают пароль только по TLS.

PHP и сайты

  • Версия PHP не видна в заголовках, куки сессий недоступны из JavaScript.
  • OPcache у каждого сайта свой, один сайт не может прочитать код другого из кэша.
  • Shell-пользователи ISPConfig заперты в jail, проверка в панели напоминает, если это не так.
  • Файлы сайтов с правом записи для всех находятся при проверке, исправляются кнопкой.
  • Раз в сутки сайты проверяются на вредоносный код, при находке приходит письмо.

Ядро и службы

  • sysctl: защита от подмены маршрутов, SYN-флуда, утечек адресов ядра.
  • Короткие таймауты nginx против медленных атак: заголовок 15 секунд, тело и отправка 60.
  • По желанию ограничения systemd для nginx и MariaDB: только чтение системы, отдельный /tmp, без лишних прав ядра. Оценка systemd-analyze security с ними 4.9 у nginx и 5.7 у MariaDB, чем меньше, тем лучше. Если служба с ограничениями не стартует, они снимаются сами.
  • Шифрование: TLS 1.2 и 1.3, обмен ключами X25519MLKEM768, устойчивый к квантовым компьютерам, при поддержке браузером.
Что сделать самомуВключите двухфакторный вход для всех администраторов панели: Tools›User Settings. Без него пароль от панели остаётся единственной защитой всех сайтов.
Защита и данные

Бэкапы

Каждую ночь делается снимок: дамп всех баз, /etc и конфиги ISPConfig. По желанию в снимок входят сайты и почта. Старые снимки удаляются по сроку, но последние три остаются всегда.

Где и как часто

НастройкаПо умолчаниюКомментарий
BACKUP_DIR/var/backups/serverОтдельный каталог. Системные каталоги, /var/www и /var/vmail выбрать нельзя, это защита от случайного удаления
BACKUP_TIME03:30Время запуска
BACKUP_RETENTION_DAYS7Сколько дней хранить
BACKUP_INCLUDE_WWWnДобавить файлы сайтов
BACKUP_INCLUDE_MAILnДобавить почтовые ящики
BACKUP_REMOTE_TYPEnoneКопия на другой сервер: rsync по SSH или rclone в S3, B2 и SFTP

Команды

luckyctl backup                     # сделать снимок сейчас
luckyctl backup list                # список снимков
luckyctl restore                    # выбрать снимок и что восстановить

Сам бэкап делает скрипт /usr/local/sbin/server-backup.sh. Он работает и без LuckyStack, это удобно при восстановлении на новом сервере.

Восстановление

По умолчанию восстанавливаются только базы из последнего снимка. Остальное выбирается явно:

server-backup.sh --restore 20261107-033000 --db --etc
server-backup.sh --restore --all --yes

Восстановление перезаписывает текущие данные. Перед ним стоит сделать свежий снимок, на случай если выбрали не тот. Файлы сайтов восстанавливаются вместе с защитой, которую ISPConfig ставит на их каталоги, ничего снимать вручную не нужно.

ГотовитсяКопия на второй сервер в режиме только добавления: сервер может дописывать новые снимки, но не может удалить или переписать старые. Тогда даже взломанный сервер не уничтожит свои бэкапы.
Защита и данные

Уведомления и бот

Сервер сам сообщает о том, что требует внимания. Каналы: почта и Telegram, можно оба. Настраивается в панели: System›Дополнения›Уведомления.

О чём приходят сообщения

СобытиеКогда
monitorПоявилась новая проблема при проверке здоровья, закончился диск, скоро истекает сертификат, давно не было бэкапа, закончилось задание из панели
backupБэкап не удался
malwareСканер нашёл подозрительный файл
loginВход в панель или по SSH. По умолчанию только с адреса, с которого не входили 180 дней

О новой проблеме сообщение приходит один раз, а не при каждой проверке. В тихие часы, например с 23:00 до 08:00, сообщения в Telegram приходят без звука, кроме критичных: сбой бэкапа, находка антивируса.

Бот в Telegram

Если включить бота, ему можно писать команды. Отвечает он только чатам из списка в настройках. Действия, которые что-то меняют, нужно подтвердить кнопкой под сообщением, и каждое попадает в журнал панели.

КомандаЧто делает
/statusНагрузка, диск, память, какие службы не работают, когда был последний бэкап
/bansКто сейчас забанен в CrowdSec и fail2ban
/check 203.0.113.5Где забанен адрес и за что
/unban 203.0.113.5Снять бан с адреса
/allow 203.0.113.5 4Добавить адрес в доверенные на 4 часа, чтобы его не забанило. Без числа на сутки, 0 навсегда
/backupСделать бэкап сейчас
/helpСписок команд
[server.example.com] Новые проблемы на сервере: 1 Внимание: почта (/var/vmail) в бэкап не входит12:47
/status12:51
Сервер server.example.com Аптайм: 1 д 15 ч, нагрузка: 0.21 0.18 0.15 Диск /: 43%, память: 2310 из 3915 МБ Службы: все работают Бэкап: последний 0 дн. назад (2026-11-07 03:30) Перезагрузка: не нужна12:51

ПримерТексты сообщений как в коде бота, цифры условные.

Справочник

Настройки setup.conf

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

Сервер

КлючЗначенияЧто задаёт
SERVER_FQDNимяПолное имя сервера
TIMEZONEEurope/MoscowЧасовой пояс для всего
SERVER_HAS_IPV6y / nОпределяется сам, задавать нужно только чтобы отключить IPv6
TUNE_SWAPy / nСоздать swap-файл на сервере с малой памятью

Веб и PHP

КлючЗначенияЧто задаёт
WEBSERVERnginx / apacheВеб-сервер
NGINX_CHANNELstable / mainlineКакую ветку nginx собирать
NGINX_AUTO_VERSIONy / nБрать последнюю версию ветки или ту, что закреплена
OPENSSL_BRANCH3.5 / 4.1 / 4.0Ветка OpenSSL для nginx, по умолчанию 3.5 LTS
NGX_BROTLI, NGX_ZSTDy / nСжатие Brotli и zstd
NGX_QUIC_RETRYy / nПроверка адреса клиента для HTTP/3, защита от подмены адреса
NGX_TIGHT_TIMEOUTSy / nКороткие таймауты клиентов
HTTP_IP_POLICYlanding / redirect / denyЧто отдавать на 80 по IP или чужому имени: стартовую страницу, переадресацию на имя сервера или ничего
PHP_DEFAULT8.3Версия PHP по умолчанию для новых сайтов и служебных страниц
PHP_CLI_DEFAULTкак PHP_DEFAULTЧто запускается командой php в консоли и cron

Базы и почта

КлючЗначенияЧто задаёт
MARIADB_SOURCEofficial / debianMariaDB из её репозитория или из Debian
MARIADB_AUTO_VERSIONy / nПоследняя LTS или закреплённая версия
INSTALL_CLAMAVy / nАнтивирус для почты, требует около 1,5 ГБ памяти
RC_SOURCEupstream / debianОткуда ставить Roundcube
RC_BRANCH1.6 / 1.7Ветка Roundcube

Доступ и защита

КлючЗначенияЧто задаёт
FIREWALLcrowdsec / ufw / noneЧем защищаться
CROWDSEC_WITH_UFWy / nufw с закрытыми портами вместе с CrowdSec
SSH_PORTчислоПорт SSH
SSH_ALLOW_IPSIP через пробелС каких адресов пускать по SSH, пусто значит со всех
SSH_HARDENy / nВход только по ключу
ISPCONFIG_ADMIN_IPSIP через пробелС каких адресов открывается панель
ISPCONFIG_PANEL_PORTчислоПорт панели
PANEL_FQDN_ONLYy / nПанель только по имени, не по IP
FTP_TLS_REQUIREDy / nFTP только с шифрованием
SEC_SERVICE_HARDENy / nОграничения systemd для nginx и MariaDB
SEC_AUTO_UPDATES_3RDy / nАвтообновления безопасности и из сторонних репозиториев

Бэкап и уведомления

КлючЗначенияЧто задаёт
BACKUP_*см. БэкапыКаталог, время, срок хранения, что включать, копия наружу
NOTIFY_EMAILадреса через запятуюКуда слать письма
NOTIFY_TG_TOKENтокенТокен бота Telegram
NOTIFY_TG_CHATSid через пробелЧаты, куда слать и от кого принимать команды
NOTIFY_QUIET23:00-08:00Тихие часы
Справочник

Файлы и журналы

Код, настройки, состояние и журналы лежат раздельно. Поэтому обновление LuckyStack заменяет код и не трогает ваши настройки.

/opt/luckystack/releases/ выпуски кода, current указывает на рабочий /etc/luckystack/setup.conf ваши настройки и пароли, доступ только у root /var/lib/luckystack/ отметки пройденных этапов /var/log/luckystack/ журналы установки, обновлений и заданий панели /usr/local/sbin/luckyctl команда

Где всё лежит на конкретном сервере, покажет luckyctl paths.

Журналы

ФайлЧто в нём
/var/log/luckystack/setup.logПодробный журнал установки и обновлений. Пароли в нём замаскированы. Быстро посмотреть хвост: luckyctl log
/var/log/luckystack/panel/job-N.logЖурнал задания из панели, N это номер задания на вкладке Обновление
/var/backups/server/backup.logЖурнал всех запусков бэкапа
/var/log/server-tg-bot.logЖурнал бота Telegram
/var/log/nginx/Журналы nginx, у сайтов свои в /var/log/ispconfig/httpd/
journalctl -u crowdsecЧто и за что банит CrowdSec
Справочник

Решение проблем

Установка остановилась на одном из этапов

Посмотрите последние строки журнала, там будет строка с [✗] и причина:

grep -n '\[✗\]' /var/log/luckystack/setup.log | tail -5

Частые причины: не скачался архив с исходниками (сеть или зеркало), кончилась память при сборке, у хостера закрыт порт 25. После исправления запустите luckyctl install --resume, пройденные этапы повторяться не будут.

Панель не открывается

Проверьте три вещи по порядку:

  • Вы заходите по имени сервера, а не по IP. По IP панель ничего не отдаёт.
  • Ваш текущий IP есть в списке доступа. Если адрес сменился, добавьте его в панели Firewall IP-rules с другого адреса из списка, или с сервера: ufw allow from 203.0.113.5 to any port 8080 proto tcp (порт ваш, из мастера).
  • Адрес не забанен: cscli decisions list | grep 203.0.113.5. Снять бан: cscli decisions delete --ip 203.0.113.5.
После обновления nginx сайты не открываются

Сначала проверьте конфиг командой nginx -t. Если ошибка в конфиге, она будет в выводе. Если конфиг в порядке, а проблема в новой сборке, верните прошлую: luckyctl rollback nginx. Откат занимает секунды и сам проверяет, что прошлая сборка принимает ваш конфиг.

В панели задание пишет «установщик уже запущен»

Значит, обновление уже идёт: из консоли или другим заданием. Дождитесь окончания. Если вы уверены, что ничего не идёт, проверьте cat /run/luckystack-update.pid и есть ли такой процесс. После перезагрузки этот файл исчезает сам.

Задание пишет «небезопасные права или владелец»

Панель отказывается запускать установщик, если его файлы может менять кто-то кроме root. Обычно это следствие копирования через FTP или распаковки не от root. Исправить:

chown -R root:root /opt/luckystack
chmod -R go-w /opt/luckystack
Не приходят уведомления

Нажмите Тест на странице Уведомления. Если в Telegram пришло, а на почту нет, загляните в очередь почты mailq и в папку Спам. Для доставки на внешние ящики у домена отправителя должны быть DKIM и SPF, их можно включить в ISPConfig у почтового домена.

Нужна помощь

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

luckyctl diagnostics

Архив можно приложить к issue в репозитории на GitHub.

Справочник

Вопросы

Можно поставить на сервер, где уже есть сайты?

Мастер рассчитан на чистый сервер и остановится, если найдёт рабочую установку. Для сервера, собранного вручную по гайду Perfect Server, есть luckyctl adopt: сначала бэкап, потом подтверждение, и ставятся только бэкап, уведомления и защита. Ваш nginx, шаблоны и конфиги ISPConfig не трогаются.

Почему nginx собирается из исходников?

Пакетный nginx в Debian идёт без HTTP/3 и Brotli и со старым OpenSSL. Сборка даёт свежий nginx, OpenSSL с долгой поддержкой и только нужные модули. Обновлять её не сложнее, чем пакет: одна галочка в панели, а прошлая сборка остаётся для отката.

Обновление ISPConfig не сотрёт ваши правки?

Апдейтер ISPConfig действительно перезаписывает часть файлов. Поэтому после него LuckyStack заново накладывает свои правки, а меню Дополнения лежит в отдельном каталоге, который апдейтер не трогает.

Чем это отличается от ISPConfig Autoinstaller?

Autoinstaller ставит ISPConfig и пакеты из репозиториев, дальше сервер ваш. LuckyStack ставит сборку nginx, защиту и бэкапы, а главное остаётся с сервером дальше: обновляет, откатывает, проверяет и сообщает о проблемах.

Где хранятся пароли?

В setup.conf с доступом только для root. В журналы пароли не пишутся, при записи они маскируются.

Можно ли удалить LuckyStack и оставить сервер?

Да. Все службы обычные: nginx, PHP-FPM, MariaDB, ISPConfig. Если удалить LuckyStack, сервер продолжит работать, пропадут только наши панели, бэкап по расписанию и уведомления.

Справочник

Что дальше

Первый выпуск вышел: команда luckyctl, раскладка по /opt, /etc и /var, проверка на Debian 12 и 13, Ubuntu 22.04 и 24.04. Следом:

  • Полноценный Apache: те же защита, тюнинг и дополнения, что у nginx.
  • Установка одной командой через get.sh и подписанные выпуски, чтобы установка и self-update проверяли, что скачано именно то.
  • Копия бэкапов на второй сервер, которую нельзя удалить с основного.
  • Английский язык в консоли. Панели уже на двух языках.