О панели
Самое дорогое — не ошибка на экране, а молчание
Зелёная плашка на непроизошедшем стоит дороже честного отказа: по ней человек уходит спокойным, а копии нет, сертификат не выпущен, правило файрвола не применилось. Эта страница — про то, как устроена панель и какие правила из этого выросли.
Откуда взялась
Панель на сервере знает только свой сервер
Панели живут внутри машины, и это их устройство, а не недостаток: они решают задачу одной машины и решают её хорошо. Только у того, кто ведёт парк, задача другая.
Ему нужно знать, что происходит на восемнадцати машинах разом; выдать сотруднику доступ к одной из них, не отдав остальные; увидеть трафик всех клиентов одним отчётом; вернуть файл на машине, которую он не поднимал. Внутри одной машины этих ответов нет физически — лицензия и права кончаются на её границе.
Поэтому панель стоит снаружи парка, а на машинах живёт тонкий агент. Он не исполняет произвольных команд: умеет около сорока типизированных действий и выполняет подписанные рецепты, которые хранятся в панели. Соединение он открывает сам, наружу — на сервере не открыт ни один входящий порт для панели.
Панель
данные, права, деньги и рецепты
Агент
типизированные действия, подписи
Шина
очередь, которая доезжает позже
Операция, отправленная на выключенную машину, стоит в долговечной очереди и выполняется, когда машина включится. Это проверено остановкой агента, а не рассуждением о том, как оно должно работать.
Что значит «работает»
Проверено значит сверено на самой машине
У нас «работает» — это не «тесты зелёные». Это: действие выполнено через интерфейс панели на настоящем сервере, а результат сверен на самой машине. Зелёное сообщение в панели проверкой не считается — оно и есть то, что чаще всего врёт.
Чем сверяем
- ssh файл, права, служба — глазами на машине
- curl снаружи сайт отвечает из другой сети, а не из localhost
- mysql строка в базе, версия, выданные права
- crontab задание действительно легло владельцу
- sha256 вернувшийся из копии файл — тот же, что был
Что это даёт
Почти все дефекты, которые мы находили, не падали. Они показывали благополучие: операция отмечалась выполненной, а на машине не менялось ничего. Тесты такое пропускают — они спрашивают код, а не сервер.
Поэтому в нашем описании состояния у каждой возможности стоит не галочка, а строка «как проверено»: с датой, адресом машины и тем, чем сверяли. Где живой проверки не было, так и написано — «живьём не проверялось».
Правило продукта
Панель говорит «принято», а не «готово»
Между нажатием кнопки и изменением на сервере всегда есть расстояние: очередь, шина, ожидание другой операции на том же ресурсе. Пока расстояние не пройдено, «готово» — ложь.
Как делать нельзя
«Сертификат выпущен»
Сказано в тот момент, когда операция только поставлена в очередь. Человек закрывает вкладку. Через минуту центр сертификации отказывает, и об этом не знает никто.
Как у нас
«Принято · идёт · чем кончилось»
Операция уходит в журнал с ходом построчно в браузер. Итог — отдельным словом, с причиной отказа, если он был. Ждущая операция так и говорит: «Ждёт: идёт „Создание сайта“ (№ 58)».
Из этого же правила
- Неполнота названа вслух и стоит перед итогом, а не под катом: в отчёте по трафику видно, какая машина молчит и у какой данные отстали на 36 часов.
- Сайт без обращений остаётся строкой с нулём и пометкой «за период обращений не было» — он не исчезает из отчёта, оставляя его красивым.
- Канал уведомлений без ключей честно пишет «не настроено», а не делает вид, что письмо ушло.
- Копия считается готовой только после того, как её скачали обратно, расшифровали и сверили число таблиц.
Отказ — это тоже работа
Когда нельзя, панель объясняет почему
Молча сделать опасное — худший из возможных ответов. Второй по вреду — молча не сделать. Поэтому отказ у нас называет причину и, где можно, обход.
Кривая директива nginx
Проверка не прошла — файл возвращён, причина на экране, сайт продолжает отвечать.
Удаление сервера с сайтами
Отказ с перечнем того, что мешает: сайты, базы, пользователи. Назвать, а не удалить вместе с ними.
Выключение входа по паролю SSH
Если ни у root, ни у пользователей нет ключа, агент отказывает: иначе машина закрылась бы от владельца.
Правило, оставляющее SSH открытым не всем
Требует отметки «понимаю», и порт проверяют оба — панель и агент, по тому, что sshd слушает на самом деле.
Понижение версии MySQL
Нечем, и на экране объяснено почему, а не спрятано серой кнопкой.
Оплата картой, пока ключи не подключены
Отказ словами: «приём оплаты не подключён, счёт можно оплатить по реквизитам». Счёт закрывается вручную.
Там, где отказ невозможен, стоит страховка. Правила файрвола применяются с таймером отката: панель взводит его до правки и 45 секунд ждёт подтверждения связи. Не подтвердилась — через минуту прежнее состояние вернёт таймер системы, даже если агент уже мёртв.
Безопасность подробнееЧестно
Что ещё не готово
Перечень живёт рядом с кодом и правится тем же изменением. Он уже один раз врал — описывал как дыры давно сделанное — и поэтому был переписан со сверкой каждой строки. Такой перечень опаснее пустого: по нему чинят сделанное и доверяют сломанному.
Нет вовсе
-
Список разрешённых адресов для входа в панель
Есть только защита от перебора. Механизм целиком зависит от правильных доверенных прокси, и выкладывать его вслепую хуже, чем не иметь: он либо не сработает, либо запрёт всех.
-
Выдача запроса на подпись (CSR) наружу
Панель собирает его только внутри своего выпуска сертификата. Отдать тело запроса для чужого центра сертификации пока нечем.
-
Вторая панель наготове
Восстановление — подъём из проверенной копии, десятки минут. Осознанный обмен: простой кабинета не роняет сайты клиентов.
-
Отдельная копия базы без сайта
Дамп базы едет внутри копии сайта, в том же зашифрованном архиве. Снять только базу, не трогая файлы, пока нечем.
Написано, но живьём не проверено
-
Почта клиентов и свой DNS
Сделаны целиком — ящики, подписи DKIM, доставляемость, своя веб-почта. На боевой машине ни одна не сделана ни почтовой, ни сервером имён.
-
Выпуск сертификата через запись в DNS
Свой клиент ACME написан, но живым центром сертификации путь не проходили: по DNS не выпущен ни один сертификат.
-
Сверка баз, доступов FTPS и заданий планировщика с машиной
Механизм есть и данные с машин приходят, но живой сверкой его не проверяли ни разу.
-
Подъём панели с нуля по плану восстановления
Команды плана сверены с выкладкой (до этого они не работали вовсе), но целиком порядок живым подъёмом не проходили.
Сделано наполовину
-
Шина одним узлом
Падение узла останавливает операции, и так и сказано на экране состояния. Кластер включается одним действием, но что он переживает падение узла, без трёх машин проверить нечем.
-
Возврат копии «в свою базу»
Таблицы из копии заменяют нынешние, а появившиеся после копии остаются — база выходит смесью двух. Это сказано на экране и назван обход: нужна база ровно как в копии — восстановить в новую.
-
Подтверждение падения сайта при одной машине в парке
Панель стала вторым свидетелем — стучит в порт. Но если закрыты все порты, вердикт по-прежнему «не подтверждено»: одним свидетелем «машина мертва» и «сети нет у панели» не различить.
-
Письма самой панели
Отправка не настроена: подтверждение адреса и сброс пароля не уезжают. Экраны так и говорят «письмо не уйдёт» и зовут в «Поддержку».
Есть и решения, которые выглядят как дыры, но дырами не являются. Сервер нельзя передать в другую организацию: она зашита в конфигурацию агента и в права на шине, а не в одно поле панели — машину отдают, подключая её заново в кабинете клиента. Три узла шины на одной машине мы не ставим: они умрут вместе с ней. Такое объясняется на месте, а не замалчивается.
Проверьте сами на одной машине
Подключите сервер, соберите сайт и сверьте результат на самой машине — ровно так, как это делаем мы.