Готовый веб- и почтовый сервер на 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
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. По желанию PostgreSQL
mariadb.org
Почта
Postfix и Dovecot, Rspamd и ClamAV, вебмейл Roundcube, DKIM, SPF и DMARC
apt / roundcube.net
Панель
ISPConfig 3.3 и группа Дополнения: 10 наших пунктов меню
ispconfig.org
Защита
CrowdSec с ufw, fail2ban, харденинг SSH, ядра и PHP, проверка на вредоносный код
apt
Сертификаты
Let's Encrypt для сайтов, панели и почты, продление само
acme.sh
Сопровождение
Ежедневный бэкап, уведомления на почту и в Telegram, проверка здоровья
свои скрипты
Начало
Быстрый старт
От пустого сервера до работающей панели. Дольше всего идёт сборка nginx, остальное ставится из пакетов.
Подготовьте имя сервера
Выберите полное имя, например server.example.com, и создайте у регистратора A-запись на IP сервера. По этому имени будет открываться панель, на него выпускается сертификат и с него уходит почта. Проверить, что запись уже работает:
# на своём компьютере
dig +short server.example.com
203.0.113.10
Зайдите на сервер по SSH ключом
Мастер предложит закрыть вход по паролю, поэтому ключ лучше положить заранее. Если ключа нет, создайте его командой ssh-keygen -t ed25519 и передайте на сервер через ssh-copy-id root@203.0.113.10.
Запустите установку
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 и дальше работает уже оттуда, скачанную папку можно удалить.
Ответьте на вопросы мастера
Почти везде можно просто нажимать Enter, значение по умолчанию подходит большинству. Подробно про каждый вопрос в разделе Мастер установки.
Откройте панель
В конце мастер покажет адрес панели и пароль администратора, а копию доступов положит в /root/server-access.txt. Панель открывается по имени сервера, порт выбирается в мастере, по умолчанию 8080:
https://server.example.com:8080
Если вы меняли SSH или включили firewall, мастер попросит подтвердить, что доступ к серверу не потерян: откройте второе окно, зайдите по SSH и выполните touch /run/luckystack-net-ok. Без подтверждения через 5 минут SSH и firewall сами вернутся к прежним настройкам.
Первым делом включите двухфакторный вход для admin и проверьте раздел Дополнения: там видно, что сервер в порядке.
Проверьте сервер
luckyctl check
Должно получиться без ошибок. Предупреждения нормальны для свежего сервера, например про отсутствие копии бэкапа на другом сервере. Как выглядит вывод, показано в разделе luckyctl check.
Начало
Требования
Нужен чистый сервер: свежая установка ОС, без панелей и без сайтов. На занятый сервер мастер не пойдёт, для него есть отдельный режим подключения.
Что
Минимум
Комментарий
ОС
Debian 12 или 13, Ubuntu 22.04 или 24.04
На всех четырёх проверено установкой с нуля, перезагрузкой, сайтами, почтой и восстановлением из бэкапа
Память
2 ГБ
С ClamAV лучше 4 ГБ. На малой памяти мастер сам предложит swap или отказаться от ClamAV
Диск
20 ГБ
Плюс место под сайты, почту и бэкапы
Сеть
публичный IPv4
IPv6 подхватывается сам, если на сервере есть глобальный адрес и маршрут
Порт 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 собирать
stable
mainline новее, но реже нужен
Набор возможностей nginx
Рекомендуемый
HTTP/3, Brotli, zstd и ускорения. Полный добавляет статистику трафика, Свой позволяет отметить модули вручную
Какой OpenSSL собирать
3.5 LTS
3.5 поддерживается до 2030 года, это лучший выбор для сервера, который не хочется трогать
Версии PHP
8.3 и версия системы
Можно отметить несколько, и какая из них будет по умолчанию. Добавить ещё одну потом можно командой luckyctl add-php
CrowdSec с общими списками атакующих плюс ufw с закрытыми по умолчанию портами
Порт панели
8080
Любой свободный порт. Панель открывается только по имени сервера, по голому IP закрыта
Доступ к панели по IP
пусто
Свои постоянные IP через пробел. Пусто значит панель открыта всем, так делать не стоит
Порт SSH
текущий
Enter оставляет тот порт, на котором SSH работает сейчас. Если поменять, смена произойдёт в самом конце, под защитой от потери доступа
Версия ISPConfig
nightly
Свежая сборка, надёжно ставится на новых PHP. Stable это официальный релиз, на новых PHP его автоустановка иногда не доходит до конца
Откуда ставить Roundcube
с сайта разработчиков
Так приходит свежая версия, и её можно откатить. Из пакетов Debian старее, но обновляется вместе с системой
Бэкап и уведомления
бэкап в 03:30
Каталог, сколько дней хранить, почта и Telegram для уведомлений
Итог перед установкой
После вопросов мастер сохраняет ответы в /etc/luckystack/setup.conf, показывает сводку и спрашивает, начинать ли установку. Если ответить нет, на сервере ничего не меняется: запустите luckyctl install ещё раз и поправьте нужный ответ.
Установка
Этапы
Установка идёт по этапам. Каждый завершённый этап отмечается, поэтому при сбое продолжить можно с того места, где остановились.
Этап
Тип
Что делает
preflight
всегда
Имя хоста, время, /etc/hosts, базовые пакеты, swap при нехватке памяти
database
всегда
MariaDB и Redis. Существующий пароль root не сбрасывается
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. Всё, чего нет в файле, берётся по умолчанию, пароли генерируются и сохраняются туда же.
Всё, что делается с сервером из консоли, делается одной командой. Её можно вызывать из любого каталога, справка по любой подкоманде открывается через luckyctl help <команда>.
Без команды luckyctl открывает главное меню с теми же действиями.
Команда
Что делает
install
Мастер установки. С --resume, --only, --from, --unattended, --reconfigure, --clean-build
status
Что установлено, каких версий и что ждёт обновления
Подключить бэкап, уведомления и защиту к серверу, собранному вручную
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 перегенерирует сайт.
Обслуживание сервера
Главная страница группы. Четыре вкладки, переключайте их прямо на примере ниже.
Roundcube: прошлая версия 1.7.5 (2026-11-06 15:23)Откатить Roundcube
Задания
#
Действие
Итог
Время
157
обновление
ошибка установщик уже запущен, повторите позже
18:43:42
156
обновление
готово завершено, журнал 117 строк
18:43:38
154
обновление
ошибка небезопасные права или владелец: lib/update.sh
18:43:26
Задания с ошибкой выше настоящие: так панель отказывается запускать установщик, если он уже работает или если кто-то кроме root может менять его файлы.
Настройки применяются при следующем обновлении соответствующей части.
Ветка OpenSSL для nginx3.5 LTS ▾
Канал nginxstable ▾
Ветка Roundcube1.6 ▾
Модули nginx
✓Brotliиспользуется в конфигах
✓zstdиспользуется в конфигах
✓headers-more
✓cache_purge
VTSстатистика трафика
✓jemalloc
Защита
✓Ограничения systemd для nginx и MariaDB
✓Короткие таймауты nginx
✓Автообновления из сторонних репозиториев
✓FTP только с шифрованием
Почта для писем безопасности ISPConfigadmin@example.org
Сохранить
Когда
Кто
Панель
Действие
Подробности
2026-11-06 18:43
admin
maint
update
backup notify
2026-11-06 18:43
admin
maint
save
OPENSSL_BRANCH=4.1 NGX_VTS=y
2026-11-06 18:43
admin
maint
healthcheck
2026-11-06 18:19
admin
vhost_freeze
apply
site1.example.org
2026-11-06 15:55
admin
vhost_freeze
import
freeze-test.example.org
В журнал попадает каждое действие во всех панелях группы: кто, когда и с какими параметрами.
Пример экранаМакет страницы, собранный по данным тестового сервера. Настоящая страница выглядит в стиле 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 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_TIME
03:30
Время запуска
BACKUP_RETENTION_DAYS
7
Сколько дней хранить
BACKUP_INCLUDE_WWW
n
Добавить файлы сайтов
BACKUP_INCLUDE_MAIL
n
Добавить почтовые ящики
BACKUP_REMOTE_TYPE
none
Копия на другой сервер: rsync по SSH или rclone в S3, B2 и SFTP
Команды
luckyctl backup # сделать снимок сейчас
luckyctl backup list # список снимков
luckyctl restore # выбрать снимок и что восстановить
Сам бэкап делает скрипт /usr/local/sbin/server-backup.sh. Он работает и без LuckyStack, это удобно при восстановлении на новом сервере.
Восстановление
По умолчанию восстанавливаются только базы из последнего снимка. Остальное выбирается явно:
Восстановление перезаписывает текущие данные. Перед ним стоит сделать свежий снимок, на случай если выбрали не тот. Файлы сайтов восстанавливаются вместе с защитой, которую 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
имя
Полное имя сервера
TIMEZONE
Europe/Moscow
Часовой пояс для всего
SERVER_HAS_IPV6
y / n
Определяется сам, задавать нужно только чтобы отключить IPv6
TUNE_SWAP
y / n
Создать swap-файл на сервере с малой памятью
Веб и PHP
Ключ
Значения
Что задаёт
WEBSERVER
nginx / apache
Веб-сервер
NGINX_CHANNEL
stable / mainline
Какую ветку nginx собирать
NGINX_AUTO_VERSION
y / n
Брать последнюю версию ветки или ту, что закреплена
OPENSSL_BRANCH
3.5 / 4.1 / 4.0
Ветка OpenSSL для nginx, по умолчанию 3.5 LTS
NGX_BROTLI, NGX_ZSTD
y / n
Сжатие Brotli и zstd
NGX_QUIC_RETRY
y / n
Проверка адреса клиента для HTTP/3, защита от подмены адреса
NGX_TIGHT_TIMEOUTS
y / n
Короткие таймауты клиентов
HTTP_IP_POLICY
landing / redirect / deny
Что отдавать на 80 по IP или чужому имени: стартовую страницу, переадресацию на имя сервера или ничего
PHP_DEFAULT
8.3
Версия PHP по умолчанию для новых сайтов и служебных страниц
PHP_CLI_DEFAULT
как PHP_DEFAULT
Что запускается командой php в консоли и cron
Базы и почта
Ключ
Значения
Что задаёт
MARIADB_SOURCE
official / debian
MariaDB из её репозитория или из Debian
MARIADB_AUTO_VERSION
y / n
Последняя LTS или закреплённая версия
INSTALL_CLAMAV
y / n
Антивирус для почты, требует около 1,5 ГБ памяти
RC_SOURCE
upstream / debian
Откуда ставить Roundcube
RC_BRANCH
1.6 / 1.7
Ветка Roundcube
Доступ и защита
Ключ
Значения
Что задаёт
FIREWALL
crowdsec / ufw / none
Чем защищаться
CROWDSEC_WITH_UFW
y / n
ufw с закрытыми портами вместе с CrowdSec
SSH_PORT
число
Порт SSH
SSH_ALLOW_IPS
IP через пробел
С каких адресов пускать по SSH, пусто значит со всех
SSH_HARDEN
y / n
Вход только по ключу
ISPCONFIG_ADMIN_IPS
IP через пробел
С каких адресов открывается панель
ISPCONFIG_PANEL_PORT
число
Порт панели
PANEL_FQDN_ONLY
y / n
Панель только по имени, не по IP
FTP_TLS_REQUIRED
y / n
FTP только с шифрованием
SEC_SERVICE_HARDEN
y / n
Ограничения systemd для nginx и MariaDB
SEC_AUTO_UPDATES_3RD
y / n
Автообновления безопасности и из сторонних репозиториев
Бэкап и уведомления
Ключ
Значения
Что задаёт
BACKUP_*
см. Бэкапы
Каталог, время, срок хранения, что включать, копия наружу
NOTIFY_EMAIL
адреса через запятую
Куда слать письма
NOTIFY_TG_TOKEN
токен
Токен бота Telegram
NOTIFY_TG_CHATS
id через пробел
Чаты, куда слать и от кого принимать команды
NOTIFY_QUIET
23: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
Справочник
Решение проблем
Установка остановилась на одном из этапов
Посмотрите последние строки журнала, там будет строка с [✗] и причина:
Частые причины: не скачался архив с исходниками (сеть или зеркало), кончилась память при сборке, у хостера закрыт порт 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. Исправить:
Нажмите Тест на странице Уведомления. Если в Telegram пришло, а на почту нет, загляните в очередь почты mailq и в папку Спам. Для доставки на внешние ящики у домена отправителя должны быть DKIM и SPF, их можно включить в ISPConfig у почтового домена.
Нужна помощь
Соберите архив диагностики. В нём версии, состояние служб, настройки и хвосты журналов, пароли и токены из них вырезаются:
Мастер рассчитан на чистый сервер и остановится, если найдёт рабочую установку. Для сервера, собранного вручную по гайду 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 проверяли, что скачано именно то.
Копия бэкапов на второй сервер, которую нельзя удалить с основного.
Английский язык в консоли. Панели уже на двух языках.